在 RocketMQ 中,Consumer(消费者) 用于接收并处理来自 Broker 的消息。通过 Consumer,可以将业务逻辑从发送端解耦出来,实现异步或分布式处理,常见场景包括数据同步、事件驱动、分布式工作流等。以下内容将帮助你快速了解和掌握 RocketMQ Consumer 的基本概念、工作机制以及常见的使用示例与注意事项。
1. 基础概念
-
Topic
- Consumer 通过订阅 (subscribe) 某个 Topic(及其 Tag)来消费消息。
- 一个 Topic 可以被多个 Consumer Group 消费;而同一个 Consumer Group 下的多个消费者一般分摊消息(集群模式)。
-
Consumer Group
- Consumer Group 是一组逻辑上的消费者,通常代表同一个业务功能或同一个微服务集群实例。
- 在 集群消费模式下,同一个 Group 下的多个 Consumer 实例会进行负载均衡,共同消费某个 Topic 的消息;
- 在 广播消费模式下,同一个 Group 内的所有 Consumer 都会收到 Topic 的全部消息(常用于日志广播、配置分发等)。
-
NameServer 路由
- Consumer 启动后,首先向 NameServer 拉取 Topic 的路由信息,获取可用的 Broker 以及对应的队列分布。
-
消息拉取 / 推送
- RocketMQ 采用**拉模式(Pull)**为主,官方 DefaultMQPushConsumer 对外表现为“推送”方式,但底层仍然是 Consumer 主动向 Broker 拉取消息。
- 对用户来说,消息会以回调的方式(MessageListener)“推送”到业务逻辑中。
-
消息消费位置(偏移量)
- Consumer 在消费消息时,RocketMQ 会维护消费进度(offset),标记当前 Consumer Group 对每个 Queue 消费到哪一条消息。
- 如果 Consumer 停机或重启,会从上次的 offset 位置继续消费,保证消息不丢失或重复过多。
2. 消费模式
-
集群消费 (Clustering)
- 默认且最常用的模式。
- 同一个 Consumer Group 下的消费者实例会分摊消息,每条消息只会被其中一个消费者实例处理。
- 适用于大部分业务场景,需要高吞吐并行处理。
-
广播消费 (Broadcasting)
- 同一个 Consumer Group 内,每个实例都能收到全部消息,互不影响。
- 适合广播通知、日志分发等场景,不适合消息量特别大或要求严格消费一次的场景。
在 Java 客户端中,可通过 consumer.setMessageModel(MessageModel.BROADCASTING)
或 MessageModel.CLUSTERING
(默认)来切换。
3. Consumer 工作流程
-
启动并注册到 NameServer
- Consumer 启动时,需要设置
namesrvAddr
或从外部环境获知 NameServer 地址。 - 向 NameServer 拉取 Topic 路由信息,获取 Broker 列表。
- Consumer 启动时,需要设置
-
订阅 Topic
- 调用
consumer.subscribe(topic, subExpression)
指定要消费的 Topic 和 Tag(如TagA || TagB
或*
表示全部 Tag)。 - Consumer 将向 Broker 或 NameServer 注册自己的订阅信息。
- 调用
-
拉取消息 / 分配 Queue
- Broker 或本地负载均衡器会给同一个 Consumer Group 下的不同实例分配不同的消息队列(Queue);
- Consumer 会从对应的队列中拉取消息,并回调交给业务逻辑处理。
-
处理回调
- 在 Java 中,可以采用 MessageListenerConcu