消息分组和分区
消息分组#
通常在生产环境,我们的每个服务都不会以单节点的方式运行在生产环境,当同一个服务启动多个实例的时候,这些实例都会绑定到同一个消息通道的目标主题(Topic)上。默认情况下,当生产者发出一条消息到绑定通道上,这条消息会产生多个副本被每个消费者实例接收和处理,但是有些业务场景之下,我们希望生产者产生的消息只被其中一个实例消费,这个时候我们需要为这些消费者设置消费组来实现这样的功能。
实现的方式非常简单,我们只需要在服务消费者端设置spring.cloud.stream.bindings.input.group 属性即可,比如我们可以这样实现:
server: port: 7003 #服务端口 spring: application: name: rabbitmq-consumer #指定服务名 rabbitmq: addresses: 127.0.0.1 username: itcast password: itcast virtual-host: myhost cloud: stream: bindings: input: destination: itcast-default inputOrder: destination: testChannel group: group-2 binders: defaultRabbit: type: rabbit
在同一个group中的多个消费者只有一个可以获取到消息并消费
消息分区#
有一些场景需要满足, 同一个特征的数据被同一个实例消费, 比如同一个id的传感器监测数据必须被同一个实例统计计算分析, 否则可能无法获取全部的数据。又比如部分异步任务,首次请求启动task,二次请求取消task,此场景就必须保证两次请求至同一实例.
消息消费者配置#
cloud: stream: instance-count: 2 instance-index: 0 bindings: input: destination: itcast-default inputOrder: destination: testChannel group: group-2 consumer: partitioned: true binders: defaultRabbit: type: rabbit
从上面的配置中,我们可以看到增加了这三个参数:
1. spring.cloud.stream.bindings.input.consumer.partitioned :通过该参数开启消费者分区功能;
2. spring.cloud.stream.instanceCount :该参数指定了当前消费者的总实例数量;
3. spring.cloud.stream.instanceIndex :该参数设置当前实例的索引号,从0开始,最大值为spring.cloud.stream.instanceCount 参数 - 1。我们试验的时候需要启动多个实例,可以通过运行参数来为不同实例设置不同的索引值。
消息生产者配置 #
spring: application: name: rabbitmq-producer #指定服务名 rabbitmq: addresses: 127.0.0.1 username: itcast password: itcast virtual-host: myhost cloud: stream: bindings: input: destination: itcast-default producer: partition-key-expression: payload partition-count: 2 binders: defaultRabbit: type: rabbit
从上面的配置中,我们可以看到增加了这两个参数:
1. pring.cloud.stream.bindings.output.producer.partitionKeyExpression :通过该参数指定了分区键的表达式规则,我们可以根据实际的输出消息规则来配置SpEL来生成合适的分区键;
2. spring.cloud.stream.bindings.output.producer.partitionCount :该参数指定了消息分区的数量。到这里消息分区配置就完成了,我们可以再次启动这两个应用,同时消费者启动多个,但需要注意的是要为消费者指定不同的实例索引号,这样当同一个消息被发给消费组时,我们可以发现只有一个消费实例在接收和处理这些相同的消息。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
2019-07-29 多态、以及常用的关于类的方法(isinstance、issubclass、slots等)运算符重载的实现、上下文管理等