消息全链路灰度方案

最近更新时间:2024-07-05 14:46:21

我的收藏
腾讯云 RocketMQ 可以结合 腾讯云微服务平台(Tencent Service Framework,TSF)的 全链路灰度发布方案,完成消息的灰度发送和消费。

整体方案

对于消息发送方(Producer),需要识别自身所属的灰度环境,发送消息时在消息头部带上 tsf_laneId
对于消息接收方(Consumer),如果是灰度环境,订阅消费组修改为其他的消费者组 Group(这个由用户控制)。这样正常环境和灰度环境都会收到消息,然后在消费代码的 listener 方法中,进行消息的过滤。

结合 TSF 的方案

TSF 支持了消息轨迹,支持了 push 消费模式的 bean 修改。这里对于灰度方案,我们也建议使用 push 消费模式。因为后面要拦截具体的切入点,我们只拦截 push 对应的位置就可以了。
目前 TSF 已经支持了灰度的能力,通过切面做了以下几个更新:
生产消息的时候,如果发现是灰度环境,带上标记。
消费消息的时候,如果消息属于灰度环境,订阅组(Group)由用户自己控制,保证唯一即可。
收到消息之后,在 onMessage 中对消息进行过滤。

不使用 TSF 的方案

对于没有使用 TSF 的用户,用户自行打标,并创建对应的订阅组,来实现上述功能。
其中过滤逻辑,直接使用 registerFilterMessageHook 来实现,提供代码也更方便,可以支持非 SpringBoot 的场景,可以支持 push,pull 和 litepull 等多种消费模式。

使用指引

参数介绍

开启泳道标流经 RocketMQ 后持续传递能力

配置 tsf.lane.rocketmq.laneOn 为 true。该能力默认关闭,可通过本地配置或应用配置修改。

支持基线部署组消费带泳道标的消息

当服务有泳道部署组,但是泳道部署组不在线或手动下线时,支持通过配置 tsf.lane.rocketmq.mainConsumeLane = true 使得基线部署组消费带泳道标的消息。该配置默认为 false。
支持泳道部署组消费基线消息
支持通过配置 tsf.lane.rocketmq.laneConsumeMain=true 使得泳道部署组可消费基线消息。该配置默认为 false。

使用步骤

步骤1:升级版本

升级 TSF 框架到 1.40.10-Hoxton-Higher-RELEASE。
<groupId>com.tencent.tsf</groupId> <artifactId>spring-cloud-tsf-dependencies</artifactId> <version>1.40.10-Hoxton-Higher-RELEASE</version>
正常使用客户端进行生产消费,注意生产者和消费者相关的配置都需要修改。

步骤2:灰度环境消费者配置

灰度环境的消费者启动的时候。根据代码配置,在启动灰度消费者服务的时候,增加 -Dapache.rocketmq.consumer.pushConsumer=myConsumer-1-grey 这个参数来定义要消费的灰度消费组。此灰度消费组需要在 RocketMQ 集群中提前新建好,名字没有特别的规范,但建议是 group 名字 + grey来命名,以便于区分它是灰度消费组。而前面的 key 根据用户自己的代码来确定。
此方式仅适用于 group 名字是通过 spring 配置指定的方式,如果是在代码中写死的 group,则只能改代码。

步骤3:新建部署组和泳道配置

相同的代码,分别部署生产者 prod,生产者 grey,消费者 prod,消费者 grey。



如果已经有灰度配置,可以直接使用。



根据实际场景,将所有灰度的部署组放到一起即可。




步骤4:新建灰度规则

如果您已经有对应的灰度规则,可以忽略本步骤,可以让代码运行到对应的灰度环境。



否则根据对应的灰度需求进行配置即可。

第五步:测试

生产者
消费者
只要通过灰度环境,进入了生产者流程,那么生产者会根据线程上下文的泳道信息,发送消息,带上对应的 tag 标识。
灰度环境的生产者,命中对应的灰度泳道。



而生产环境的生产者,发送消息则不会带上对应的标。




可以看到,灰度消费者只会消费到灰度的消息。可以通过看消息里面的 tsf_laneId 来确认。



生产环境,则只会收到没有灰度的消息。