【Kafka】Kafka在多Partition多实例情况下,消息的消费和生产情况验证
通过实验验证了Kafka在多Partition多实例情况下,消息的消费和生产情况:(1)一个partition最多被一个实例(同一消费组)消费。(2)一个实例可以同时消费多个partition。(3)当通过key将topic消息写入Kafka时,相同key的消息保证能写入同一个partition。
1 前言
闲来无事,想对Kafka的一些特性进行实验验证。
我们都知道,Kafka一个topic下可以有一个或多个partition。而消费一个partition是以消费组为单位的,一个消费组中如果有多个实例,只能有一个实例能消费该partition。但是一个消费实例却可以同时消费多个partition。
如果是不同消费组的两个实例,则可以对同一个partition进行消费,且他们之间互不影响。
spring boot下配置某个消费实例所属的Kafka消费组Id:
spring.kafka.consumer.group-id: xxxx
2 实验验证
废话少说,进入实验验证阶段。
分为写Kafka和读Kafka两个方面进行验证。
写Kafka,包括以下场景:
1、不带key写入
(1)1个topic,2个partition的情况
(2)1个topic,3个partition的情况
2、带key写入
(1)1个topic,2个partition,1个key的情况
(1)1个topic,3个partition,2个key的情况
(2)1个topic,3个partition,3个key的情况
读Kafka,包括以下场景:
1、1个topic,1个partition,2个消费实例(同一消费组)的情况
2、1个topic,2个partition,3个消费实例(同一消费组)的情况
3、1个topic,2个partition,3个消费实例,两个消费组的情况
2.1 写Kafka
2.1.1 不带key写入
结论:不带key写Kafka时,将随机写入多个partition。
2.1.1.1 1个topic,2个partition的情况
操作: 将一个topic的消息不带key,写入Kafka。现象如下所示,可以看到topic的消息被随机(注意并不是轮询方式)写入2个partition中。
partition0:
partition1:
2.1.1.2 1个topic,3个partition的情况
操作:将一个topic的消息不带key,写入Kafka。现象如下所示,可以看到消息被随机(注意并不是轮询方式)写入3个partition中。
partition0:
partition1:
partition1:
2.1.2 带Key写入
结论:相同的key会保证写入同一个partition。
2.1.2.1 1个topic,2个partition,1个key的情况
操作: 将一个topic的消息带key,写入Kafka。现象如下所示,可以看到消息被固定写入某个partition中。
partition0: 没有数据
partition1:
2.1.2.2 1个topic,3个partition,2个key的情况
操作: 将一个topic的消息带key,写入Kafka。现象如下所示,可以看到相同key的消息被写入相同的partition中。
partition0: 所有key为1的消息都写入了partition0
partition1: 没有数据
partition2: 所有key为2的消息都写入了partition2
2.1.2.3 1个topic,3个partition,3个key的情况
操作: 将一个topic的消息带key,写入Kafka。现象如下所示,可以看到相同key的消息被写入相同的partition中。
partition0: 所有key为1的消息都写入了partition0
partition1: 没有数据
partition2: 所有key为2和3的消息都写入了partition2
2.2 读Kafka
2.2.1 1个topic,1个partition,2个消费实例(同一消费组)
步骤1:
启动2个消费实例,然后往partition中生产消息,实例A未消费,只有实例B在消费partition
。
实例B消费:
实例A未消费:
步骤2:
当suhtdown正在消费的实例B时,过了一段时间后(大概45秒),实例A开始消费partition
。
步骤3:
当重新启动实例B后(几乎没有时间间隔),实例B继续消费partition,而实例A不再消费
。
实例B消费:
实例A不再消费:
2.2.2 1个topic,2个partition,3个消费实例(同一消费组)
步骤1:
启动3个消费实例,然后往2个partition中生产消息,会发现 有一个实例不消费,另外两个实例分别消费一个partition。
实例A消费partition1,实例B消费partition0,实例C不消费。
实例A消费partition1(列车1的消息)
实例B消费partition0(列车2的消息)
步骤2:
shutdown其中一个正在消费的实例B,一段时间后(大概45秒), 剩下的两个实例重新分配partition进行消费。
实例A消费partition0(列车2),实例C消费partition1(列车1)。
实例A消费partition0(列车2):
实例C消费partition1(列车1)::
步骤3:
重新启动实例B后(几乎没有时间间隔),实例B继续消费partition0(列车2),同时实例C不再消费。
实例B消费partition0(列车2):
实例C不再消费:
2.2.3 1个topic,2个partition,3个消费实例,两个消费组的情况(其中2个实例一个消费组,第3个实例属于另一个消费组)
步骤1:
启动3个消费实例(实例A和B属于消费组1,实例C属于消费组2),然后往2个partition中生产消息,会发现 实例A消费partition1,实例B消费partition0,实例C同时消费partition0和partition1
。
实例A消费partition1(列车1)
实例B消费partition0(列车2)
实例C消费partition0(列车2)和partition1(列车1)
更多推荐
所有评论(0)