华为云 IoT 端到端灰度发布,如何实现海量用户业务平稳过渡升级
本文分享自华为云社区《华为云IoT端到端灰度发布实现平稳升级,保障海量用户业务稳定》,作者: 张俭。
华为云 IoTDA 服务是华为云物联网的一个核心底座服务,提供海量设备连接上云、设备和云端双向消息通信、数据流转以及设备联动规则等能力。华为云 IoT 采用微服务架构,下图为华为云 IoTDA 微服务全景图。
华为云 IoTDA 目前已在多个 Region 上线,运行数十个实例,支撑着海量用户的物联网业务,并且业务量持续增长。如何能在确保服务水平协议(SLA)的前提下快速上线发布新特性,最小化程序 Bug 对客户的影响,成为了华为云 IoT 重点保障任务之一。
常见发布模式
重建发布
重建部署在传统的进程部署环境中较为常见,通常是先停止老的进程,再启动新的进程。这会导致长时间的中断,引起客户的业务受损。
滚动更新发布
滚动更新,相比于重建发布模式,搭配”优雅”启停,可以实现无停机更新。但是如果代码中存在测试阶段未发现的问题,将会影响全量的用户,回退时间也较长。
灰度发布
灰度发布允许向一小部分用户提供新版本,进而在整个用户群中逐步推出新功能。在灰度发布模式下,新旧版本的服务并存,通过一定的规则,逐步增加新版本服务接管的流量比例。如果新版本中存在测试阶段未发现的问题,灰度发布策略可以限制影响范围,并允许迅速切换回老版本,从而保证系统的稳定性。此外,灰度切换的比例过程可以灵活控制,如果需要长时间的浸泡,可以充分观察新版本上线后实际运行的表现。
在设计灰度发布方案之前,需要考虑几个关键决策点:
灰度的组件边界:灰度发布需要在请求的最前端进行标记(通常称为染色),确保通过某种机制对请求进行识别,以便进行适当的路由分发。这意味着最前端组件自身不具备灰度功能,因此必须确定灰度发布的操作边界。
灰度的功能范围:需要确定哪些系统组件将进行灰度,如微服务调用、消息中间件通信等。对于需要灰度的持久化组件,需要根据灰度维度分配不同的资源。例如,根据用户 ID 进行灰度可能涉及为不同的用户分配不同的 topic 或数据库。这种方式虽然实现简单,但资源消耗较大。一般不会对数据库存储进行灰度,以避免设计上的复杂性和数据合并问题(数据库表结构还是要谨慎设计,谨慎升级)。
灰度的维度:灰度维度可以是多样的,如用户 ID、地域、年龄等,通常需要与产品经理共同决策。
业内还有一些与灰度发布密切相关的术语,如金丝雀发布、A/B 测试和蓝绿。
金丝雀发布,A/B 测试属于特殊的灰度发布模式。金丝雀就是将友好客户、测试客户作为灰度的维度,而 A/B 测试的维度可能更加灵活,比如 Cookie 信息、地理位置信息、请求参数等。另外,蓝绿通常指蓝绿部署,是一种通过同时运行两个相同的生产环境来快速切换或回滚版本的部署模式。
下文将详细介绍华为云 IoT 采用的灰度发布方案。
华为云 IoT 灰度方案介绍
华为云 IoT 的灰度方案:基于用户 ID 维度灰度,组件上支持微服务调用、以及部分消息中间件 Topic 的灰度,除了网关、数据库外的组件都支持灰度。
在此方案中,Apache ServiceComb 扮演了关键角色。作为一个稳定且高可用的微服务引擎,ServiceComb 支持多种功能,包括配置中心、注册中心以及灰度网关,使其成为华为云 IoT 灰度发布策略的核心组件。
一个简单的从网关开始的微服务调用灰度流程如下:
流量入口:所有流量首先经过 ELB,然后到达 ServiceComb 网关。
网关分发:ServiceComb 网关根据配置的灰度规则,决定流量应该被路由到哪个服务版本。这包括可以根据用户的 ID 或其他标识将流量分配给不同的服务版本,如图中的 Consumer V1 和 Consumer V2。
微服务调用:染色信息会继续传递,这确保了整个请求处理过程中,所有微服务组件都能根据这些染色信息并调用到正确的微服务实例。
服务版本并存:在 Kubernetes 环境中,不同版本的服务并存。这允许新旧版本的服务能够同时处理请求,但针对的用户群不同,实现灰度发布的目标。
如果涉及到灰度的消息中间件 Topic,会按照用户的 id 作为 topic 的后缀,灰度服务和老服务分别订阅不同的 topic,来实现业务的灰度。
灰度 Topic 会按照用户 ID 进行划分,如 topic-user1、topic-user2、和 topic-user3。非灰度 Topic 则只有一个 topic。左图还未开启灰度发布,所有的消息都从网关到达 ProducerV1,也都由 ConsumerV1 进行处理。 当开启灰度发布时,如部署了 ProducerV2 和 ConsumerV2,并且配置它们灰度处理 user1 之后,对于灰度 topic,ProducerV2 将从网关处接管 user1 的消息,并发送到 topic-user1,而 ConsumerV1 也会不处理 user1 的 topic,交由 ConsumerV2 来处理;对于非灰度 topic,ConsumerV2 和 ConsumerV1 共同处理。此处仅做示例,实际不一定需要同时灰度生产者和消费者,可以仅针对其中一者灰度。
总结
华为云 IoT 通过灰度发布方案,使得在数个 region、数十个实例、业务不断增长的情况下,可以从测试用户开始,到友好客户,再对商用客户进行分批升级,最大程度降低程序升级后 bug 引起的后果。
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/11daed1b5b3ea0150efb84b61】。文章转载请联系作者。
评论