转到Kafka`ProduceChannel()`填满并挂起

时间:2018-11-26 20:33:17

标签: go apache-kafka kafka-producer-api confluent-kafka

我有一个用Go语言编写的服务器端应用程序,用于产生Kafka事件。它可以完美运行几天,产生约1.6k msg / sec,然后遇到一个零星的问题,即所有Kafka消息发送都停止了,需要手动重新启动服务器应用程序才能使Kafka消息继续发送。

事件发生时,我已经包含了指标图的屏幕截图。注释我所看到的情况:

  • 在七天内,该应用程序完美运行。对于排队的每个消息,都有一个发送事件通知发送到kafkaProducer.Events()。您可以看到已排队的num =已交付的num。

  • 10:39:问题开始了。交货通知计数迅速下降到零。 Kafka消息不断排队,但回调停止。

  • 10:52:kafkaProducer.ProduceChannel()已满,并试图将新的消息排队到go通道中,从而阻止了goroutine。此时,除非手动重新启动,否则该应用程序将永远不会再发送另一条Kafka消息。

  • 17:55:我手动重新启动了该应用程序。 kafka消息队列/传递继续。 kafka_produce_attempts降为零。

我的Go代码发送Kafka消息的唯一位置是这里:

    recordChannelGauge.Inc()
    kafkaProducer.ProduceChannel() <- &msg
    recordChannelGauge.Dec()

在度量标准屏幕快照中,请注意recordChannelGauge通常保持为零,因为将消息发送到Kafka ProduceChannel()不会被阻止,并且每个Inc()之后都会紧跟着一个匹配的{{ 1}}但是,当Dec()被填满时,goroutine会阻塞,而ProduceChannel()会保持为1,并且永远不会解除阻塞,直到手动重启应用为止。

仅供参考,我的环境详细信息:

  • 使用golang 1.10.x构建的Go服务器二进制文件
  • recordChannelGauge的最新版本。该库未使用版本,它使用的是最新的git commit,截至撰写本文时,该提交已存在2个月了,所以我确定我使用的是最新版本。
  • 服务器操作系统Ubuntu 16.04.5
  • librdkafka1版本librdka0.11.6〜1confluent5.0.1-

我怀疑这是由于confluentinc go客户端中的某些内部问题所致,在该客户端中,它无法适当地处理某些错误情况。

此外,在出现问题期间,我看不到任何相关的日志输出。我确实看到零星的Kafka代理断开连接,并且在问题似乎不太严重之前发生了日志中的错误超时。这些日志消息每隔几小时左右就会发生几天,而不会造成严重后果。

github.com/confluentinc/confluent-kafka-go/kafka

关注问题的发生

Zoomed in to problem occurrence

缩小以显示之前和之后

Zoomed out to show before and after

1 个答案:

答案 0 :(得分:0)

我和你有类似的问题。我找到了一篇可能解释问题原因的文章。

当被阻止的主题中没有消息时,一段时间后,您将出现如下超时错误。

%5|1598190018.518|REQTMOUT|rdkafka#consumer-1| [thrd:sasl_ssl://abcd....confluent.cloud:xxxx/2]: sasl_ssl://abcd....confluent.cloud:xxxx/2: Timed out FetchRequest in flight (after 359947ms, timeout #0)
%4|1598190018.840|REQTMOUT|rdkafka#consumer-1| [thrd:sasl_ssl://abcd.confluent.cloud:xxxx/2]: sasl_ssl://abcd.xxxxx.confluent.cloud:xxxx/2: Timed out 1 in-flight, 0 retry-queued, 0 out-queue, 0 partially-sent requests

文章链接:https://www.thecodebuzz.com/apache-kafka-net-client-producer-consumer-csharp-confluent-examples-ii/

希望对你有所帮助。