在实际业务场景中,每一个微服务应用都会集群部署,这样消息会被重复消费。Spring Cloud Stream 中提供了消费组来解决这个问题,通过配置 spring.cloud.stream.bindings.《通道名称》.group 属性为应用指定一个组名实现。配置如下:
生产者配置:
server:
port: 9000
spring:
application:
name: springcloud-stream-producer
cloud:
stream:
kafka:
binder:
##kafka集群列表
brokers: 192.168.153.129:9092,192.168.153.130:9092,192.168.153.131:9092
#kafka服务端连接的ZooKeeper集群列表
zkNodes: 192.168.153.129:2181,192.168.153.130:2181,192.168.153.131:2181
minPartitionCount: 1
autoCreateTopics: true
autoAddPartitions: true
bindings:
my_msg: #通道名称
destination: my_topic
消费者配置:
server:
port: 8001
spring:
application:
name: springcloud-stream-consumer
cloud:
instance-count: 1
instance-index: 0
stream:
kafka:
binder:
brokers: 192.168.153.129:9092,192.168.153.130:9092,192.168.153.131:9092
zk-nodes: 192.168.153.129:2181,192.168.153.130:2181,192.168.153.131:2181
auto-add-partitions: true
auto-create-topics: true
min-partition-count: 1
bindings:
my_msg:
destination: my_topic
group: group_name_001 #分组名称
#当前消费者的总实例数量,不指定多个消费者启动后默认最后启动的服务作为唯一消息消费者,其他消费者对消息不做处理
instanceCount: 3
通过以上配置后,多个消费者进行轮询消费,每次只有一个消费者消费消息,不会重复消费