首先,kafka的topic是由多个partitions物理分隔的。假设topic: testIn,有8个partitions
其次,我们编写的springcloud kafka stream程序,打成jar包后,可以部署多个不同的实例instances,假设部署了3个instance。
那么这3个instance是怎么分配这8个partitions的呢?
在spring.cloud.stream.kafka.bindings.input.consumer.autoRebalanceEnabled=true时(默认),多个实例会自动均衡
的分配partitions,由ConsumerCoordinator来自动协调,不用您操心了(跟instanceCount 和instanceIndex 没关系了,但是concurrency还是同理的), 当设置成false后:
主要是通过consumer的4个参数(org.springframework.cloud.stream.binder.ConsumerProperties)来决定的:
spring.cloud.stream.bindings.input.consumer.partitioned=true
准备启动多少个实例
spring.cloud.stream.bindings.input.consumer.instanceCount =3
该实例编号index,从0开始到instanceCount -1
spring.cloud.stream.bindings.input.consumer.instanceIndex =0
每个实例中启动多少个kafka consumer
spring.cloud.stream.bindings.input.consumer.concurrency =1