解决项目中数据不一致问题
解决项目中数据不一致问题
主要记录一下项目中出现的一个数据不一致的问题,不是所谓的数据库数据不一致哈,不是技术文章,单纯记录自己的一种解决办法的思路。
项目背景
我们的PIS项目(乘客信息显示系统)主要是跟设备硬件关联比较大,我主要是负责给设备发送ATS(列车自动监控系统)消息将我们的设备需要显示的与列车的信息进行关联,这其中数据转发经过好几个系统,最后才到我们PIS这里,由于上一层数据是通过组播发送给我们的,我们每个设备中的程序都会去接收组播,但由于网络和组播的不稳定性,经常会出现丢包的问题,导致经常会出现几个设备数据显示不一致的问题。
排查与发现
首先这个项目一开始不是我接手的(前一个同事离职后将项目转到我手里的),我不清楚详细的问题,所以就给接收数据的地方增加了些日志给交付的同事去严重,将详细的报文打印出来,发现有些设备能接收到数据有的设备接收不到数据。
解决办法
方案1. 重新签订协议
当时已经确认了就是有些设备会出现接收不到,我们就跟我们的上游厂家去一起讨论这个问题,说可以修改协议,将数据通过modbus协议发送给我们(为什么要采用这个协议呢?因为我们跟他们系统之间还有其他的数据来源也是Modbus协议,而且这个协议也是基于TCP/IP的,稳定安全)。但是对方厂家的人不配合说这个是我们的问题,让我们内部决定,他们坚决不改协议。我们又迫于业主的压力就放弃了这个方案。
方案2. 内部每个站启用一个redis服务
经过排查,发现出现的概率是比较低的,也都是偶现丢包,然后站内的设备数量也不是很多,所以我的想法就是给每个站增加了一个redis的服务,作为数据的缓存区,当这个站台有收到新的组播数据,就将数据丢到redis中去,当你需要取用这个数据发送给我们的设备显示时候,我就从redis中去取用这个数据,这样就能完全保障每个显示屏中显示出来的数据是一致的了。(ps:站内部的网络是稳定的,不会出现单个网络出现波动的问题。)
验证
经过和公司交付部门和以及组长经过开会就决定采用方案2,部署到现场一个月后,验证后发现再也没有出现设备与设备之间数据不一致的问题了,于是问题到这也就结束了。
结论
这篇文章记录的并不是我们程序员探讨技术的文章,而是在工作中解决问题的思路。工作中有时候并不是要求你的技术有多强,有时候思维也很重要,当然这个问题也是一个很简单的问题,但其实过程确实挺艰辛的,一开始一直要跟上游厂家去扯皮,因为我们认为问题已经找到了,就是要求他们去调整。但人家不理会,就只能选择妥协去重现想其他的解决方案了。其实想到了使用缓存去存储数据,作为其他设备的一个中间商,那么实施起来也是很简单的,就不多介绍了。这里主要是记录本人自己在工作中换种想法去解决问题的方式。