创建数千个 Kafka 主题停止不报错

Creating thousands of Kafka topics stops without error

我最近编写了一个连接到 运行 Kafka 实例的应用程序,并通过循环中的 rest 端点按需创建多个主题。我记录每个 'create topic' 调用,它往往非常快(例如 100 毫秒来委托创建 10k 主题)。然后Kafka这边开始处理,持续几十秒,然后突然停止,没有任何错误。列出数据目录显示 Kafka 创建了大约 2.5k 的目录,而委托是 10k。以下端点调用也产生了类似数量的主题。

越来越多的 Kafka 实例不会改变结果(另外,在没有 zookeeper 的情况下切换到 Kafka 会产生相同的结果)。我究竟做错了什么?这是创建目录(系统日志为空)的 OS 限制吗?

是的,我知道 Kafka 不是为处理很多主题而创建的,但据我所知,它应该处理至少 100k~(使用无 zookeeper 的 KRaft 超过几百万)。

我的设置:

version: '3.5'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
  kafka-1:
    image: wurstmeister/kafka
    ports:
      - "9092:9092"
    environment:
      DOCKER_API_VERSION: 1.22
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181

我这样做有点蠢:

for (int i = 0; i < 10_000; i++) {
   adminClient.createTopics(List.of(new NewTopic(UUID.randomUUID().toString(), 1, (short) 1)));
}

当我先创建一个集合,然后委托创建时,它成功了,但仍然 - 如果我一个记录一个记录,一个端点一个端点地做呢?

好吧,根据您的设置存在一些限制 - 许多 brokers/zookeepers、配置、硬件和操作系统。对于 OS 限制,请参阅 https://kafka.apache.org/documentation/#os

您可以从这个 apache-kafka-supports-200k-partitions-per-cluster 博客中看到 post 他们如何设置集群以支持 200k 主题分区。

当时(Kafka 1.1.0),这是他们推荐的

we recommend each broker to have up to 4,000 partitions and each cluster to have up to 200,000 partitions.

但是对于 Kafka 2.8.0,来自 the Kafka The Definitive Guide 2nd Edition

Currently, in a well-configured environment, it is recommended to not have more than 14,000 partitions per broker and 1 million replicas per cluster.

不过,根据您的评论

I'm logging every 'create topic' call, and it tends to be extremely fast (like 100 ms to delegate creation of 10k topics).

我不认为 Kafka 实际上在 100 毫秒内创建了 10k 个主题。根据我从实验中发现的结果(当然,我正在尝试设置一个集群来处理超过 100k 的分区),我使用 librdkafka 在 C++ 中创建了我自己的生产者客户端。生产者是基于异步的。我可以轻松地向尚未存在的 10K 主题提交消息以强制创建主题。但实际上从代理那里获得成功的 ACK 需要一些时间。而且集群中在线分区越多,等待成功ACK的时间可能就越长。

我建议您为 Kafka 集群配备一个监控工具,这样您就可以实时查看设置的运行状况(如果您的集群不太忙)。