美文网首页
【rocketmq客户端】订阅关系一致

【rocketmq客户端】订阅关系一致

作者: 理查德成 | 来源:发表于2021-09-09 11:59 被阅读0次

参考:

最佳实践

rocketmq中,一个消费组内的所有消费者,其订阅关系必须保持一致。

同一个消费组中,不一致的订阅行为有:

  • 多个消费者订阅同一个主题的不同tag
  • 多个消费者订阅不同的主题

不一致的订阅行为,会导致部分消息丢失。

订阅不同tag

rocket mq的tag级别的消息过滤功能,其实现原理包括两方面:

  • 存储模型
  • 消费拉取模型

存储模型
rocket mq为每一个topic建立索引,方便消费者按照topic进行消费,其具体实现为ConsumeQueue(消息队列)。consumeQueue的设计极具技巧性,队列中每个条目长度固定,组成为:

  • 8字节的commitLog物理偏移量
  • 4字节的消息长度
  • 8字节的消息tag hashcode

这种设计使得消费队列具备类似数组般随机访问的特性,提高consumeQueue的读取性能。

tag过滤
tag消息过滤时:

  • 在consumeQueue中根据tag的hashcode过滤
  • 因为不同的tag可能具备相同的hashcode(哈希冲突),所以在消费者拉取到消息后,根据tag值精确比较

消息丢失
为什么同一消费组,多个消费者订阅同一topic不同的tag,会发生消息丢失?

使用集群模式消费时,同一个消费组内的多个消费者共同完成topic的多个consumeQueue消费,一个消费组只会分配到其中某几个consumeQueue,且同一时间,一个consumeQueue只会分配给一个消费组。如图:

image.png

问题的核心是:同一个tag的消息会分布在不同的consumeQueue中,而队列的消息只会被一个消费者消费,那么这个consumerQueue上,不同于消费者订阅tag的消息,将不会被消费,造成堆积。

所以,rocketmq中,一个消费组内的消费者,其tag过滤行为必须一致。

订阅不同topic

如下,消费组consumer-group-name 下的两个消费者consumer 1 consumer2 分别订阅了两个不同的topic topic Atopic B

image.png

由于consumerQueue的分配是以消费组为单位的,会均匀分配给消费组下的消费者,而不会在意消费者本身订阅的是哪个主题。

topic A的consumerQueue q4 分配给了consumer2,但是consumer2订阅的是topic B,因此部分topic A的消息得不到消费。

所以,rocketmq中,一个消费组内的消费者,其订阅的topic必须是同一个

总结

得出结论:

rocketmq中,一个消费组内的所有消费者,其订阅关系必须保持一致。

相关文章

网友评论

      本文标题:【rocketmq客户端】订阅关系一致

      本文链接:https://www.haomeiwen.com/subject/nuuiwltx.html