面试官:同一个消费组内的消费者,如果订阅了相同的 topic,但是订阅的 tag 不一样,会有什么问题吗?

:会出现丢消息的情况。

面试官:能详细说一说吗?

:RocketMQ 要求同一个消费组内的消费者必须订阅关系一致,如果订阅关系不一致,会出现消息丢失的问题。

面试官:什么是订阅关系一致呢?

:订阅关系一致是指同一个消费者组下所有消费者所订阅的 Topic、Tag 必须完全一致。如下图所示:

其中,消费组 1 中的消费组都订阅了 Topic1 中的 Tag1,消费组 2 中的消费组都订阅了 Topic1 中的所有 Tag 以及 Topic2 中的 Tag1 || Tag2,消费组 3 中的消费组都订阅了 Topic2 中的 Tag1 和 Tag2。

面试官:能举几个订阅关系不一致的例子吗?

:订阅不一致的情况有三种,如下图:

  • 消费组 1 的 Consumer1 和 Consumer2 都订阅了 Topic1,但是订阅的 Tag 不一致。

  • 消费组 2 的 Consumer1 和 Consumer2 订阅的 Topic 不一致。

  • 消费组 3 的 Consumer1 和 Consumer2 订阅的 Topic 和 Tag 都一致,但是订阅 Tag 的顺序不一致。

面试官:为什么订阅关系不一致会导致消息丢失呢?

:RocketMQ 的存储架构,如下图:

为了 提高消费效率,RocketMQ 引入了 ConsumeQueue,ConsumerQueue 中保存消息在 CommitLog 文件中的物理偏移量。ConsumerQueue 中的元素内容如下:

  • 前 8 个字节记录消息在 CommitLog 中的偏移量。

  • 中间 4 个字节记录消息消息大小。

  • 最后 8 个字节记录消息中 tag 的 hashcode。

这个 tag 的作用是过滤消息,假如一个 Consumer 订阅了 Topic1 中的 Tag1,那这个 Consumer  拉取消息时,首先从 Name Server 获取订阅关系,得到当前 Consumer 订阅的所有 tag 的 hashcode 集合 codeSet。每次从 ConsumerQueue 获取一条记录,就要判断最后 8 个字节 tag hashcode 是否在 codeSet 中,比如 Tag2 不在 codeSet 中,就会被过滤掉。如下图:

消费组 1 消费 Topic1 中的消息时,Consumer1 通过 ConsumeQueue1 和 ConsumeQueue2 进行消费,Consumer2 通过 ConsumeQueue3 和 ConsumeQueue4 进行消费,如果 Consumer1 订阅了 Tag1,    Consumer2 订阅了 Tag2,那 Consumer1 从 ConsumeQueue1 和 ConsumeQueue2 消费消息时,就会把 Tag2 中的消息过滤掉,这样即使 Consumer2 订阅了 Tag2,也不能消费到 ConsumeQueue1 和 ConsumeQueue2 里 Tag2 中的消息了。

面试官:有没有方法可以快速知道消费组中有没有订阅关系不一致的问题?

:可以在 RocketMQ 的控制台看到。在 RocketMQ 的实例列表中,进入 Group 管理页面,查看要查找的 Group ID,查看详情,如下图:(下图来自阿里云)

面试官:恭喜你,通过了。

有道无术,术可成;有术无道,止于术

欢迎大家关注Java之道公众号

好文章,我在看❤️

