Alibaba Spring Cloud 二十八 RocketMQ Consumer

在 RocketMQ 中,Consumer(消费者) 用于接收并处理来自 Broker 的消息。通过 Consumer,可以将业务逻辑从发送端解耦出来,实现异步或分布式处理,常见场景包括数据同步、事件驱动、分布式工作流等。以下内容将帮助你快速了解和掌握 RocketMQ Consumer 的基本概念、工作机制以及常见的使用示例与注意事项。


1. 基础概念

  1. Topic

    • Consumer 通过订阅 (subscribe) 某个 Topic(及其 Tag)来消费消息。
    • 一个 Topic 可以被多个 Consumer Group 消费;而同一个 Consumer Group 下的多个消费者一般分摊消息(集群模式)。
  2. Consumer Group

    • Consumer Group 是一组逻辑上的消费者,通常代表同一个业务功能或同一个微服务集群实例。
    • 集群消费模式下,同一个 Group 下的多个 Consumer 实例会进行负载均衡,共同消费某个 Topic 的消息;
    • 广播消费模式下,同一个 Group 内的所有 Consumer 都会收到 Topic 的全部消息(常用于日志广播、配置分发等)。
  3. NameServer 路由

    • Consumer 启动后,首先向 NameServer 拉取 Topic 的路由信息,获取可用的 Broker 以及对应的队列分布。
  4. 消息拉取 / 推送

    • RocketMQ 采用**拉模式(Pull)**为主,官方 DefaultMQPushConsumer 对外表现为“推送”方式,但底层仍然是 Consumer 主动向 Broker 拉取消息。
    • 对用户来说,消息会以回调的方式(MessageListener)“推送”到业务逻辑中。
  5. 消息消费位置(偏移量)

    • Consumer 在消费消息时,RocketMQ 会维护消费进度(offset),标记当前 Consumer Group 对每个 Queue 消费到哪一条消息。
    • 如果 Consumer 停机或重启,会从上次的 offset 位置继续消费,保证消息不丢失或重复过多。

2. 消费模式

  1. 集群消费 (Clustering)

    • 默认且最常用的模式。
    • 同一个 Consumer Group 下的消费者实例会分摊消息,每条消息只会被其中一个消费者实例处理。
    • 适用于大部分业务场景,需要高吞吐并行处理。
  2. 广播消费 (Broadcasting)

    • 同一个 Consumer Group 内,每个实例都能收到全部消息,互不影响。
    • 适合广播通知、日志分发等场景,不适合消息量特别大或要求严格消费一次的场景。

在 Java 客户端中,可通过 consumer.setMessageModel(MessageModel.BROADCASTING)MessageModel.CLUSTERING(默认)来切换。


3. Consumer 工作流程

  1. 启动并注册到 NameServer

    • Consumer 启动时,需要设置 namesrvAddr 或从外部环境获知 NameServer 地址。
    • 向 NameServer 拉取 Topic 路由信息,获取 Broker 列表。
  2. 订阅 Topic

    • 调用 consumer.subscribe(topic, subExpression) 指定要消费的 Topic 和 Tag(如 TagA || TagB* 表示全部 Tag)。
    • Consumer 将向 Broker 或 NameServer 注册自己的订阅信息。
  3. 拉取消息 / 分配 Queue

    • Broker 或本地负载均衡器会给同一个 Consumer Group 下的不同实例分配不同的消息队列(Queue);
    • Consumer 会从对应的队列中拉取消息,并回调交给业务逻辑处理。
  4. 处理回调

    • 在 Java 中,可以采用 MessageListenerConcu
使用Spring Cloud Alibaba中的RocketMQ,首先需要添加相关依赖。在pom.xml文件中添加如下依赖: ```xml <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-rocketmq</artifactId> <version>2.2.1.RELEASE</version> </dependency> ``` 接下来,在配置文件中配置RocketMQ的相关参数,例如: ```yaml rocketmq: name-server: localhost:9876 producer: group: test-group consumer: group: test-group ``` 其中,name-server 是RocketMQ的地址,producer和consumer分别表示生产者和消费者所在的组名称。 然后,在生产者和消费者中分别注入RocketMQ的相关组件,例如: ```java import org.springframework.cloud.stream.annotation.EnableBinding; import org.springframework.cloud.stream.messaging.Source; import org.springframework.messaging.support.MessageBuilder; @EnableBinding(Source.class) public class RocketMQProducer { @Autowired private Source source; public void sendMessage(String message) { source.output().send(MessageBuilder.withPayload(message).build()); } } ``` ```java import org.springframework.cloud.stream.annotation.EnableBinding; import org.springframework.cloud.stream.annotation.StreamListener; import org.springframework.cloud.stream.messaging.Sink; @EnableBinding(Sink.class) public class RocketMQConsumer { @StreamListener(Sink.INPUT) public void receiveMessage(String message) { System.out.println("Received message: " + message); } } ``` 在上述代码中,RocketMQProducer中的Source是Spring Cloud Stream提供的组件,用于向RocketMQ发送消息。RocketMQConsumer中的Sink也是Spring Cloud Stream提供的组件,用于从RocketMQ接收消息。@EnableBinding注解用于启用Spring Cloud Stream的支持。 最后,在Spring Boot的启动类中添加@EnableDiscoveryClient注解,使得服务可以注册到注册中心中。 以上就是在Spring Cloud Alibaba中使用RocketMQ进行消息队列的基本步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十方来财

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值