JAVA全系列 教程
3762个小节阅读:7088.3k
目录
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
比如在电商场景中,订单系统我们做集群部署,都会从RabbitMQ中获取订单信息,那如果一个订单同时被两个服务获取到,那么就会造成数据错误,我们得避免这种情况。
注意:
我们可以使用Stream中的消息分组来解决。在Stream中处于同一个group中的多个消费者是竞争关系,就能够保证消息只会被其中一个应用消费一次。
xxxxxxxxxx
// 发送分组消息
@PostMapping("/group")
public String sendGroupMessage(@RequestParam("body") String body) {
MyMessage myMessage = new MyMessage();
myMessage.setPayload(body);
// 生产消息
streamBridge.send("myGroup-out-0", myMessage);
return "SUCCESS";
}
xxxxxxxxxx
server:
port: 800
eureka:
instance:
# 实例名字
instance-id: stream-producer8001
client:
service-url:
# 指定单机eureka server地址
#defaultZone: http://localhost:7001/eureka/
defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/
spring:
application:
name: stream-producer
rabbitmq:
port: 5672
host: 192.168.66.101
username: guest
password: guest
cloud:
stream:
bindings:
# 广播消息
myBroadcast-out-0: # 生产者绑定名称,myBroadcast是自定义的绑定名称,out代表生产者,0是固定写法
destination: my-broadcast-topic # 对应的真实的 RabbitMQ Exchange
# 分组消息
myGroup-out-0: # 生产者绑定名称
destination: my-group-topic # 对应的真实的 RabbitMQ Exchange
xxxxxxxxxx
// 消费分组消息
@Bean
public Consumer<MyMessage> myGroup() { // 方法名必须与生产消息时自定义的绑定名称一致
return message -> {
log.info("接收分组消息:{}", message.getPayload());
};
}
xxxxxxxxxx
server:
port: 8003
eureka:
instance:
# 实例名字
instance-id: stream-consumer8003
client:
service-url:
# 指定单机eureka server地址
#defaultZone: http://localhost:7001/eureka/
defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/
spring:
application:
name: stream-consumer
rabbitmq:
port: 5672
host: 192.168.66.101
username: guest
password: guest
cloud:
function:
# 定义消费者,多个用分号分隔,当存在大于1个的消费者时,不定义不会生效
definition: myBroadcast;myGroup
stream:
bindings:
# 广播消息
myBroadcast-in-0: # 消费者绑定名称,myBroadcast是自定义的绑定名称,in代表消费者,0是固定写法
destination: my-broadcast-topic # 对应的真实的 RabbitMQ Exchange
# 分组消息
myGroup-in-0: # 消费者绑定名称
destination: my-group-topic # 对应的真实的 RabbitMQ Exchange
group: my-group-1 # 同一分组的消费服务,只能有一个消费者消费到消息
将 Stream 工程 启动两个实例,调用发送分组消息接口,查看消息消费情况。
发送分组消息接口:GEThttp://localhost:8001/group?message=hello这是一条分组消息!
自动生成的 Exchange
自动生成的 Queue