阿里二面:RocketMQ同一个消费组内的消费者订阅量不同tag,会有问题吗?相关推荐

  1. RocketMQ入门到入土(七 )为什么同一个消费组设置不同tag会出现奇怪现象

    精彩推荐 一百期Java面试题汇总 SpringBoot内容聚合 IntelliJ IDEA内容聚合 Mybatis内容聚合 接上一篇:RocketMQ入门到入土(六)发消息的时候选择queue的算法 ...

  2. Kafka消费者组内各消费者分区分配

    1.两个基本概念介绍 1.1.GroupCoordinator 1.1.ConsumerCoordinator 2.分区分配的几个阶段 2.1.FIND_COORDINATOR(阶段1) 2.2.JO ...

  3. Kafka消费者与消费组

    消费者(Consumer)负责订阅Kafka中的主题(Topic),并且从订阅的主题上拉取消息.与其它一些消息中间件不同的是:在Kafka的消费理念中还有一层消费组(Consumer Group)的概 ...

  4. 怎么理解 Kafka 消费者与消费组之间的关系?

    与生产者对应的是消费者,应用程序可以通过 KafkaConsumer 来订阅主题,并从订阅的主题中拉取消息.不过在使用 KafkaConsumer 消费消息之前需要先了解消费者和消费组的概念,否则无法 ...

  5. 怎么理解Kafka消费者与消费组之间的关系?

    与生产者对应的是消费者,应用程序可以通过 KafkaConsumer 来订阅主题,并从订阅的主题中拉取消息.不过在使用 KafkaConsumer 消费消息之前需要先了解消费者和消费组的概念,否则无法 ...

  6. rocketmq 重复消费_消息队列 RocketMQ

    引言 本文整理了RocketMQ的相关知识,方便以后查阅. 功能介绍 简单来说,消息队列就是基础数据结构课程里"先进先出"的一种数据结构,但是如果要消除单点故障,保证消息传输的可靠 ...

  7. kafka 主动消费_Kafka消费组(consumer group)

    在开始之前,我想花一点时间先来明确一些概念和术语,这会极大地方便我们下面的讨论.另外请原谅这文章有点长,毕竟要讨论的东西很多,虽然已然删除了很多太过细节的东西. 一. 误区澄清与概念明确 1 Kafk ...

  8. 日志服务Python消费组实战(三):实时跨域监测多日志库数据

    解决问题 使用日志服务进行数据处理与传递的过程中,你是否遇到如下监测场景不能很好的解决: 特定数据上传到日志服务中需要检查数据内的异常情况,而没有现成监控工具? 需要检索数据里面的关键字,但数据没有建 ...

  9. Kafka设计解析(十三)Kafka消费组(consumer group)

    转载自 huxihx,原文链接 Kafka消费组(consumer group) 一直以来都想写一点关于kafka consumer的东西,特别是关于新版consumer的中文资料很少.最近Kafka ...

最新文章

  1. 编程进阶,学会使用_I、_O、_IO,以及volatile const的意义
  2. 小学计算机组成的说课PPT,小学信息技术说课课件
  3. 线程同步锁 java_java多线程同步之重入锁,详细解析
  4. 基于HLS流媒体协议的视频加密方案
  5. idea新建springboot后端到前端_基于SpringBoot+AntDesign的快速开发平台
  6. golang return要返回的参数太多_Golang中的Defer必掌握的7知识点
  7. 用*号打印直角三角形(正反)
  8. html点击按钮 重新加载页面或者跳转页面实现
  9. python 伪多线程_从伪并行的 Python 多线程说起
  10. 黑马程序员全套Java教程_Java基础入门视频教程零基础自学Java必备教程视频讲义(3)
  11. 1数字电路设计流程与SOC芯片架构图
  12. 计算机主板供电,你也可以看懂主板供电相数和用料情况,轻松选好主板
  13. linux下arm架构中,触摸屏下没有鼠标事件,采用qtouchevent事件来代替,左右滑动显示完文本
  14. Ubuntu 设置搜狗输入法 Win+空格 Win+Space切换
  15. 大趋势:科技赋能产业
  16. 专精特新中小企业认定标准
  17. 理解Nurbs曲线/曲面的参数空间
  18. java - 随机生成人名/指定位数字符串/手机号 --工具方法
  19. 2017CCF大数据学术会议大数据智能分析分论坛成功举办
  20. 计算机网络 实验:配置VLAN

热门文章

  1. WEB安全基础-Javascrp相关知识点之BOM
  2. C/C++判断是否为笔记本电脑
  3. html自动年份版权,如何将html5日期输入限制在合理的年份
  4. 定义python函数时如果没有return_定义 Python 函数时,如果函数中没有 return 语句,则默认返回空值 None 。_学小易找答案...
  5. php提交raw_PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别分析
  6. 面试题目_数据分析SQL面试题目9套汇总
  7. 一个优秀的软件测试工程师需具备的技能
  8. 计组之存储系统:1、存储系统的概念与基本组成(层次、分类、性能指标、基本结构、寻址)
  9. (软件工程复习核心重点)第六章实现和测试-第八节:调试
  10. python中的reduce函数用法