场景:
服务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)
}
}
效果:

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

被折叠的 条评论
为什么被折叠?



