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)
在这里插入图片描述

Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