我的后台服务有两个部分:
1. 接口数据,数据从项目启动时首先查库,数据进缓存,然后去订阅另个组广播的mq消息来不断刷新缓存。同时有定时去查库,防止mq挂掉,保证数据无误。
2.推送数据,这是另个项目,但是做的事情很简单,转发上面说的从另个组订阅的消息,我们自己包装处理,再发送出去。
前端调用:
客户端会首先调用接口数据完成模型初始化,然后建立websocket来接受我的推送消息.
问题:
在客户端某个时刻接受到推送消息,更新了界面的数据之后,去手动刷新界面,重新请求接口数据的时候,却发现得到的数据是旧的。按照我上面的逻辑 ,不应该是会有旧数据的。
问题查找:
经过调查,友方组在发出消息给我方之前,会去更新数据库的数据,也就是说,他们数据库的数据也一定是新的。
问题查找继续:
但是后来我发现,虽然他们的 更新库->发消息 虽然有逻辑的先后,但是并不能保证消息发出之后,数据库的数据马上会更新好。这样会导致,当我方接受到mq消息更新了缓存之后,刚好碰上我的定时查库覆盖缓存,这时候查库得到的数据极有可能比缓存中的数据还旧,于是导致上述问题。
解决方案:
在不能让友方组改动逻辑的情况下,我只能做出一些容错性的让步。我在查库之后,更新缓存之前,对数据库的数据和缓存中的数据做一个比较,如果数据库的数据更新,则刷新缓存,反之则不刷新缓存并结束所有操作。