项目场景:
某智能硬件通过TCP/UDP远程在线升级硬件版本
问题描述:
单设备远程在线升级通过,多设备同步远程在线升级失败。
升级文件过大,每帧数据控制在1024字节以内,多包连续发送,多设备升级时,接收设备出现断裂,包序号无法连续
原因分析:
由于是17年的项目,代码已经不可见(离职了)。近期程序出现了一个线程不安全的问题,突然回想起来,当时也许包序号count++;位置线程锁没有锁好导致了,多设备传输协议出现问题。
解决方案:
1、使用线程安全的成员,比如private(印象中是用了的,具体哪里线程不安全已不可知)。
2、应用缓存(redis)+TCP/UDP回复机制,锁定上一包传输完成包序号,+1完成。
3、采取消息列队模式,逐一处理,远程在线升级不要求实时性,因此可以有适当的延时,但智能硬件设备,等待响应时长需要配合。
暂时只想到这种办法,由于代码已不可见,因此也没什么办法验证这种想法了,做个记录如以后遇到同类问题,当做参考。