3k kafka 主题会降低性能吗?
Are 3k kafka topics decrease performance?
我有一个 Kafka 集群(在 AWS 上使用 Aivan):
卡夫卡硬件
Startup-2 (2 CPU, 2 GB RAM, 90 GB storage, no backups) 3-node high availability set
- 我的消费者和 Kafka Broker 之间的 Ping 是 0.7 毫秒。
后台
我的主题是:
- 它包含大约 3000 个实体的数据。
- 实体生命周期为一周。
- 每周会有不同的 3000 个实体(平均)。
- 每个实体可能总共有 15k 到 50k 条消息。
- 每秒最多 500 条消息。
建筑
我的团队构建了一个架构,这样就会有一组消费者。他们将解析这些数据,执行一些转换(没有任何过滤!!)然后 将最终消息发送回 kafka 到 topic=<entity-id>
.
意思是我把数据上传回kafka到一个topic,只包含一个特定实体的数据。
问题
在任何给定时间,kafka 中最多可以有 3-4k 个主题(每个唯一实体 1 个主题)。
- 我的kafka能搞定吗?如果不是,我需要更改什么?
- 我是否需要删除一个主题,或者随着时间的推移有(很多!!)未使用的主题没问题?
- 每个消费最终消息的consumer,会同时消费100个topic。我知道 kafka 客户端可以同时使用多个主题,但我不确定最佳实践是什么。
- 请分享您的疑虑。
要求
- 请关注此架构的潜在问题,尽量不要谈论替代架构(话题少,消费者多等)。
主题数量本身并不重要,但每个 Kafka 主题都是分区的,分区总数可能会影响性能。
Apache Kafka 社区的 general recommendation 每个代理的分区数不超过 4,000 个(包括副本)。链接的 KIP 文章解释了如果违反限制可能会遇到的一些问题,如果主题有 3,000 个,那么这样做很容易,除非您为每个主题选择较低的分区数 and/or 复制因子。
为主题选择较低的分区数有时不是一个好主意,因为它会限制读写的并行度,从而导致客户端出现性能瓶颈。
为主题选择较低的复制因子有时也不是一个好主意,因为它会增加失败时数据丢失的可能性。
通常情况下,集群上有未使用的主题是可以的,但请注意,集群管理所有这些分区的元数据仍然会对性能产生影响,并且某些操作仍然会比主题不存在时花费更长的时间完全没有。
每个集群也有限制,但要高得多(200,000 个分区)。因此,只需增加集群的节点数,您的架构可能会得到更好的服务。
我有一个 Kafka 集群(在 AWS 上使用 Aivan):
卡夫卡硬件
Startup-2 (2 CPU, 2 GB RAM, 90 GB storage, no backups) 3-node high availability set
- 我的消费者和 Kafka Broker 之间的 Ping 是 0.7 毫秒。
后台
我的主题是:
- 它包含大约 3000 个实体的数据。
- 实体生命周期为一周。
- 每周会有不同的 3000 个实体(平均)。
- 每个实体可能总共有 15k 到 50k 条消息。
- 每秒最多 500 条消息。
建筑
我的团队构建了一个架构,这样就会有一组消费者。他们将解析这些数据,执行一些转换(没有任何过滤!!)然后 将最终消息发送回 kafka 到 topic=<entity-id>
.
意思是我把数据上传回kafka到一个topic,只包含一个特定实体的数据。
问题
在任何给定时间,kafka 中最多可以有 3-4k 个主题(每个唯一实体 1 个主题)。
- 我的kafka能搞定吗?如果不是,我需要更改什么?
- 我是否需要删除一个主题,或者随着时间的推移有(很多!!)未使用的主题没问题?
- 每个消费最终消息的consumer,会同时消费100个topic。我知道 kafka 客户端可以同时使用多个主题,但我不确定最佳实践是什么。
- 请分享您的疑虑。
要求
- 请关注此架构的潜在问题,尽量不要谈论替代架构(话题少,消费者多等)。
主题数量本身并不重要,但每个 Kafka 主题都是分区的,分区总数可能会影响性能。
Apache Kafka 社区的 general recommendation 每个代理的分区数不超过 4,000 个(包括副本)。链接的 KIP 文章解释了如果违反限制可能会遇到的一些问题,如果主题有 3,000 个,那么这样做很容易,除非您为每个主题选择较低的分区数 and/or 复制因子。
为主题选择较低的分区数有时不是一个好主意,因为它会限制读写的并行度,从而导致客户端出现性能瓶颈。
为主题选择较低的复制因子有时也不是一个好主意,因为它会增加失败时数据丢失的可能性。
通常情况下,集群上有未使用的主题是可以的,但请注意,集群管理所有这些分区的元数据仍然会对性能产生影响,并且某些操作仍然会比主题不存在时花费更长的时间完全没有。
每个集群也有限制,但要高得多(200,000 个分区)。因此,只需增加集群的节点数,您的架构可能会得到更好的服务。