一、需求背景:
springboot项目配置两个不同kafka集群。原有kafka(kafka1)配置保持不变,采用默认配置方式,第二个kafka(kafka2)采用自定义配置进行配置。
二、问题现象以及分析:
向kafka2推送消息时,第一次总是发送失败,并出现以下日志。
org.apache.kafka.common.errors.TimeoutException: Expiring 6 record(s) for topicxxx: 30031 ms has passed since batch creation plus linger time
1.将两个kafka配置调换位置后,kafka2依然会出现这个报错,确认本地代码没有问题。
2.分析两个kafka异同,kafka1是单机、默认配置,kafka2是集群且开启了 SASL认证、配置情况未知,将kafka1更换为新的集群,经过测试无问题,因此初步定位开启SASL认证导致的。
通过翻阅资料,在开启SASL认证后,底层在InetAddressSocket时将ip理解成域名进行解析,解析失败后才会以正常的ip进行解析,而在域名解析时,会花费较多的时间。而在使用kafka2进行消息推送时,由于时懒加载方式,只有send时才会初始化kafka配置,因此导致推送的元数据在完成认证前过期而抛出以上日志。
三、解决方案:
增加元数据失效时间;
通过配置客户端所在服务器域名解决。
四、最终方案:
采用增加元数据失效时间完成问题解决。