【问题标题】:Go Kafka `ProduceChannel()` Fills Up and HangsGo Kafka `ProduceChannel()` 填满并挂起
【发布时间】:2019-04-28 12:59:50
【问题描述】:

我有一个用 Go 编写的服务器端应用程序,用于生成 Kafka 事件。它可以完美运行数天,产生约 1.6k 消息/秒,然后遇到一个零星问题,即所有 Kafka 消息发送停止,并且需要手动重新启动服务器应用程序以使 Kafka 消息恢复发送。

我已经附上了事件开始时指标图表的屏幕截图。注释我看到的情况:

  • 应用程序在 7 天内完美运行。对于排队的每条消息,都会向kafkaProducer.Events() 发送一个传递事件通知。可以看到 num queued = num Delivered。

  • 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() 后面紧跟着一个匹配的 Dec() 但是,当 @ 987654332@ 被填满,goroutine 阻塞,recordChannelGauge 保持为 1 并且永远不会解除阻塞,直到应用手动重启。

仅供参考,我的环境详情:

  • 使用 golang 1.10.x 构建的 Go 服务器二进制文件
  • github.com/confluentinc/confluent-kafka-go/kafka 的最新版本。这个库不使用版本,它使用的是最新的 git commit,截至撰写本文时,它已有 2 个月的历史,所以我确定我使用的是最新版本。
  • 服务器操作系统 Ubuntu 16.04.5
  • librdkafka1 版本 librdka0.11.6~1confluent5.0.1-

我怀疑这是由于 confluentinc go 客户端中的一些内部问题,它没有适当地处理一些错误场景。

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

Nov 26 06:52:04 01 appserver.linux[6550]: %4|1543215124.447|REQTMOUT|rdkafka#producer-1| [thrd:kafka-broker-3:9092/bootstrap]: kafka-broker-3:9092/bootstrap: Timed out 0 in-flight, 1 retry-queued, 0 out-queue, 0 partially-sent requests
Nov 26 06:52:10 01 appserver.linux[6550]: %4|1543215130.448|REQTMOUT|rdkafka#producer-1| [thrd:kafka-broker-3:9092/bootstrap]: kafka-broker-3:9092/bootstrap: Timed out 0 in-flight, 1 retry-queued, 0 out-queue, 0 partially-sent requests
Nov 26 08:46:57 01 appserver.linux[6550]: 2018/11/26 08:46:57 Ignored event: kafka-broker-2:9092/bootstrap: Disconnected (after 600000ms in state UP)
Nov 26 08:47:02 01 appserver.linux[6550]: %4|1543222022.803|REQTMOUT|rdkafka#producer-1| [thrd:kafka-broker-2:9092/bootstrap]: kafka-broker-2:9092/bootstrap: Timed out 0 in-flight, 1 retry-queued, 0 out-queue, 0 partially-sent requests
Nov 26 08:47:09 01 appserver.linux[6550]: %4|1543222029.807|REQTMOUT|rdkafka#producer-1| [thrd:kafka-broker-2:9092/bootstrap]: kafka-broker-2:9092/bootstrap: Timed out 0 in-flight, 1 retry-queued, 0 out-queue, 0 partially-sent requests

放大到问题发生

缩小显示之前和之后

【问题讨论】:

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


    【解决方案1】:

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

    当被屏蔽主题中没有消息时,一定时间后,会出现如下超时错误。

    %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/

    希望对你有所帮助。

    【讨论】:

      猜你喜欢
      • 2018-08-16
      • 1970-01-01
      • 2019-09-27
      • 2014-02-09
      • 2019-05-13
      • 1970-01-01
      • 2015-10-30
      • 1970-01-01
      • 2011-06-29
      相关资源
      最近更新 更多