序言
Kafka的分区是提升其高吞吐量的必要条件。因为每个Consumer Group 中只能有一个机器去消费Topic中的某一个分区,即Topic中的分区只能被同一个消费组中的一个服务消费
因为分区的存在,在同一个Topic下的情况下
- Kafka Producer 会启动多个线程,分别去连接不同broker上的分区,并生产数据
- 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:针对所有的主题而言。针对所有的主题进行平均分配,而不是只针对同一个分区。