问题描述:
某个客户在针对生产环境中,对ECIF数据库同步改造为使用kafka进行数据同步后,测试环境也偶尔发生消费数据存在空的问题,当时以为是调度系统间隔太慢,导致数据没有读取到,但是在上线之后,生产存在同样的问题,无法消费消息数据;
问题分析:
1.由于问题比较突然,对于kafka的问题分析需要结合消费端和生产端以及服务节点同时分析。
2.首先经过现场运维得知,kafka的集群环境并不是新搭建的,之前就一直正常使用,只是给本次业务系统上线增加了一个新的topic,然后对接消费端和服务端;
3.所以大概率排除了由于环境搭建引起的问题,本身运维对开发会涉及的问题也不太清楚,所以尽可能少的牵扯到运维的过程问题是有必要的;
4.由于问题的现象是业务系统作为消费端,无法拿到服务节点中的数据,所以需要证明,队列中是否存在数据;
5.使用命令(以下命令,需要运维检查理财对应的队列中数据的情况,将地址换成具体的生产IP和端口)
kafka-consumer-groups.sh --bootstrap-server XXX.XXX.XXX.XXX:9092 --describe --group defaultConsumerGroup
来查看消息的情况:
6.通过运维查找结果,看到队列中存在消息堆积的都是和理财相关的节点,此时问题基本上是消费端的概率比较大。
7.这个问题比较棘手的是,生产上不能随意进行分析和调试,好在测试环境有可以复现这个问题的情况。
8.所以需要紧急在测试环境进行问题复现,然后进行可能出现的问题进行分析。
9.由于代码中使用的是kafka的架构,调用客户端的接口进行连接和数据的消费获取,如果想了解这个过程中,具体的运行流程,通常我们需要看是否有相关的日志.
10.但是由于开发过程中单元测试没有问题,可以正常获取消息,基本上没有打印出kafka架构下的相关日志。
11.所以需要针对kafka框架层输出详细日志,修改配置文件(日志级别为all):
12.协助现场开发增加以上的kafka架构层的日志输出,进行详细的问题分析:
13.通过详细的日志大致分析,怀疑存在消费过程中,客户端发送请求到服务端获取信息,接收到应答的时间比较长,中间相差了十多秒,所以明显是服务端反馈应答时间非常长;
14.通过以上日志,初步怀疑在客户端获取相关的集群信息过程中,存在相对缓慢的情况,并且在开发代码的过程中,发现代码中有相关的超时时间的设置:
15.由于此配置time时间是3秒,明显要比上面日志中的间隔时间要小的多,所以可能是由于环境本身的问题,这个过程需要的时间目前是大于配置超时时间的,所以让现场开发将时间配置到30秒,再进行测试。
16.通过调整超时时间变大后,发现这问题消失了,从而可以得知,这个问题就是这个超时时间太小,导致在获取集群信息过程还没正确应答消息,客户端的调用就超时结束了后续的读取动作。
17.总结,以上问题是借助了详细的框架日志分析出了具体的交互过程,从而排查出问题出在服务端处理慢,导致超时无法拿到后续的应答数据做处理;