如果有多个消息消费者,那么消息生产者发送的消息会被多个消费者都接收到,这种情况在某些实际场景下是有很大问题的,比如在如下场景中,订单系统做集群部署,都会从 RabbitMQ 中获取订单信息,如果一个订单消息同时被两个服务消费,系统肯定会出现问题。为了避免这种情况,Stream 提供了消息分组来解决该问题。
在 Stream 中处于同一个 group 中的多个消费者是竞争关系,能够保证消息只会被其中一个应用消费。不同的组是可以消费的,同一个组会发生竞争关系,只有其中一个可以消费。通过 spring.cloud.stream.bindings..group 属性指定组名。
主要是修改application.yml的配置文件,为方便演示,在以下Demo中修改扩展
https://blog.csdn.net/qq_41712271/article/details/118189305
将消息消费者工程,再完全复制一个,修改里面的端口号和应用程序名即可
服务 | 介绍 |
---|---|
stream-group-sender | 消息发送者服务 |
stream-group-receiverA | 消息接收者服务 |
stream-group-receiverB | 消息接收者服务 |
通过结果可以看到消息被两个消费者同时消费了,原因是因为它们属于不同的分组,默认情况下分组名称是随机生成的
简单说,生产者发送10条,两个消费者都会收到10条
通过 RabbitMQ 也可以得知:
配置分组
分别修改两个消费者工程的application.yml文件
spring:
cloud:
stream:
bindings:
# 消息接收通道
smsEmail_in:
destination: sourceMsg # 绑定的交换机名称
group: A