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 2021-12-02 16:29  MaXianZhe  阅读(8061)  评论(1编辑  收藏  举报

导航