RocketMq | 概念 - [生产 & 消费]

生产者:Producer

消息生产者用于把业务应用系统里产生的消息发送到 broker 服务器

消费者:Consumer

消费者用于从 broker 服务器拉取消息,并将其提供给业务系统处理
日常沟通中所说 consumer 可能对应两个东西(尤其对于 apache-rocketmq 而言)
特定场景下需注意区分,其具体关系参考 消费 | 全流程

  • rocketmq 的 consumer 提供从 broker 拉取消息并交由业务系统处理的能力
  • 业务系统的 consumer 专指处理消息体的部分,本质上是 consumerHandler

消费者组:Consumer Group

一个需要消费消息的服务实例是一个消费者,消费者组就是对其的分组
一个消费者组内的所有消费者,可以直接认为它们逻辑上是一个消费者,具有一样的订阅关系、消费逻辑

消费者组与 topic 的关系

多对多,
一个消费者组可以订阅多个 topic
个消费者组可以定义一个 topic

消费工作模式

可以这么理解 Consumer 与 Consumer Group 的关系:
对于一个消息而言,实际上是被一个(或几个)消费者消费
对于一个 topic 而言,实际上是被一个(或多个)消费者组消费

这两种消费,分别具有多种工作模式,在需要区分的场景,统一区分为

  • 消费者组消费模式
  • 消费者工作模式

消费者组消费模式

用于描述一个消费者组如何消费其订阅的 topic

  • 广播消费
    消费者组中每个消费者都完整消费订阅的所有消息,即一人轮一遍
    使用场景:下发系统事件(通知所有节点),下发配置变更
  • 集群消费
    也叫共享消费,不同版本的中文文档有区别,以英文名词为准
    消费者组中所有消费者一起完整消费订阅的所有消费一次,即大家一起瓜分
    适用场景:几乎所有业务场景

特别注意:广播还是集群是消费者端的概念,因此不能站在生产者角度进行分辨

消费者工作模式

消费者的职责是:从 broker 服务器拉取消息,并将其提供给应用程序
其工作模式主要用于描述如何从 broker 拉取消息,后面交由业务系统处理的部分无所谓区别

  • pull
    消费者主动从 broker 拉取消息
  • push
    rocketMq 主动推送消息到消费端
    Apache RocketMq 实际工作的 Consumer 是 DefaultMQPushConsumer,是 push 模式
    但是底层实际执行,或者其实际逻辑是 pull 模式

消息过滤

消息过滤会直接影响什么样的消息被 consumer 获取

  • 消息过滤一律发生在 consumer 获取消息时
  • 消息过滤一律由 server 端进行,但可能需要 consumer 端二次过滤

rocketMq 支持两种过滤方式

  • TAG:推荐,相当于 mysql 的 ref 级索引,基于 consumequeue 文件实现,由 broker 负责
  • SQL92:原则上禁止,相当于 myslq 开启了查询缓存的全表扫描,基于 commitlog 文件实现,由 filter 模块负责

消费结果:ConsumeResult

即 consumer 消费消息的结果
不同消费者工作模式下会有不同的枚举集,可以简单的概括为如下两种

  • 消费成功:CONSUME_SUCCESS
  • 稍后重试:RECONSUME_LATER

消息位点:MessageQueueOffset

消息在 consumequeue 中的位置,
其值为 0,1,2...,表示当前消息在当前 topic、当前 queue 中是第几条(不是对应 commitlog 的物理偏移量)
具体概念见 原理 | 消息存储

消费位点:ConsumerOffset

用于记录某个消费者的消费进度,本质就是个消息位点
可以直接理解消费位点是一个指针,指向下一个需要被消费的消息位点
对于同一个 topic 下同一个消息队列

  • 集群模式下,不同消费者组下分别独立记录
  • 广播模式下,不同消费者下分别独立记录

MessageQueueOffset/ConsumerOffset/MinOffset/MaxOffset

可以用下面的结构描述上述数据

topic-s:
    q0: a,d
        gid0: @b
        gid1: @c
    q1: x,z
        gid2: @y
topic-t:
    q0: h,j
        gid3: @i

上述 abcd hij xyz 均是消息点位 MessageQueueOffset,表示此消息在当前队列的位置(第几条消息)
axh 同时是对应队列的 MinOffset,表示当前队列现在记录的最前面的消息是第几条,< axh 的那些消息已经过期清除了
dzj 同时是对应队列的 MaxOffset,表示当前队列现在记录的最新消息是第几条,如果当前队列再接收到新消息才是 > dzj 的部分
bcyi 同时是对应消费者组的 ConsumerOffset,表示当前消费者组再消费,应该消费哪条消息

posted @ 2026-01-30 15:09  问仙长何方蓬莱  阅读(3)  评论(0)    收藏  举报