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

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

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

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

货源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,所以后面的会覆盖前面的。

https://www.cnblogs.com/juniorMa/p/15633911.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值