序言

Kafka的分区是提升其高吞吐量的必要条件。因为每个Consumer Group 中只能有一个机器去消费Topic中的某一个分区,即Topic中的分区只能被同一个消费组中的一个服务消费

因为分区的存在,在同一个Topic下的情况下

  1. Kafka Producer 会启动多个线程,分别去连接不同broker上的分区,并生产数据
  2. Kafka Consumer 会启动多个线程,分别去监听不同broker上的分区,并接收数据

分区设置

分区的数量是提高Kafka的基础。但是多过的分区也会带来额外的开销。

且分区的被超过多个consumer上进行消费时(即在一个java工程中有多个listener),每个分区的在对同一个consumer group的消息是被串行消费的。

内存空间

每个分区要支持批量提交与批量消费,所以每个分区都会需要占用一部分内存。当一台服务器有过多的分区后,这部分的内存空间就会非常大。

这里的批量主要针对的是客户端,而非kafka服务器。

句柄数

每个分区在系统上都对应了一个文件夹。该文件下的2个文件会占用到句柄数:索引文件和数据文件。系统的句柄数是有限制的,linux默认为1024,可以通过ulimit修改。这里的1024是针对一个进程的,同理也是针对一个jvm的最大句柄数cuiyaonan2000@163.com

副本的影响

多过的分区就会有成本的副本出现。副本之间Leader的选举,副本之间数据的同步,副本占用磁盘空间容量。都会在不同程度影响Kafka的性能

轮询策略

Producer

  • Kafka根据传递消息的key来进行分区的分配,即hash(key) % numPartitions
  • 当没有Key时,Kafka几乎就是随机找一个分区发送无key的消息,然后把这个分区号加入到缓存中以备后面直接使用

Consumer

  • range(默认):针对同一主题而言, 即如果有10个分区,3个consumer,则每个consumer监听3个分区,第一个consumer监听4个分区。---即尽量平均分配的原则:如果有多余依次每个consumer增加一个cuiyaonan2000@163.com
  • roundrobin:针对所有的主题而言。针对所有的主题进行平均分配,而不是只针对同一个分区。