RocketMq--key和tag的作用及容易踩坑的点

Producer 实例

Producer 的一个对象实例,不同的 Producer 实例可以运行在不同进程内或者不同机器上。Producer 实例线程安全,可在同一进程内多线程之间共 享。

Message Key

Key 一般用于消息在业务层面的唯一标识。对发送的消息设置好 Key,以后可以根据这个 Key 来查找消息。比如消息异常,消息丢失,进行查找会很 方便。RocketMQ 会创建专门的索引文件,用来存储 Key 与消息的映射,由于是 Hash 索引,应尽量使 Key 唯一,避免潜在的哈希冲突。
TagKey 的主要差别是使用场景不同,Tag 用在 Consumer 代码中,用于服务端消息过滤,Key 主要用于通过命令进行查找消息
RocketMQ 并不能保证 message id 唯一,在这种情况下,生产者在 push 消息的时候可以给每条消息设定唯一的 key, 消费者可以通过 message key 保证对消息幂等处理。

Tag

消息标签,二级消息类型,用来进一步区分某个 Topic 下的消息分类。
TopicTag 都是业务上用来归类的标识,区分在于 Topic 是一级分类,而 Tag 可以理解为是二级分类。
以天猫交易平台为例,订单消息和支付消息属于不同业务类型的消息,分别创建 Topic_OrderTopic_Pay,其中订单消息根据商品品类以不同的 Tag 再进行细分,如电器类、男装类、女装类、化妆品类,最后他们都被各个不同的系统所接收。
通过合理的使用 TopicTag,可以让业务结构清晰,更可以提高效率。


货源topic,tag有上架,下架,成交等类型,就是这么用的。下面说说坑点

复制代码
1.启动消费者1,消费组为group1,订阅topicA的消息,tag设置为tag1 || tag2

2.启动消费者2,消费组也为group1,也订阅topicA的消息,但是tag设置为tag3

3.启动生产者,生产者发送含有tag1,tag2,tag3的消息各10条

4.消费者1没有收到任何消息,消费者2收到部分消息

先上结论

同一个消费组中,设置不同tag时,后启动的消费者会覆盖先启动的消费者设置的tag

tag决定了消息过滤的条件,经过服务端和客户端两层过滤,最后只有后启动的消费者才能收到部分消息

复制代码

这个问题和两个CONSUMER使用一个consumerGroup,但是订阅两个Topic是一样的。都是consumer会通过心跳把订阅信息传给服务器,服务器上订阅信息是一个map,map的key就是consumerGroup,所以后面的会覆盖前面的。

posted on   MaXianZhe  阅读(8491)  评论(1编辑  收藏  举报

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2020-12-02 内部类访问外部类的方法

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示