本文分享自华为云社区《华为云IoT端到端灰度发布实现平稳升级,保障海量用户业务稳定》,作者: 张俭。

华为云IoTDA服务是华为云物联网的一个核心底座服务,提供海量设备连接上云、设备和云端双向消息通信、数据流转以及设备联动规则等能力。华为云IoT采用微服务架构,下图为华为云IoTDA微服务全景图。

image.png

华为云IoTDA目前已在多个Region上线,运行数十个实例,支撑着海量用户的物联网业务,并且业务量持续增长。如何能在确保服务水平协议(SLA)的前提下快速上线发布新特性,最小化程序Bug对客户的影响,成为了华为云IoT重点保障任务之一。

常见发布模式

重建发布

重建部署在传统的进程部署环境中较为常见,通常是先停止老的进程,再启动新的进程。这会导致长时间的中断,引起客户的业务受损。

滚动更新发布

滚动更新,相比于重建发布模式,搭配”优雅”启停,可以实现无停机更新。但是如果代码中存在测试阶段未发现的问题,将会影响全量的用户,回退时间也较长。

灰度发布

灰度发布允许向一小部分用户提供新版本,进而在整个用户群中逐步推出新功能。在灰度发布模式下,新旧版本的服务并存,通过一定的规则,逐步增加新版本服务接管的流量比例。如果新版本中存在测试阶段未发现的问题,灰度发布策略可以限制影响范围,并允许迅速切换回老版本,从而保证系统的稳定性。此外,灰度切换的比例过程可以灵活控制,如果需要长时间的浸泡,可以充分观察新版本上线后实际运行的表现。

在设计灰度发布方案之前,需要考虑几个关键决策点:

  1. 灰度的组件边界:灰度发布需要在请求的最前端进行标记(通常称为染色),确保通过某种机制对请求进行识别,以便进行适当的路由分发。这意味着最前端组件自身不具备灰度功能,因此必须确定灰度发布的操作边界。
  2. 灰度的功能范围:需要确定哪些系统组件将进行灰度,如微服务调用、消息中间件通信等。对于需要灰度的持久化组件,需要根据灰度维度分配不同的资源。例如,根据用户ID进行灰度可能涉及为不同的用户分配不同的topic或数据库。这种方式虽然实现简单,但资源消耗较大。一般不会对数据库存储进行灰度,以避免设计上的复杂性和数据合并问题(数据库表结构还是要谨慎设计,谨慎升级)。
  3. 灰度的维度:灰度维度可以是多样的,如用户ID、地域、年龄等,通常需要与产品经理共同决策。

业内还有一些与灰度发布密切相关的术语,如金丝雀发布、A/B测试和蓝绿。

金丝雀发布,A/B测试属于特殊的灰度发布模式。金丝雀就是将友好客户、测试客户作为灰度的维度,而A/B测试的维度可能更加灵活,比如Cookie信息、地理位置信息、请求参数等。另外,蓝绿通常指蓝绿部署,是一种通过同时运行两个相同的生产环境来快速切换或回滚版本的部署模式。

下文将详细介绍华为云IoT采用的灰度发布方案。

华为云IoT灰度方案介绍

华为云IoT的灰度方案:基于用户ID维度灰度,组件上支持微服务调用、以及部分消息中间件Topic的灰度,除了网关、数据库外的组件都支持灰度。

在此方案中,Apache ServiceComb扮演了关键角色。作为一个稳定且高可用的微服务引擎,ServiceComb支持多种功能,包括配置中心、注册中心以及灰度网关,使其成为华为云IoT灰度发布策略的核心组件。

一个简单的从网关开始的微服务调用灰度流程如下:

image.png

  • 流量入口:所有流量首先经过ELB,然后到达ServiceComb网关。
  • 网关分发:ServiceComb网关根据配置的灰度规则,决定流量应该被路由到哪个服务版本。这包括可以根据用户的ID或其他标识将流量分配给不同的服务版本,如图中的Consumer V1和Consumer V2。
  • 微服务调用:染色信息会继续传递,这确保了整个请求处理过程中,所有微服务组件都能根据这些染色信息并调用到正确的微服务实例。
  • 服务版本并存:在Kubernetes环境中,不同版本的服务并存。这允许新旧版本的服务能够同时处理请求,但针对的用户群不同,实现灰度发布的目标。

如果涉及到灰度的消息中间件Topic,会按照用户的id作为topic的后缀,灰度服务和老服务分别订阅不同的topic,来实现业务的灰度。

image.png

灰度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引起的后果。

点击关注,第一时间了解华为云新鲜技术~

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