apache-kafka - 超时异常的 Kafka 代理性能问题
问题描述
我们有以下 Kafka 设置
Partition - 10
Replication - 3
fetch.max.byte at broker - 32MB
Producer
max.block.ms =- 5min
request.timeout.mm - 5min
retries - 4
Consumer
No custom config
Message size - 1kb
使用此设置,我们面临以下问题:
当生产者放入大量消息时,有时生产者会抛出一个异常说 Batch Expired as linger time has been passed. 我知道当生产者的投放速度快于消费者的消费速度时会出现此异常,但是我是否可以设置任何配置来防止此异常并等到消费者能够消费。因为这是一个流数据,应用程序不能丢失任何消息,而且顺序也很重要。
我看到的另一个问题是当生产者甚至发布 10-15 条消息时,该消息在大约 6 秒后到达消费者。如果消息数量很大,这种延迟会不断增加。我检查了代理日志并观察到,一旦它到达代理,消费者就可以使用它。但它会在 5-6 秒后到达经纪人。这里的负载并不多,仍然需要 6 秒。我应该如何提高性能。我的应用程序从上游接收数据并发布到 kafka 主题 1。从这个 kafka 主题 1 另一个应用程序使用和聚合基于密钥的数据并发布到另一个 kafka 主题 2
主题 1 是主题 2 的生产者,因此根据我们的分析,主题发布很好,但主题 1 的消费有延迟。我们认为这是因为经纪人。
解决方案
如果您看到linger.ms
超出时间的异常,则意味着这批消息已在发送缓冲区中超过linger.ms
. 您可以设置linger.ms
为零让生产者立即向代理发送消息。
根据您的描述,延迟发生在生产方。除了设置linger.ms
为零之外,调整以下设置可能有助于减少生产延迟:
acks= 1 # Leader will write the record to its local log but will
# respond without awaiting full acknowledgement from all followers.
batch.size # reduce the batch size so that the producer do not wait for
# a larger batch size
delivery.timeout.ms # this is available since Kafka 2.1, and allows you
# specify clearly on delivery timeout
max.in.flight.requests.per.connection # increase # of inflight request can
# help to improve throughput
推荐阅读
- c# - 无法从 android studio 项目连接到 localhost webapi
- r - 在状态列上调用 group_by 时 dplyr 不起作用
- javascript - 在 javascript 中给出图像的来源时如何使用变量?
- python - 需要帮助使用 Loc 来分类和替换数字
- javascript - javascript中的对象方法和缩短的对象方法语法有什么区别?
- java - 为什么除非用户连接到服务器,否则 SpringBoot 应用程序无法访问远程文件(sshfs)?
- c++ - 在 for 循环中使用 return 语句
- c++ - 如何从 cin 和 getline 定义多个变量?
- go - 具有代理和 json 凭据的 http 客户端
- android - 如何检测 iOS 和 Android 是否处于省电模式并向正文添加 CSS 类?