

排查流程





调试
改进与思考
1.总结
(1)confluent-kafka-go库中的生产者Api发送数据是一个异步的过程。
(2)生产者Api通过一种叫做delivery reports的信息来描述该条消息发送结果成功与否,delivery reports默认被发送进名字是Events的信道中。
(3)Events管道的开关配置、最大容量在NewProducer实例化时配置,在实例调用Produce时可指定不同的Events
(4)Events管道容量耗尽时会阻塞生产者发送数据。
2.改进
服务器上的该Go程序的问题,可以有两种手段解决:
(1)在NewProducer实例化配置时设置go.delivery.reports为false,从而关闭该功能。
(2)默认情况下go.delivery.reports是开启的,需要确保子协程能一直处理Events中的delivery.reports数据。
3.建议
(1)如果业务场景不能容忍数据丢失的情况,则需要:
a.NewProducer实例化时配置go.delivery.reports开启
b.增加子协程来处理Events管道中的delivery reports数据,对于delivery reports显示消息发送失败的情况,需要增加重传的逻辑,确保消息被Kafka端成功收到。
c.程序运行中需要关注该Events管道的容量,避免管道容量耗尽的情况。
(2)如果业务可容忍数据丢失时,可关闭该功能,以提高程序的性能。
4.思考
最初top排查程序异常时,发现内存占用1.4G,相对程序调试运行时的内存占用100MB 相差十倍,作为一个非大量数据计算存储程序,内存不应占用这么多,起初的思路也可以沿着程序中是否有数据积压的可能去排查。



文章转载自BUG侦探,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




