1 RocketMQ最佳实践之坑-德赢Vwin官网 网
0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RocketMQ最佳实践之坑

jf_ro2CN3Fa 来源:yes的练级攻略 2023-06-02 14:13 次阅读

前不久踩了个坑,而这个坑跟 RocketMQ 推荐的一个最佳实践有关。

看下我从官网的截图,官方推荐一个应用尽可能只用一个 topic,然后用 tags 来标识子类型。

9711106c-0103-11ee-90ce-dac502259ad0.png

从订单角度来看,可以用一个 Topic-Order,然后再用不同的 tag 来区分这是 3C 类的订单,还是母婴类的订单等,然后下游应用根据不同的需求过滤不同的 tag。

这样的实现方式从业务上来看关系更清晰(有点树状的感觉),但是在实践上有点问题。

问题和起因

一般而言,生产上同一个服务至少会部署两台机器,不仅仅是为了负载均衡,也是为了系统的可靠性,当一台机器意外挂了,另一台可以扛起大旗。

我们在发服务的时候,都是分批发布。

这是为了验证新功能的正确性,不让其一次性影响所有实例,我们会先发布一批,然后观察下日志,确保无误后继续发布后续几台机器。

而这个操作再结合 RocketMQ 一个 Topic 多 tag 就会出现订阅消息不一致的情况,导致丢消息。

原理分析

我们借用官网的图来分析一下。

一般我们都用集群模式,以下描述默认使用集群模式

从使用层来看,发送和消费消息给我们最直观的感受如下:

生产者往一个 Topic 发送消息,消费者订阅了这个 Topic 就能消费到这个消息。

974595bc-0103-11ee-90ce-dac502259ad0.png

而实际上在 RocketMQ 中有队列的概念:

97759410-0103-11ee-90ce-dac502259ad0.png

也就是生产者往一个 Topic 发送消息时,消息会被分到不同的队列中。

而属于同一个消费组的消费者们会平分消费这些队列,从上图可以看到 Topic A 分了三个队列,分别是 MessageQueue 0、1、2。

而消费组 ConsumerGroupA 中的 Consumer1 仅消费 MessageQueue0 和 MessageQueue1 这两个队列中的消息,而 Consumer2 仅消费 MessageQueue2。

这样划分后,Consumer1 是无法消费到 MessageQueue2 中的消息的。

看到可能有人会说,这跟 tag 有什么关系吗?没错,问题就在这个分割跟 tag 没关系!

在默认情况下生产者发送消息是以轮询队列的方式发送的。

比如现在 Producer A 要发送 TopicA-tag1、TopicA-tag2、TopicA-tag3 这三条数据,轮询发送后,MessageQueue 0、1、2 分别存储了这 3 条消息。

97a02c48-0103-11ee-90ce-dac502259ad0.png

假设同样订阅了 TopicA,但是 Consumer 1订阅的 tag 是 tag1和 tag3,而 Consumer 2 订阅的是 tag1、tag2,那么问题就来了。

97c1257e-0103-11ee-90ce-dac502259ad0.png

按轮询的顺序 Consumer 1 要消费的 tag3 被投递到 MessageQueue2 这个队列中,而 Consumer 1 又无法消费 MessageQueue2 中的消息,Consumer 2 能消费 MessageQueue2 中的消息,但偏偏它又不要 tag3 的消息。这样一来 tag3 的这条消息就丢了,问题就出现了。

所以,在实践中,我们要求同一个消费组的消费者的订阅关系要保持一致。

也就是 Conusmer1 和 Conusmer2 需要订阅一样的 Topic、一样的 tag,这样消息才不会丢失。

再回到问题

现在我们已经知道订阅关系一致的重要性,但是有时候不得已就会“明知故犯”。

假设我们订单服务线上一共部署了 5 台,这 5 台机器属于同一个消费组,因此它们负载均衡消费有关订单的消息,如 Topic-Order。

这 5 台机器部署的都是同一套代码,它们都订阅了 Topic-Order,且 tag 是 A、B、C 三个。

这次发版需要订单服务新增消费 Topic-Order 下的 tag D 消息,由于分批部署,所以先部署了 1 台机器观察。

而此时线上就出现了订阅关系不一致的情况!5台机器,有 1 台订阅了 Topic-Order tag A、B、C、D,而其他 4 台订阅了 Topic-Order tag A、B、C。

这段时间内就出现了上述所说的丢消息的情况,如果有 Topic-Order tagD 的消息产生,那么就有可能会丢了。

明知有错,不想犯,却犯了!

针对这个场景,我暂时没啥思路,不知道业界是否有什么方式可以优雅的处理这个问题?欢迎各位留言指导或探讨!

然后留个坑,如果一台机器订阅的是 tagA||tagB,而另一台订阅的是 tagB||tagA,这样算订阅消息一致吗?




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 机器人
    +关注

    关注

    211

    文章

    28379

    浏览量

    206908
  • 过滤器
    +关注

    关注

    1

    文章

    428

    浏览量

    19593

