RabbitMQ 多实例 广播消息

本文介绍如何使用RabbitMQ的FANOUT Exchange实现多实例服务的消息广播,确保每个实例都能独立接收到消息,通过随机队列绑定交换机的方式解决了传统广播模式下消息只能被一个消费者消费的问题。
摘要由CSDN通过智能技术生成

场景:

服务A发布消息,要求多实例部署的服务B都要同时接收到消息

问题:

第一反应想到是利用RabbitMQ的FANOUT Exchange把消息广播到绑定此exchange的队列上

此情况下多实例服务B肯定订阅的是同一队列,由于RabbitMQ特性一条消息只能被同一队列的其中一个消费端消费掉,这就导致了要么实例1上的能接收,要么实例2上能收到,反正是不能同时收到消息,不是我想要的结果

解决:

在网上找到了很多方法都不行

这个问题也困扰我好久,我的做法是:

生产者声明一个FANOUT交换机
消费者声明一个系统产生的随机队列绑定到这个交换机上,然后往交换机发消息,只要绑定到这个交换机上都能收到消息,关键代码如下:

生产者:

@Slf4j
@Component
public class RabbitHelper  {
 
    @Autowired
    private RabbitTemplate rabbitTemplate;
 
    /**
     * 广播消息
     * @param exchange
     * @param message
     */
    public void broadcast(String exchange,String message){
        rabbitTemplate.convertAndSend(exchange,"",message);
    }
 
}

消费者:

@Slf4j
@Component
public class DownCmdConsumer {
 
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(), //注意这里不要定义队列名称,系统会随机产生
            exchange = @Exchange(value = "填写交换机名称",type = ExchangeTypes.FANOUT)
    )
    )
    public void process(String payload) {
        log.info("receive:{}",payload)
    }
}

 

效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值