RocketMQ怎么实现消息分发的

概述

RocketMQ 实现消息分发的核心机制是通过 Topic、Queue 和 Consumer Group 的配合实现的。下面是 RocketMQ 实现消息分发的步骤:

  1. 创建 Topic:
    在 RocketMQ 中,首先需要创建一个 Topic(主题),生产者将消息发送到指定的 Topic。
  2. 设置消息队列:
    每个 Topic 可以有多个消息队列(Queue),用于存储消息。队列的数量可以根据业务需求进行配置,可以水平扩展和提高并发处理能力。
  3. 消费者订阅 Topic:
    消费者(Consumer)通过指定 Consumer Group 订阅感兴趣的 Topic。一个 Consumer Group 可以有多个消费者实例,它们共同消费同一个 Topic 下的消息。
  4. 消息分发策略:
    RocketMQ 提供了几种消息分发策略,用于决定消息如何被消费者组内的消费者实例分配。常用的分发策略有以下几种:
    ○ 广播模式(Broadcasting):消息被所有消费者实例接收,实现消息的广播。
    ○ 集群模式(Clustering):每个消息只会被消费者组内的一个消费者实例接收,实现消息的负载均衡。
  5. 消息消费:
    当消息发送到 Broker 后,Broker 将消息存储在对应的消息队列中。消费者通过拉取或推送的方式,从 Broker 获取消息进行消费。根据消息分发策略,Broker 将消息均匀分发给订阅了该 Topic 的消费者实例。

通过以上步骤,RocketMQ 实现了基于 Topic、Queue 和 Consumer Group 的消息分发机制。生产者发送消息到指定的 Topic,消费者订阅 Topic 并以一定规则接收消息,Broker 负责将消息分发给相应的消费者实例,从而实现了消息的分发和消费。

代码实现+图解

在 RocketMQ 中,可以通过设置消费者的消费模式来实现消息的分发。RocketMQ 提供了两种主要的消费模式:广播模式和集群模式。

下面是使用 Java 代码实现 RocketMQ 广播模式和集群模式的示例:

  1. 广播模式:
    在这里插入图片描述
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.common.message.MessageExt;

public class BroadcastConsumer {
    public static void main(String[] args) throws Exception {
        // 实例化消费者
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumer_group");
        
        // 设置 NameServer 地址
        consumer.setNamesrvAddr("localhost:9876");
        
        // 订阅Topic和Tag,使用广播模式
        consumer.subscribe("test_topic", "*");

        // 注册消息监听器,处理消息
        consumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> {
            for (MessageExt msg : msgs) {
                System.out.println(new String(msg.getBody()));
            }
            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
        });
        
        // 设置为广播模式
        consumer.setMessageModel(MessageModel.BROADCASTING);
        
        // 启动消费者
        consumer.start();
    }
}

在这个示例中,我们创建一个消费者,订阅名为 test_topic 的 Topic,并设置消费模式为广播模式。当有消息到达时,该消费者会将消息广播给所有订阅了该 Topic 的消费者实例进行消费。

  1. 集群模式
    在这里插入图片描述
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.common.message.MessageExt;

public class ClusterConsumer {
    public static void main(String[] args) throws Exception {
        // 实例化消费者
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumer_group");
        
        // 设置 NameServer 地址
        consumer.setNamesrvAddr("localhost:9876");
        
        // 订阅Topic和Tag,使用集群模式
        consumer.subscribe("test_topic", "*");

        // 注册消息监听器,处理消息
        consumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> {
            for (MessageExt msg : msgs) {
                System.out.println(new String(msg.getBody()));
            }
            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
        });
        
        // 设置为集群模式(默认就是集群模式,可以不显示设置)
        consumer.setMessageModel(MessageModel.CLUSTERING);
        
        // 启动消费者
        consumer.start();
    }
}

在这个示例中,我们创建一个消费者,订阅名为 test_topic 的 Topic,并设置消费模式为集群模式。当有消息到达时,RocketMQ 会根据集群的负载均衡策略,将消息分发给同一个 Consumer Group 内的一个消费者实例进行消费。

通过以上示例代码,你可以根据需要选择广播模式或集群模式来实现消息的分发。

  • 23
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

思静语

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

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

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

打赏作者

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

抵扣说明:

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

余额充值