首页 > 解决方案 > 超时异常的 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

使用此设置,我们面临以下问题:

  1. 当生产者放入大量消息时,有时生产者会抛出一个异常说 Batch Expired as linger time has been passed. 我知道当生产者的投放速度快于消费者的消费速度时会出现此异常,但是我是否可以设置任何配置来防止此异常并等到消费者能够消费。因为这是一个流数据,应用程序不能丢失任何消息,而且顺序也很重要。

  2. 我看到的另一个问题是当生产者甚至发布 10-15 条消息时,该消息在大约 6 秒后到达消费者。如果消息数量很大,这种延迟会不断增加。我检查了代理日志并观察到,一旦它到达代理,消费者就可以使用它。但它会在 5-6 秒后到达经纪人。这里的负载并不多,仍然需要 6 秒。我应该如何提高性能。我的应用程序从上游接收数据并发布到 kafka 主题 1。从这个 kafka 主题 1 另一个应用程序使用和聚合基于密钥的数据并发布到另一个 kafka 主题 2

主题 1 是主题 2 的生产者,因此根据我们的分析,主题发布很好,但主题 1 的消费有延迟。我们认为这是因为经纪人。

标签: apache-kafka

解决方案


如果您看到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

推荐阅读