集群环境下本地缓存怎么保证一致性?

306 阅读2分钟

摘要

首先说说结论,在本场景下使用的是二级缓存+延时的策略来保证本地缓存的最终一致性。、

新人报道,第一次写文章,各位大佬有什么建议也可以提一下,感谢!

1. 什么是缓存,有什么作用?

image.png

1.1. 本地缓存

image.png

2. 场景

首先说说我遇到的场景

在我们管理系统中维护了一份数据,这份数据有两种状态(草稿&发布),管理后台对其操作都是基于草稿表操作,只有在发布时才会把草稿表的数据同步到发布表中,同时也会发一个MQTT消息,全国的设备都会来拉取这份数据(发布状态)。

这时就会有一些问题,怎么保证设备拉取到的是最新的数据,也就是缓存的一致性问题。

image.png

3. 解决方案

3.1 方案一

刚开始想的很简单,想利用DTS的数据订阅能力来刷新本地缓存,但是后面了解到不支持广播消费的能力,同组下的机器只能有一台能消费到,这个方案就没有采用。

这个方案也会存在一些问题就是,在发布操作执行之后到刷新本地缓存的这段时间里是有数据不一致的问题的,这就要看能不能容忍这段时间的不一致。 image.png

3.2 方案二

方案二是在方案一上做了扩展,既然DTS不支持广播消费的能力,那就再转一道,发一个支持广播消费的MQ。

这个方案的缺点就是做的有一些重,最终也没有采用。 image.png

3.3 方案三

方案三也是最终采用的方案,在本地缓存上用redis加了一层二级缓存,DTS变更消息消费需要更新redis缓存和本地缓存。 image.png 然后可能会有人有些问题就是,别的机器的本地缓存怎么办。根据上面说的场景在发布的时候会发一个MQTT消息,设备端才会来拉取这份数据,那么我们就可以从这方面下手,把这个消息延迟一下,消息延迟的时间一定要大于本地缓存的过期时间,所以设备来拉取数据的时候本地缓存没有命中会去redis重新同步一份。