背景
- 测试服FLink发送消息至kafka的topicA
- 相比线上服来说,测试服这次是全量跑数,发的数据远大于线上服正在往topicA发的量,数量非常巨大
报错
[04:01:17:52:32:627] ERROR [kafka-producer-network-thread | producer-1] [] [] [] @@LoggingProducerListener@@ | Exception thrown when sending a message with key='null' and payload='nnn' to topic topicA:
org.apache.kafka.common.errors.TimeoutException: Expiring 74 record(s) for topicA-1: 33303 ms has passed since last append
在Flink任务启动不久后出现大批量的如上报错
分析
源码逻辑如上,分析应该跟kafka broker端无关,是producer当中的batch批次满了后,未从分区对应的内存队列中(生产者源码)发送出,反而expired,就会报这个错
解决措施
从ELK查看了下send message的beat数目,得到每秒钟、每分钟大概发送多少条数据,从而计算了下每秒钟发送消息的大小,然后修改对应的batch size以及buffer memory,再将linger.ms从0ms改大至1000ms(因为我们这个场景是测试服跑数据,对消息的延迟性并不做过多要求)