现象
生产中kafka集群一台服务器硬件故障下线,kafka集群具备高可用特性,下线broker上的leader分区自动切换到新的broker节点,客户端链接随之切换至新的节点继续提供服务,从流量上看也未发现异常情况;集群整体运行平稳,无异常。但后续有一个业务方反馈每10分钟就有少量接口响应时间升高导致超时,查看日志发现发送消息的接口有WARN日志,日志内容如下:
分析
根据服务日志异常调用栈反映出的问题:业务线程在消息发送时,会触发获取远端metadata的服务请求,请求发到了宕机服务器后抛出Exception,并且很有周期性的每10分钟间隔发生少量异常;根据调用栈深入到kafka代码,找到发生问题的位置DefaultEventHandler.handle():
红色方框里的代码,是发送消息前处理的一段逻辑,topicMetadataRefreshInterval为更新metadata路由表的间隔时间,缺省为600000(10分钟)。
发送消息前会判断本次发送是否需要更新路由表,判断依据为topicMetadataRefreshInterval指定的时间间隔, 设置不同值时执行情况如下:
topicMetadataRefreshIn