原文标题:RocketMQ 最佳实践之坑

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    立讯精密入选2024可持续发展最佳实践案例

    近日,由中国上市公司协会(以下简称中上协)主办的2024上市公司可持续发展大会在京召开。会上,中上协发布了2024上市公司可持续发展最佳及优秀实践案例。立讯精密凭借“立志高远 讯航可持续高质量发展”的卓越实践,从596篇投稿中脱
    的头像 发表于 11-28 13:50 222次阅读

    4G模组UDP应用的最佳实践

    今天说的是4G模组UDP应用,展示最佳实践,送你参考。
    的头像 发表于 11-08 09:24 307次阅读
    4G模组<b class='flag-5'>之</b>UDP应用的<b class='flag-5'>最佳</b><b class='flag-5'>实践</b>!

    MES系统的最佳实践案例

    效率、降低成本、保证产品质量。 MES系统的最佳实践案例 引言 在当今竞争激烈的制造业环境中,企业必须不断寻求创新和改进的方法来保持竞争力。MES系统作为一种关键的信息技术工具,已经被广泛应用于各种制造行业,以实现生产过程的优化和管理。本文将探讨MES系统的
    的头像 发表于 10-27 09:33 813次阅读

    爱芯元速荣膺最佳技术实践应用奖

    爱芯元智车载事业部(品牌“爱芯元速”)凭借在车载芯片领域的创新技术研发实力以及在推动量产上车方面的卓越成绩收获本届“金辑奖”的“2024最佳技术实践应用奖”。
    的头像 发表于 10-25 11:39 330次阅读

    边缘计算架构设计最佳实践

    边缘计算架构设计最佳实践涉及多个方面,以下是一些关键要素和最佳实践建议: 一、核心组件与架构设计 边缘设备与网关 边缘设备 :包括各种嵌入式设备、传感器、智能手机、智能摄像头等,负责采
    的头像 发表于 10-24 14:17 411次阅读

    云计算平台的最佳实践

    云计算平台的最佳实践涉及多个方面,以确保高效、安全、可扩展和成本优化的云环境。以下是一些关键的最佳实践: 一、云成本优化 详细分析云使用情况 :通过细致的监控和分析,识别低ROI(投资
    的头像 发表于 10-24 09:17 346次阅读

    TMCS110x 布局挑战和最佳实践

    德赢Vwin官网 网站提供《TMCS110x 布局挑战和最佳实践.pdf》资料免费下载
    发表于 09-12 09:23 0次下载
    TMCS110x 布局挑战和<b class='flag-5'>最佳</b><b class='flag-5'>实践</b>

    衰减 AMC3301 系列辐射发射 EMI 的最佳实践

    德赢Vwin官网 网站提供《衰减 AMC3301 系列辐射发射 EMI 的最佳实践.pdf》资料免费下载
    发表于 09-11 09:59 0次下载
    衰减 AMC3301 系列辐射发射 EMI 的<b class='flag-5'>最佳</b><b class='flag-5'>实践</b>

    毫米波雷达器件的放置和角度最佳实践应用

    德赢Vwin官网 网站提供《毫米波雷达器件的放置和角度最佳实践应用.pdf》资料免费下载
    发表于 09-09 09:57 2次下载
    毫米波雷达器件的放置和角度<b class='flag-5'>最佳</b><b class='flag-5'>实践</b>应用

    电机驱动器电路板布局的最佳实践

    德赢Vwin官网 网站提供《电机驱动器电路板布局的最佳实践.pdf》资料免费下载
    发表于 09-05 11:33 10次下载
    电机驱动器电路板布局的<b class='flag-5'>最佳</b><b class='flag-5'>实践</b>

    MSP430 FRAM技术–使用方法和最佳实践

    德赢Vwin官网 网站提供《MSP430 FRAM技术–使用方法和最佳实践.pdf》资料免费下载
    发表于 08-23 09:23 0次下载
    MSP430 FRAM技术–使用方法和<b class='flag-5'>最佳</b><b class='flag-5'>实践</b>

    RTOS开发最佳实践

    基于RTOS编写应用程序时,有一些要注意事项。在本节中,您将学习RTOS开发最佳实践,例如POSIX合规性、安全性和功能安全认证。
    的头像 发表于 08-20 11:24 446次阅读

    热烈恭贺|开盛晖腾入围APEC•ESCI最佳实践奖候选

    喜讯!固德威智慧能源合作伙伴开盛晖腾成功入围APEC能源智慧社区倡议最佳实践奖候选名单。在智能电网类中,全国仅4个项目入围! 04:3 APEC ESCI是于2010年由亚太经济合作组织
    的头像 发表于 04-29 17:31 404次阅读
    热烈恭贺|开盛晖腾入围APEC•ESCI<b class='flag-5'>最佳</b><b class='flag-5'>实践</b>奖候选

    RocketMQ协议是什么?RocketMQ协议特点

    RocketMQ是由阿里巴巴开发的开源分布式消息和流处理平台。它提供可靠、可扩展和高性能的消息传输和实时处理解决方案。 RocketMQ使用一种名为RocketMQ协议的通信协议。该协议旨在促进
    的头像 发表于 01-03 16:11 806次阅读

    记录RocketMQ在centos7上的安装过程

    本文记录RocketMQ在centos7上的安装过程,没有技术的探讨,仅仅是安装记录,以作备忘。
    的头像 发表于 01-02 11:41 1595次阅读
    记录<b class='flag-5'>RocketMQ</b>在centos7上的安装过程