生产环境服务端报错:阿里云IOT连接失败,重试也失败的问题

1. 🛬 业务场景

已在上一篇博文中详细描述过: 《生产环境服务端报错:阿里云IOT连接中断》

2. 👨‍💻 故障描述

话不多说,直接贴报错日志:

FailoverProvider.java:751: Connection attempt:[45] to: amqps://xxxxxxxxxx.iot-amqp.cn-shanghai.aliyuncs.com:5671 failed

在这里插入图片描述

服务端集成了阿里云iot的amqp客户端,启动后需要跟iot实例建立连接,订阅无人机心跳消息的topic。这样,当无人机设备上线后,作业过程中会定时向iot实例上发送实时心跳消息,服务端就可以订阅到心跳消息,转发给客户端展现。

目前的问题是线上几台机器上部署的项目都突然打印上述连接失败的错误,导致在客户端地图界面无法展现作业无人机的实时位置及实时状态信息。运营同事及时跟我们反馈了问题,因为明天还要作业,所以跟研发的同事连夜排查。

3. 👨‍💻 故障解决

根据一系列的排查分析,定位到问题出在部署的项目代码身上。
最终原因是出在java web项目集成的amqp客户端,实现服务端订阅的代码模块引入了一个qpid-jms-client.jar的依赖。版本使用的0.47.0。它传递依赖了netty-xxx的jar,(通过maven仓库中心查询)netty的版本区间在4.1.43.Final ~ 4.1.86.Final
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
而我们项目又单独在pom中显式的引入了netty-all.jar,版本是4.1.9.Final,不在这个区间里。

之后将此版本改成4.1.43.Final,4.1.86.Final版本都测试过,没有再报连接异常了。应该就是qpid-jms-client中依赖的netty版本与项目显式引入的netty版本发生了冲突,导致的问题。显式引入的netty版本过低,与amqp客户端所依赖的netty版本发生了冲突,导致amqp客户端运行异常。

随后,也查询了netty官网,官网推荐的4.x的稳定版本是4.1.86.Final,于是,将项目中的netty-all.jar的版本修改成了4.1.86.Final。问题解决。

在这里插入图片描述

4. 👨‍💻 故障排查与分析

  1. 我们分析了几台服务器故障发生的节点,也排查了iot线上的设备消息日志,消费组状态,消费客户端。都没有发现比较明显的问题。
  • iot实例上日志反馈的信息:

在这里插入图片描述

  • 服务端日志反馈的信息:

在这里插入图片描述

都指明了故障是出在服务端,跟iot实例无关。

  1. 随后我们通过官方提供的amqp测试demo,修改了consumerGroupId等参数信息,打成jar包部署在线上服务器运行测试,能够正常连接。

在这里插入图片描述

在这里插入图片描述

  1. 我们也在线上服务器上通过ping iot实例ip,telnet测试iot实例的amqp端口,都正常连接,表明线上服务器网络正常,与iot实例的网络连接是通的。

在这里插入图片描述
在这里插入图片描述

那么导致故障的原因究竟是啥呢😥😥😥?

已经大致定位到问题是出在部署的项目服务上,于是就去仔细检查了代码,主要排查跟amqp客户端相关的代码部分,随后又翻阅了之前提的相关工单。发现了项目中集成amqp客户端时引入了qpid-jms-client.jar这个依赖项,而这个jar又依赖了netty,他们的版本是一一对应的,我们项目中引入的qpid-jms-client.jar版本是0.47.0,它传递依赖的netty版本是4.1.43.Final。而在同模块的pom中,我们又显式引入了netty-all.jar,版本是4.1.9.Final。覆盖了qpid-jms-client.jar传递依赖的netty版本。

查阅maven仓库中心,发现qpid-jms-client-0.47.0.jar依赖的netty版本范围在4.1.43 ~ 4.1.86,而我们引入的netty版本为4.1.9,版本过低,可能是这个原因造成了netty版本冲突,低版本的netty不能使amqp客户端正常运行。

在这里插入图片描述

基于这个猜想,我们尝试将部署的项目包中lib文件夹下的netty-all-4.1.9.Final.jar换成了推荐的最新稳定版本4.1.86.Final,随后重启服务,观察日志,发现再没有打印amqp连接失败的问题了。

5. 📝 总结

再贴一次故障截图:

在这里插入图片描述

服务端报iot连接失败的故障原因就是:项目中显式引入了低版本的netty-all.jar,与qpid-jms-client.jar发生了冲突,导致项目amqp客户端连接远程阿里云iot实例失败。

解决方法:根据项目引入的qpid-jms-client.jar的版本匹配对应的netty jar包版本。要么显示引入匹配的版本,要么不重复引入。

总结:

  1. 对于多模块的maven项目,如果项目中业务过多,导致引入的依赖过多,需要及时梳理一些传递依赖的jar,避免依赖重复引入、版本冲突等问题。
  2. 需要根据idea编辑器的提示,及时更新引入依赖的版本,并测试验证,避免由于依赖版本老旧导致的漏洞和突发故障等问题。
  3. 对于业务比较繁杂的项目,可适当采用微服务的方式,将经常容易出问题的模块进行拆解,独立编译部署监控。避免将鸡蛋放在同一个篮子中。提高系统的可用性。
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kyrielx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值