消息分区
通过上一次Spring Cloud 学习笔记 ——Spring Cloud Stream 消息分组,可以使 RabbitMQ 消费者集群中的消息只会被消费一次,如果想相同特征的消息总是被集群中的固定的一个服务消费,该如何配置呢?可以通过消息分区来解决这个问题
注意消息分区要在消息分组的基础之上操作
- 配置 application.properties
# 消费者的配置
# 开启消息分区,
spring.cloud.stream.bindings.javaboy-input.consumer.partitioned=true
# 消费者实例的个数
spring.cloud.stream.instance-count=2
# 当前实例的下标
spring.cloud.stream.instance-index=0
# 生产者的配置
# 设置消息发给下标为 1 的消费者服务
spring.cloud.stream.bindings.javaboy-output.producer.partition-key-expression=1
# 消费端节点的数量
spring.cloud.stream.bindings.javaboy-output.producer.partition-count=2
spring.cloud.stream.instance-index=0
设置了当前服务的下标是 0 ,spring.cloud.stream.bindings.javaboy-output.producer.partition-key-expression=1
设置生产者发送给实例的下标是 1 的消费者,一共是 0 ,一共是 1,默认服务应该是不会收到消息的
- 打包
- 启动,不同端口和不同消费者下标的服务命令
java -jar stream2-0.0.1-SNAPSHOT.jar
java -jar stream2-0.0.1-SNAPSHOT.jar --server.port=8081 --spring.cloud.stream.instance-index=1
- 访问多次 hello 端口,观察两个服务的控制台
一共访问了 10 次,所有的消息都被 8081 消费了,8081 中的 true 只是 hello 接口对应的 Controller 打印的内容:
证实了猜想,默认的服务不会消费消息。 10 次的消息全部被 8081 也就是spring.cloud.stream.bindings.javaboy-output.producer.partition-key-expression=1
下标为 1 的服务收到了。这是固定了消费者是谁,然后消息总是被这个消费者消息,这就是消息分区。在消息分组的基础上,指定消息被 RabbitMQ 消息者集群中的哪个服务消费