配置消息灰度

如果在全链路灰度以及开发环境隔离等场景中需要使用到消息的灰度,则需要开启消息灰度的功能。目前,MSE仅支持RocketMQ类型的消息灰度。

背景信息

虽然绝大多数业务场景下对于消息的灰度的要求并不像RPC的要求那么严格,但是在以下两个场景中,仍会对消息的全链路有一定的诉求。

  • 当消息的消费逻辑进行修改后,希望通过小流量的方式来验证新的消息消费逻辑的正确性,此时会对消息的灰度有诉求。

  • 在消息消费时,可能会产生新的RPC调用,如果没有在消息环节遵循之前设定的全链路流量控制的规则,会导致通过消息产生的这部分流量“逃逸”,从而破坏全链路灰度的规则,导致出现不符合预期的情况。

功能原理

MSE 服务治理消息灰度功能是在应用发送消息的过程中,在消息属性中添加当前环境信息;在消费消息的过程中,基于消息属性中的环境信息进行过滤。

灰度消息的定义:灰度消息是指由以下两种情况产生的消息。

  1. 灰度生产者直接生成的消息:由灰度节点(灰度生产者)生产的消息,默认属于灰度消息。

  2. 基线节点的回退消息:当系统中不存在灰度生产者节点时,灰度流量会回退到基线节点,此时基线节点产生的消息也被视为灰度消息。

默认情况下开启消息灰度以后:基线环境生产者应用生产的基线消息,只有基线环境消费者进行消费;灰度消息,基线环境消费者和对应灰度环境消费者均会进行消费,且基线环境消费者和对应灰度环境消费者会独立消费同一条消息两次。

如果希望灰度环境生产者应用生产的消息只有对应灰度环境消费者进行消费,请参见配置灰度消息消费者

使用限制

框架支持情况

  • 消息类型目前仅支持RocketMQ,包含开源版本和阿里云商业版。

  • 对于 RocketMQ Server:

    • 如果使用开源版本,RocketMQ Server需要使用4.5.0及以上版本。

    • 如果使用阿里云RocketMQ 4.x 系列,需要使用铂金版才能开启服务端过滤。对于其他版本,可以使用客户端过滤能力。

    • 如果使用阿里云RocketMQ 5.x 系列,服务端过滤和客户端过滤均支持

  • 对于 RocketMQ Client:

    • 如果使用的客户端为阿里云 RocketMQ 提供的 Ons Client,支持的 Ons Client 版本范围为 1.x 系列,要求大于 1.8.0.Final 。

    • 如果使用的客户端为开源 RocketMQ 提供的 org.apache.rocketmq:rocketmq-client,支持的 org.apache.rocketmq:rocketmq-client版本范围为 4.x 系列,要求大于 4.2.0。该客户端支持服务端和客户端过滤。

    • 如果使用的客户端为开源 RocketMQ 提供的 org.apache.rocketmq:rocketmq-client-java,支持的 org.apache.rocketmq:rocketmq-client版本范围为 5.x 系列,且 MSE Agent 版本需要大于等于 4.2.2 版本。该客户端仅支持服务端过滤

    • 关于开源 RocketMQ 提供的 SDK 差异,可以参考RocketMQ 官方说明

  • 目前 MSE Agent 暂不支持事务消息。

功能使用限制

  • 如果需要使用消息灰度,必须在 MSE 服务治理中同时开启消息生产者和消息消费者的消息灰度功能。如果有一方没有开启,消息灰度功能均不生效。

  • 开启消息灰度后,MSE Agent会修改灰度环境消息消费者的Consumer Group

    说明

    如果使用的是阿里云RocketMQ ,请在开启消息灰度前创建好对应灰度环境的Consumer Group。

    1. 修改规则为:对于灰度环境在原Consumer Group 后拼接 _tag,其中 tag 为对应的环境标签

    2. 例:原来的Consumer Groupgroup1,环境标签为gray。开启消息灰度后,Consumer Group会从group1被修改成group1_gray。

  • MSE 使用SQL92的过滤方式实现服务端过滤,如果使用的是开源RocketMQ 4.x,需要在RocketMQ Server端开启SQL92过滤支持(即在broker.conf中配置enablePropertyFilter=true)。

  • 如果的应用场景不满足支持SQL92过滤的条件,可以使用消费端过滤的能力。此方式需要在开启 MSE 服务治理消息灰度时选择客户端过滤方式。请注意消费者过滤的方式会在每个环境都处理全量的消息,对消息的生产者和消费者压力都比较大,不推荐在生产中使用客户端过滤方式

