代码之家  ›  专栏  ›  技术社区  ›  clay

Go Kafka`ProduceChannel()`加满并挂断

  •  2
  • clay  · 技术社区  · 7 年前

    我有一个用Go编写的服务器端应用程序,用于制作卡夫卡事件。它可以正常运行数天,每秒产生约1.6k消息,然后遇到一个偶发问题,所有卡夫卡消息发送都停止,需要手动重启服务器应用程序才能恢复卡夫卡消息发送。

    我已经附上了事件开始时的度量图截图。要注释我所看到的情况:

    • 在七天的时间里,这个应用程序运行得非常完美。对于排队的每封邮件,都会向发送一个传递事件通知 kafkaProducer.Events() .您可以看到num queued=num delivered。

    • 10:39:问题开始了。传递通知计数迅速降至零。卡夫卡消息不断排队,但回调停止了。

    • 10:52: kafkaProducer.ProduceChannel() 已满,并尝试将新消息排队进入go通道阻止goroutine。此时,除非手动重新启动,否则应用程序将不会再发送另一条卡夫卡消息。

    • 17:55:我手动重新启动了应用程序。卡夫卡消息队列/传递继续。卡夫卡的尝试次数降至零。

    我的围棋代码发送卡夫卡信息的唯一地方是:

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

    在公制屏幕截图中,请注意 recordChannelGauge 通常保持为零,因为向卡夫卡发送消息 ProduceChannel() 不会阻塞每个 Inc() 紧接着是匹配的 Dec() 然而,当 ProduceChannel() 满了,goroutine街区和 记录仪 保持在1,并且在手动重新启动应用程序之前永远不会解除阻止。

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

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

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

    此外,在出现问题时,我没有看到相关的日志输出。我确实看到,在问题发生之前,日志中偶尔出现卡夫卡代理断开连接和超时错误,这些错误似乎并不严重。这些日志消息每隔几个小时左右发生一次,持续数天,没有造成严重后果。

    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
    

    放大到问题发生

    Zoomed in to problem occurrence

    缩小显示之前和之后

    Zoomed out to show before and after

    0 回复  |  直到 7 年前
        1
  •  0
  •   iDream    5 年前

    我和你有类似的问题。我发现了一篇文章可以解释问题的原因。

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

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

    我希望它能对你有所帮助。

    推荐文章