消息分组
默认情况下,如果消费者是一个集群,此时,一条消息会被多次消费。
- 首先把上一次的Spring Cloud 学习笔记 ——Spring Cloud Stream 自定义消息通道项目打包,然后分别运行如下命令
java -jar stream2-0.0.1-SNAPSHOT.jar
java -jar stream2-0.0.1-SNAPSHOT.jar --server.port=8081
-
通过不同端口,运行两个服务
-
访问其中一个服务的 hello 接口,会给队列中发送 “hello spring cloud stream!” 的消息
-
可以看到两个服务都收到了这条消息,可以说是重复消费了,重复消费可能违背一些实际业务问题,比如收到这条消息会触发一个动作,而这个动作执行一次就够了(比如转账,这个只是举例),这时候就需要一个集群去处理一次的需求。
通过消息分组可以解决这个问题
- 在 application.properties 中配置分组 javaboy-group
spring.cloud.stream.bindings.javaboy-input.group=javaboy-group
spring.cloud.stream.bindings.javaboy-output.group=javaboy-group
- 然后重新打包,启动不同端口的服务,访问 hello 接口
- 启动命令与刚才的一样,启动完服务如下:
- 访问 hello 接口
可以看到,通过分组,在 RabbitMQ 消费者集群中,可以使得消息从每个服务都消费一次变为一个集群之中只有一个服务会消费。这就是消息分组的作用 - 我们再次放 hello 接口
我们简单的再次测试,这是 8081 端口的服务收到消息,8080 端口的服务没有收到消息,只有上一次的消息,我们重复访问的时候发现,消息会被两个服务轮询消费,这种情况可能是 Spring Cloud 做了负载均衡,也可能不是,不能确定,但是消息的确在两个服务中只被消费一次了。这就是消息分组