场景:线上日志输出调用外部接口错误
处理过程:
1。日志排查找到调用的外部接口链接
2。查询调用日志方法请求参数
3。手动执行部分参数看调用是否有问题
4。沟通相应开发查看运行日志,同时排查相关代码查看错误原因
问题定位:
1。该方法请求参数拼接有问题,拼接结果并不是每个元素间有一个分隔符,有可能会有多个连续分隔符
2。服务提供方请求日志查询结果显示有超长请求参数导致转换long类型异常
问题分析:
1。StringBuffer虽然是线程安全的,但是只能保证append方法拼接不产生并发异常,并不能保证多个方法同时使用时按既定顺序执行
2。并行流运行过程会产生多个同时执行的子线程,类似于并发情况
问题修复:
取消并行流方式调用改为foreach即可
自测:
提取这部分代码进行单元测试,对比改动前后产生效果数据,与预期一致
总结:
没有吃透一个技术点的时候不要随意应用,不然产生问题都无法具体定位。
并且,并行流并不适合作为处理业务逻辑产生新数据的调用,更适合作为一种筛选本身数据或校验的形式使用。
当并行流调用元素集合过大时,可能会产生阻塞,并且由于单个子线程只处理一个集合内的元素,所以效率并没有想象中的快速,如果有复杂的业务逻辑还是推荐使用线程池。
以上问题排查处理时间约 1小时
一杯水,一盒烟,一堆屎山看一天~~