我怎样才能更快地从卡夫卡阅读

How can I read faster from Kafka

我创建了一个新的 Kafka 服务器(我创建了 1 个具有 1 个分区的代理)并且我使用 java 代码成功地从该服务器生产和消费,但我对我的事件数量不满意'作为消费者每秒读取米数。

我已经玩过以下消费者设置:

AUTO_OFFSET_RESET_CONFIG = "earliest"
FETCH_MAX_BYTES_CONFIG = 52428800
MAX_PARTITION_FETCH_BYTES_CONFIG = 1048576
MAX_POLL_RECORDS_CONFIG = 10000
pollDuration = 3000

但无论我为每个设置输入什么值,结果都保持不变

目前,我向 Kafka 生成了 100,000 条消息。 每条消息大小为 2 KB,读取所有批次的 100000 条记录需要 20669 毫秒或 20 秒(总时间),这意味着每秒 5000 条记录。

我希望它更高,我可以设置的最理想值是多少,或者我可能需要使用其他设置,或者我可能需要以其他方式设置我的 Kafka 服务器(多个代理或分区)?

除了您提到的设置并忽略水平 scaling/partitioning:

如果您不使用压缩,那就去做吧!

来自维基:

If enabled, data will be compressed by the producer, written in compressed format on the server and decompressed by the consumer.

lz4 压缩类型根据我的经验证明是一个很好的压缩类型,制作人的示例设置:

compression.type = lz4
batch.size = 131072
linger.ms = 10

这意味着在网络中传输的数据更少,另一方面 cpu 使用 compression/decompression。

您可以在 this 我给出的与超时相关的其他答案中找到与批处理和延迟时间相关的更多信息,但它主要针对生产者部分。

从基本的角度来看 - kafka 客户端每个 "broker of interest" 维护一个套接字(==任何引导他们关心的主题分区的代理)。 在这个套接字上,kafka 一次只会做一个 request/response(max.in.flight.requests.per.connection 有一个生产者设置,但经纪人一次只服务一个)。 这意味着,总的来说,如果你想要更多的带宽,你需要更多的套接字和更大的请求。这意味着多个代理 and/or 多个客户端,而且肯定不止一个分区。 至于你可以根据你的情况调整的东西(单个客户端、单个分区、单个套接字):

FETCH_MAX_BYTES_CONFIG = 52428800
MAX_PARTITION_FETCH_BYTES_CONFIG = 1048576

您将整体响应的最大大小设置为 50MB,但将同一响应中任何特定分区的数据大小限制为 1MB。在您的情况下(1 个分区),这意味着您的最大响应大小实际上是 1MB。顶一下。

如其他答案所述,您可以为您的主题启用压缩(理想情况下在生产者方面,尽管可以将代理配置为 "transcode"),您还可以尝试其他影响较小的check.crcs 和 receive.buffer.bytes

等参数

有关消费者配置的完整列表 - 请参阅 https://kafka.apache.org/documentation/#consumerconfigs