开启消息灰度

  1. 登录MSE治理中心控制台,并在顶部菜单栏选择地域。

  2. 在左侧导航栏,选择治理中心 > 应用治理

  3. 应用列表页面,单击目标应用的资源卡片,然后在左侧导航栏单击流量治理

  4. 流量治理页面,单击消息灰度页签。

  5. 开启消息灰度右侧单击编辑,配置是否开启消息灰度、消息灰度过滤侧、消费规则配置,然后单击确定

    说明
    • 修改消息灰度开关配置以后,无论使用客户端过滤还是服务端过滤,需要重启对应应用的所有节点才能正式生效

    • 消息灰度作为全链路灰度能力的一个子功能,建议开启消息灰度也配置好全链路灰度的相关能力,以获得最佳的使用体验。

配置灰度消息消费者

如果希望灰度环境生产者应用生产的消息仅有对应灰度环境消费者进行消费,则需要配置对应灰度标签的灰度消息不被基线消费者消费。该情况下,基线环境消费者将只消费基线环境和勾选基线消费者标签的灰度消息。

配置方式如下:

  1. 登录MSE治理中心控制台,并在顶部菜单栏选择地域。

  2. 在左侧导航栏,选择治理中心 > 应用治理

  3. 应用列表页面,单击目标应用的资源卡片,然后在左侧导航栏单击流量治理

  4. 流量治理页面,单击消息灰度页签。

  5. 消息灰度配置单击编辑,消费规则配置中对应标签取消勾选基线消费者,然后单击确定

说明
  • 修改消费规则配置动态生效,无需重启应用。

  • 由于基线环境不再消费忽略标签环境的消息,如对应灰度环境消费者全部下线,则对应灰度标签的灰度消将无消费者可以处理。

灰度发布操作路径

场景1 灰度消费者常态化部署

在长期部署灰度消息消费者的场景中,只需将生产者与消费者接入微服务治理,并开启消息灰度功能,即可实现灰度消息由灰度消费者处理、基线消息由基线消费者处理的目标。整个过程通过一次简单配置即可完成,高效且易于维护。

注意:如果用户消息没做幂等处理,需要保证灰度消息由灰度消费者处理、基线消息由基线消费者。因此需要按照如下操作步骤进行操作。

基本条件:消息的生产者与消费者应用均需要接入微服务治理,并且开启消息灰度后重启应用。

  1. 消费者配置消费规则,对应灰度消息的标签取消勾选基线消费者。

  2. MSE控制台进行操作后,等待1-3分钟,确保RocketMQ 侧订阅关系已更新。

  3. 消息消费者 灰度节点上线。

  4. 消息生产者 灰度节点上线,发送灰度消息。

场景2 灰度消费者动态发布场景

对于灰度节点随应用迭代发布的场景,灰度节点的存在具有动态性,可能根据发布阶段启用或关闭。为保证业务消息不堆积、不丢失,需要基线消费者节点的过滤行为根据灰度节点的启停状态进行调整。发布过程中可以按照如下流程进行操作:

  1. 消费者应用修改消费规则配置,对应灰度消息的标签取消勾选基线消费者,使灰度消息仅由灰度消费者消费。在MSE控制台进行操作后,等待1-3分钟,确保RocketMQ 侧订阅关系已更新。

  2. 消息消费者应用灰度节点上线。

  3. 消息生产者应用灰度节点发送灰度消息。

  4. 验证灰度消息。

  5. 灰度消息生产者节点下线。

  6. 等待基线consumer_groupoffset小于或等于灰度consumer_groupoffset。并通过日志、监控确认此前灰度消息是否均消费成功。

    说明

    如果基线consumer_groupoffset小于或等于灰度consumer_groupoffset,灰度消息可由基线消费者进行消费,剩余灰度消息不会丢失,可进行下一步操作。该场景下,部分灰度消息会被重复消费,需业务方自行保证消息的幂等。

    如果基线consumer_groupoffset大于灰度的consumer_groupoffset,进行下一步操作时,灰度消息会丢失,因此需要等待。

  7. 消费者应用修改消费规则配置,对应灰度消息的标签勾选基线消费者,使剩余灰度消息可由基线消费者消费。在MSE控制台进行操作后,等待1-3分钟,确保RocketMQ 侧订阅关系已更新。

  8. 灰度消息消费者下线,删除灰度的 consumer_group。

    说明

    如不删除灰度consumer_group,会造成该group消息堆积,下次迭代灰度消费者上线后,将从当前灰度消费位点开始消费。