分区机制

Kafka 中的分区机制指的是:将每个主题划分成多个分区(Partition),每个分区是一组有序的消息日志。生产者生产的每条消息只会被发送到一个分区中,也就是说如果向一个双分区的主题发送一条消息,这条消息要么在分区 0 中,要么在分区 1 中。
不同的分区能够被放置到 Kafka 集群中不同节点的机器上,而数据的读写操作也都是针对分区这个粒度而进行的,每个节点的机器都能独立地处理各自分区的读写请求。

分区策略

所谓分区策略就是决定生产者将消息发送到哪个分区的算法。
Kafka 为我们提供了默认的分区策略,同时它也支持自定义分区策略。
常见的分区策略有以下几种:

  • 轮询策略:顺序将消息放置到一个分区
  • 随即策略:随机将消息放置到一个分区
  • 按消息键保序策略:Kafka 允许为每条消息定义消息键 Key,可以保证同一个 Key 的所有消息都进入到相同的分区里面,由于每个分区下的消息处理都是有顺序的,故这个策略被称为按消息键保序策略

    为什么要分区

    为什么使用分区的概念而不是直接使用多个主题呢?

如何思考这类“为什么”问题


思考「分区」的作用:

  1. 提供负载均衡的能力,增加系统的吞吐量
  2. 实现系统的高可拓展
  3. 利用分区也可以实现其他一些业务级别的需求,比如:实现业务级别的消息顺序的问题(自定义分区策略)

    如何理解「分区」提供负载均衡的能力呢? 负载均衡(Load Balance)的意思就是:分摊到多个操作单元上进行执行。 Kafka 将主题中的数据存储分摊到多个分区上,不同的分区能够被放置到 Kafka 集群中不同节点的机器上,而数据的读写操作也都是针对分区这个粒度而进行的,这样每个节点的机器都能独立地处理各自分区的读写请求,增加了整体系统的吞吐量(Kafka 的吞吐量就是:单位时间内处理请求的数量)。

    如何理解「分区」实现系统的高可拓展呢? Kafka 实现了分区动态上下线,我们可以通过添加新的节点机器,进而增加新的分区,分摊主题内其他分区的压力,实现对系统的拓展,达到增加整体系统的吞吐量的目的。


思考如果不分区,而是使用多个主题会发生什么样的场景,为什么不能发生上述的场景,发生了上述的场景会怎么样,会出现什么问题
生产者将同一主题的数据发送到一个机器上,系统的吞吐量太小,无法拓展。