我有一个用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,并且永远不会解除阻塞,直到手动重启应用为止。
仅供参考,我的环境详细信息:
recordChannelGauge
的最新版本。该库未使用版本,它使用的是最新的git commit,截至撰写本文时,该提交已存在2个月了,所以我确定我使用的是最新版本。我怀疑这是由于confluentinc go客户端中的某些内部问题所致,在该客户端中,它无法适当地处理某些错误情况。
此外,在出现问题期间,我看不到任何相关的日志输出。我确实看到零星的Kafka代理断开连接,并且在问题似乎不太严重之前发生了日志中的错误超时。这些日志消息每隔几小时左右就会发生几天,而不会造成严重后果。
github.com/confluentinc/confluent-kafka-go/kafka
答案 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/
希望对你有所帮助。