如何选择Kafka Topic的分区数
在kafka中, topic的分区是并行计算的单元. 在producer端和broker端, 可以同时并发的写数据到不同的分区中. 在consumer端, Kafka总是将某个分区分配个一个consumer线程. 因此同一个消费组内的并行度与分区数息息相关.
Partition分区数的大小, 更多直接影响到消费端的吞吐(一个分区只能同一消费组的一个消费者消费). 分区数小, 消费端的吞吐就低. 但是太大也会有其他的影响
原则:
- 更多的分区可提高吞吐量
- 分区数越多打开的文件句柄越多
- 分区数越多降低可用性
- 更多的分区增加端到端的延迟
- 客户端需要更多的内存
归根结底还是得有个度. 如何找出这个度?
有个粗略的计算公式: max(t/p, t/c)
. t
就是所预期吞吐量, p
是当前生产端单个分区的吞吐, 那c
就是消费端单个分区的吞吐.
比如单个partition的生产端吞吐是200, 消费端是100. 预期的吞吐是500, 那么partition的数量就是5.
单个分区的吞吐通常通过修改配置来提升, 比如生产端的批处理大小, 压缩算法, acknowledgement类型, 副本数等. 而在消费端则更依赖于消息的处理速度.