【发布时间】: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