RocketMQ广播消费消息

1、 基础概念

RocketMQ 支持两种消息模式:集群消费( Clustering )和广播消费( Broadcasting )。

集群消费模式(Cluster)
在集群消费模式下,同一个消费者组(Consumer Group)中的每个消费者都会消费消息的一个副本。消息会被分发到不同的消费者实例上,但是同一个消息只会被同一个消费者组中的一个消费者消费。

广播消费模式(Broadcast)
在广播消费模式下,同一个消费者组中的每个消费者都会收到消息的一个副本,即每个消费者都会独立地消费消息。消息会被广播到同一个消费者组中的所有消费者实例上。

怎么使用广播消费模式呢?其实很简单,通过在消费者的 @RocketMQMessageListener 注解中设置 messageModel 参数为 MessageModel.BROADCASTING,即可将消费者设置为广播模式。在广播模式下,同一个消费者组中的每个消费者都会收到消息的一个副本,每个消费者都会独立地消费消息,从而实现了消息的广播消费。

2、 实现

消费者



import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.common.protocol.heartbeat.MessageModel;

import java.util.List;

/**
 * 广播模式
 */
public class Consumer {

    public static void main(String[] args) throws InterruptedException, MQClientException {
        //根据情况修改消费者组
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("defaultGroup");
        consumer.setNamesrvAddr("127.0.0.1:9876");
        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);
        //设置setMessageModel(MessageModel.BROADCASTING) 即可设置成广播模式
        //此时你发送的消息会在所有的Consumer都会收到,而不会只往一个组里面的一个消费者去消费
        /**这里可以设置两种模式: 默认都是CLUSTERING("CLUSTERING")
         *     BROADCASTING("BROADCASTING") 广播模式
         *     CLUSTERING("CLUSTERING") 集群模式
         */
        consumer.setMessageModel(MessageModel.BROADCASTING);

        //根据情况修改消费的topic
        consumer.subscribe("TopicTest", "*");

        consumer.registerMessageListener(new MessageListenerConcurrently() {

            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
                                                            ConsumeConcurrentlyContext context) {
                System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msgs);
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });

        consumer.start();
        System.out.printf("Broadcast Consumer Started.%n");
    }
}

生产者



import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.common.RemotingHelper;

public class Producer {
    public static void main(String[] args) throws MQClientException, InterruptedException {

        DefaultMQProducer producer = new DefaultMQProducer("defaultGroup");
        //NameServer 可以在代码中指定,也可以通过配置环境变量的方式指定mq的地址
        producer.setNamesrvAddr("127.0.0.1:9876");
        producer.start();

        try {
            {
                Message msg = new Message("TopicTest", // 发送的topic
                        "AAA",  //tags
                        "BBB", // keys
                        "CCC".getBytes(RemotingHelper.DEFAULT_CHARSET) // 发送的内容
                );
                //同步传递消息,消息会发给集群中的一个Broker节点。
                //这个发送方法是void方法,说明这个消息发送过去了之后,Producer是不知道的
                //不知道消息是否发送成功,反正Producer发送完了就不管了 .
                producer.sendOneway(msg);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        producer.shutdown();
    }
}

RocketMQ提供了消息过滤功能,通过生产者和消费者对消息的属性、标签进行定义,并在服务端根据过滤条件进行筛选匹配,将符合条件的消息投递给消费者进行消费。\[1\] 在消费者订阅了某个主题后,RocketMQ会将该主题中的所有消息投递给消费者。如果消费者只需要关注部分消息,可以通过设置过滤条件在服务端进行过滤,只获取到需要关注的消息子集,避免接收到大量无效的消息。这在一些应用场景中非常有用。\[2\] 然而,有时候会出现同一个tag分布在不同的队列中,而消费者只分配到了部分队列。这可能导致某些消息消费者过滤掉,但其他消费者却无法消费这些消息,从而造成消息丢失。为了解决这个问题,可以采取一些方案,例如使用广播模式,让所有消费者都能接收到所有的消息,或者使用消息过滤的方式,确保消息被正确地投递给对应的消费者。具体的解决方案可以根据实际情况进行选择和实施。\[3\] #### 引用[.reference_title] - *1* *2* *3* [rocketmq消息过滤](https://blog.youkuaiyun.com/xixingzhe2/article/details/128154159)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值