在设计流处理管道时,如果我有许多主题至少有一个分区,但可能没有数据进入其中,可能会产生什么成本?
例如,对于一个消费者,我可以选择有一个包含所有数据和许多分区的"大型主题",或者我可以选择将数据(按租户、帐户或用户等(拆分为多个主题,默认情况下,只有一个分区。我对第二种情况的担忧是,会有很多主题/分区看不到数据。那么,这个未使用的分区是否会产生任何成本,或者未使用的主题是否没有产生任何成本。
首先,一个胖主题和大量分区以及多个包含几个分区的主题之间没有区别。主题只是为了在事件之间进行逻辑区分。Kafka 只关心分区的数量。
其次,拥有大量分区可能会导致一些问题:
- 打开的文件过多:
每个分区映射到代理文件系统中的一个目录。 在该日志目录中,将有两个文件(一个用于索引( 另一个用于实际数据(每个日志段。
- 更多的分区在代理和使用者中需要更多的内存 双方:
代理为每个缓冲区分配一个大小为 replica.fetch.max.bytes 的缓冲区 他们复制的分区。如果 replica.fetch.max.bytes 设置为 1 MiB, 并且您有 1000 个分区,大约需要 1 GiB 的 RAM。
- 更多分区可能会增加不可用:
如果作为控制器的代理失败,则 zookeeper 选择另一个代理作为控制器。此时,新当选的代理应该在初始化期间从 Zookeeper 读取每个分区的元数据。
例如,如果 Kafka 集群中有 10,000 个分区,并且 从 ZooKeeper 初始化元数据每个分区需要 2 毫秒, 这可能会使不可用窗口再增加 20 秒。
您可以从以下链接获得更多信息:
https://www.confluent.io/blog/how-choose-number-topics-partitions-kafka-cluster/https://docs.cloudera.com/documentation/kafka/latest/topics/kafka_performance.html
假设提到的主题没有被压缩,那么保留任何初始生成的数据的初始开销,但之后,空主题只是
- Zookeeper 中的元数据 任何使用者
- 组协调器中的元数据,以及任何活动使用者线程浪费的处理
- 磁盘上的空目录
对于前两个,具有大量主题可能会增加请求延迟,从而导致集群运行状况不佳。