Apache kafka 未使用的卡夫卡主题/分区的成本

Apache kafka 未使用的卡夫卡主题/分区的成本,apache-kafka,architecture,event-stream-processing,Apache Kafka,Architecture,Event Stream Processing,在设计流处理管道时,如果我有许多主题,其中至少有一个分区,但可能没有数据进入其中,那么会产生什么成本 例如,对于一个消费者,我可以选择一个包含所有数据和多个分区的“大主题”,或者我可以选择将数据(按租户、帐户或用户等)拆分为多个主题,默认情况下,使用单个分区。对于第二种情况,我担心会有很多主题/分区看不到数据。那么,这个未使用的分区是否会产生任何成本,或者一个未使用的主题是否不会产生任何成本。假设所提到的主题没有被压缩,那么保留任何最初生成的数据会产生初始开销,但在这之后,一个空的主题就会被压缩

在设计流处理管道时,如果我有许多主题,其中至少有一个分区,但可能没有数据进入其中,那么会产生什么成本


例如,对于一个消费者,我可以选择一个包含所有数据和多个分区的“大主题”,或者我可以选择将数据(按租户、帐户或用户等)拆分为多个主题,默认情况下,使用单个分区。对于第二种情况,我担心会有很多主题/分区看不到数据。那么,这个未使用的分区是否会产生任何成本,或者一个未使用的主题是否不会产生任何成本。

假设所提到的主题没有被压缩,那么保留任何最初生成的数据会产生初始开销,但在这之后,一个空的主题就会被压缩

  • zookeeper中的元数据
  • 任何使用者组协调器中的元数据,以及任何活动使用者线程浪费的处理
  • 磁盘上的空目录

  • 对于前两种情况,拥有大量主题可能会增加请求延迟,从而导致不健康的集群。

    首先,一个fat主题和大量分区以及多个包含少量分区的主题之间没有区别。本主题仅用于事件之间的逻辑区别。卡夫卡只关心分区的数量

    其次,有很多分区会导致一些问题:

    • 打开的文件太多:
    每个分区映射到代理中文件系统中的一个目录。 在该日志目录中,将有两个文件(一个用于索引) 另一个用于实际数据)每个日志段

    • 在代理和使用者中,更多的分区需要更多的内存 双方:
    代理为每个代理分配一个大小为replica.fetch.max.bytes的缓冲区 他们复制的分区。如果replica.fetch.max.bytes设置为1 MiB, 您有1000个分区,大约需要1GiB的RAM

    • 更多分区可能会增加不可用性:
    如果作为控制器的代理失败,则zookeeper选择另一个代理作为控制器。此时,新选择的代理应该在初始化期间从Zookeeper读取每个分区的元数据

    例如,如果Kafka集群中有10000个分区 从ZooKeeper初始化元数据每个分区需要2毫秒, 这会使不可用性窗口再增加20秒

    您可以从以下链接获得更多信息:

    仅更新(如果您正在使用confluent cloud),从2020年7月1日起,confluent每“分区小时”的费用也将增加。加起来相当多。