Spring Cloud Stream的分区和分组

消息分组
通常在生产环境,我们的每个服务都不会以单节点的方式运行在生产环境,当同一个服务启动多个实例
的时候,这些实例都会绑定到同一个消息通道的目标主题(Topic)上。默认情况下,当生产者发出一
条消息到绑定通道上,这条消息会产生多个副本被每个消费者实例接收和处理,但是有些业务场景之
下,我们希望生产者产生的消息只被其中一个实例消费,这个时候我们需要为这些消费者设置消费组来
实现这样的功能。

Spring Cloud Stream的分区和分组

 

 当把消费者复制一份,发现2个都能收到消息

Spring Cloud Stream的分区和分组

 

 2个消费者都加入同一个消费者

Spring Cloud Stream的分区和分组

 

 发现只有一个能收到

Spring Cloud Stream的分区和分组

消息分区
有一些场景需要满足, 同一个特征的数据被同一个实例消费, 比如同一个id的传感器监测数据必须被同一
个实例统计计算分析, 否则可能无法获取全部的数据。又比如部分异步任务,首次请求启动task,二次
请求取消task,此场景就必须保证两次请求至同一实例.

Spring Cloud Stream的分区和分组

 

 Spring Cloud Stream的分区和分组

 

 Spring Cloud Stream的分区和分组

 

 Spring Cloud Stream的分区和分组

从上面的配置中,我们可以看到增加了这两个参数:
1. pring.cloud.stream.bindings.output.producer.partitionKeyExpression :通过该参数
指定了分区键的表达式规则,我们可以根据实际的输出消息规则来配置SpEL来生成合适的分区
键;
2. spring.cloud.stream.bindings.output.producer.partitionCount :该参数指定了消息分
区的数量。
到这里消息分区配置就完成了,我们可以再次启动这两个应用,同时消费者启动多个,但需要注意的是
要为消费者指定不同的实例索引号,这样当同一个消息被发给消费组时,我们可以发现只有一个消费实
例在接收和处理这些相同的消息。