java - 如何更快地读取 Kafka

标签 java apache-kafka kafka-consumer-api producer-consumer consumer

我创建了一个新的 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 服务器(多个代理或分区)?

最佳答案

除了您提到的设置和忽略水平缩放/分区之外:

如果您不使用压缩,就使用压缩!

来自维基百科:

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 使用率更高。

您可以在this中找到与批处理和停留时间相关的更多信息我给出的其他答案与超时有关,但它重点关注生产者部分。

关于java - 如何更快地读取 Kafka,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57414333/

相关文章:

java - 转换为 Message 数组

javascript - 无需按钮即可动态更改JSP页面内容

apache-kafka - 在架构注册表中存储 Avro 架构

apache-kafka - 使用复制不足的分区修复 kafka 集群

apache-kafka - Kafka 在有状态处理中验证消息

java - Xtend 中的类构造函数

java - Spring 启动: Rest endpoint integration with Kafka

java - 如何获取每个分区当前最新的偏移量,然后只消耗该偏移量?

elasticsearch - 用kafka接收器在elasticsearch中重命名索引

java - 为什么这个静态导入不编译