上篇文章我们了解到,如果一个topic
分区越多,理论上整个集群所能达到的吞吐量就越大。那么,分区数越多就越好吗?显然不是。今天我们来聊下kafka
在分区数过多的情况下,会带来哪些弊端。
内存开销
客户端producer
有个参数batch.size
默认为16KB。它会为每个分区缓存消息,一旦批次数满了后,将消息批量发出。一般来说,这个设计是用于提升吞吐性能的。但是由于这个参数是partition
级别的,如果分区数越多,这部分缓存所需的内存占用也会越多。假如有10000个分区,按照默认配置,这部分缓存就要占用约157MB的内存。而consumer
端呢?抛开拉取数据所需的内存不说,单说线程的开销。如果还是10000个分区,同时consumer
线程数要匹配分区数的话(大部分情况下是最佳的消费吞吐量配置),那么在consumer client
就要创建10000个线程,也需要创建大约10000个Socket
去获取分区数据,这里面的线程切换的开销本身就已经不容小觑了。
服务器端的开销也不小,如果阅读kafka
源码的话就会发现,服务器端的很多组件在内存中维护了partition
级别的缓存,比如controller
,FetcherManager
等,因此分区数越多,这种缓存的成本就越大。