如果您在使用金丝雀发布、全链路灰度以及开发环境隔离等场景中需要使用到消息的灰度,那么您需要开启消息灰度的功能。目前,SAE 只支持 RocketMQ 类型的消息灰度。
背景信息
虽然绝大多数业务场景下对于消息的灰度的要求并不像RPC的要求得这么严格,但是在以下两个场景中,还是会对消息的全链路有一定的诉求。
当消息的消费逻辑进行了修改时,这时候希望通过小流量的方式来验证新的消息消费逻辑的正确性,这时会对消息的灰度有诉求。
在消息消费时,可能会产生新的RPC调用,如果没有在消息这一环遵循之前设定好的全链路流量控制的规则,会导致通过消息产生的这部分流量“逃逸”,从而导致全链路灰度的规则遭到破坏,导致出现不符合预期的情况。
全链路灰度流程概览
在 SAE 进行全链路灰度, 对涉及到的应用都开启“微服务治理”。
创建应用:在需要灰度的基线应用下创建好灰度应用。
开启消息灰度:为灰度应用开启消息灰度(基线应用开启后,灰度应用会同步打开)。本文重点讲解如何开启消息灰度。
创建泳道组:入口类型选择 Java 服务网关或 MSE 云原生网关,泳道组涉及应用选择所有涉及到的应用。
创建分流泳道:配置路由规则选择为按比例灰度,建议流量比例设置为 50% 。
若需要使用全链路灰度,请参见全链路灰度。
注意事项
使用限制
全链路灰度仅适用于2023年11月08日起新建的微服务应用。
全链路灰度功能仅支持在新版控制台中使用。
由于消息灰度是基于全链路灰度功能实现,因此不推荐已经加入全链路灰度的使用消息灰度的应用配置金丝雀发布和标签路由规则。
使用说明
使用此功能您无需修改应用的代码和配置。
消息类型目前只支持 RocketMQ,包含开源版本和阿里云商业版。
如果您使用开源 RocketMQ,则 RocketMQ Server 和 RocketMQ Client 都需要使用4.5.0及以上版本。
如果您使用云消息队列 RocketMQ 版 4.x 系列,需要使用铂金版,云消息队列 RocketMQ 版 5.x 系列无版本要求。Ons Client使用1.8.0.Final及以上版本。
创建 Topic 和 ConsumerGroup :注意 Topic 和 ConsumerGroup 与程序配置文件中的rocketmq.consumer.topic、rocketmq.consumer.group保持一致。比如需要在灰度时,如果灰度标签为 g1,请提前创建好
test-a_g1
的ConsumerGroup。
消息的生产者和消息的消费者,需要同时开启消息灰度,消息的灰度功能才能生效。
开启消息灰度后,SAE 会修改消息的Consumer Group。例如原来的Consumer Group为
group1
,环境标签为 gray ,开启消息灰度后,则group1
会被修改成group1_gray
,因为需要提前创建好两个 group,否则无法正常验证;如果您使用的是云消息队列 RocketMQ 版 ,请提前创建好group1_gray
和group1
。默认使用SQL92的过滤方式,如果您使用的是开源RocketMQ,开源的RocketMQ Server端需要支持SQL92过滤,且在服务端开启此功能(即在broker.conf中配置
enablePropertyFilter=true
)。说明如果您的应用场景不满足支持SQL92过滤的条件,那么可以使用通过 FilterMessageHook 在消费者过滤的方式,此方式需要在所有的应用中打开消息灰度并且选择客户端过滤方式。因为消费者过滤的方式会在每个环境都处理全量的消息,对消息的生产者和消费者压力都比较大,不推荐在生产中使用此模式。
操作步骤
登录SAE控制台,在页面顶部菜单栏选择地域。
在左侧导航栏,选择
,然后单击目标应用名称。在左侧导航栏选择
,然后单击图中编辑图标,在未达标环境忽略的标签处输入标签并打开开启消息灰度开关,单击确定。如果您不希望未打标环境消费其他环境生产出来的消息,请在未打标环境忽略的标签中选择需要忽略的标签。
如果您希望基线环境能够智能地识别其他环境是否存在消费者,在不存在消费者时消费对应环境的消息,在存在消费者时忽略对应环境的消息,请在未打标环境忽略的标签中输入自动识别。
说明应用在开启消息灰度后,需要重启才能生效。
未打标环境忽略的标签支持动态生效,不需要重启应用。
当消息的生产者和消费者都开启消息灰度,并且都重启生效之后。消息消费者的行为如下:
未打标的环境节点默认会消费所有环境生产出来的消息。
打标环境节点只消费在相同标签环境生产出来的消息。