既然带的校招生问到了,我就展开说一下“数据一致性”问题

79 阅读4分钟

这个问题在工程应用领域也算是相当广泛的一个问题了,几乎每位研发同学都会碰到,今天就试试在有限的十分钟时间内说说这个问题。

要问“数据一致性”问题,首先我们要明白这是个什么问题?发出这样的问题,说明你碰到“数据不一致”了,这个表象有了,如果我们基于表象来分析问题或解决问题,你永远也解决不完问题,就像之前一篇说的学习方法论一样,落了下乘,成倍的努力换回极少的回报。因为你会碰到各种个样的表象,比如:“数据库主从不一致”甚至遇到幻读脏读、你也会碰到缓存不一致、你还会碰到内存数据的不一致等等。

数据不一致了,造成这个问题的根因也很简单,就是因为“多份数据” ,因为只有多份数据,才谈得上数据不一致,不然比较从何而来呢?

为什么会有多份数据?绝大对数情况就是为了提升效率,也就是常说的“空间换时间”,这种工程设计体现在计算机软硬件系统中的方方面面。

比如Java语言的并发编程,在微观层面的体现就是CPU不是直接操作内存数据的,而是先把内存数据读到自己的高速缓存(寄存器)再使用的,这就造成了多份数据的产生。而在宏观层面,就体现在Java语言的"volatile"和"synchronized"关键字功能设计。跟是不是多线程和多核CPU并没有关系,单核CPU一样会有数据不一致问题。如果同学再学过编译原理,才会多理解一层,你以为的“原子操作”也根本就不是原子操作,比如:x=a+b,这个表达式的操作涉及到了多次MOV和ADD。

再比如工程里常见的缓存,也是数据不一致的重灾区,甚至很多时候产品会向技术妥协允许“一定时间的数据不一致”,稍微负责一些的产品或研发就不太会容忍这样的牺牲用户体验的存在。知道了问题的本质是“多份数据”导致的问题,那解决方法再初级的研发也能想得出来,无非是“消灭多份数据”或“感知多份数据”。

“消灭多份数据”这个动作就不说了,在工程实践过程中,大多数时候为了提效,冗余数据还是最简单有效的手段的。话分两头说,有经验的程序员,在没有效率问题的时候,会极力的尽可能的避免冗余数据的出现。再说说“感知多份数据” ,就是实现方要对多份数据有感知,并且明确的知道什么时候用哪份数据或以哪份数据为准。这里网上找个图说一下一种解决方案:

image.png

这种解决方案很好,但是(但是才是最重要的)我们也要清楚的知道为什么这么设计?需不需要这么设计?优劣势是什么?再结合想想之前说的“非必要,勿引入”的设计原则,试想以下的一种常见情况:99.9%的读,极少量的写,那我们为什么不可以直接在写环境更新cache呢?当然可以,甚至比上边的复杂方案更好,即便你的缓存服务是多机房部署的,一次更新或使缓存失效的动作的延迟是10ms甚至100ms,也很容易接受写操作连带的去执行缓存更新操作的。

其实写了这么多想说的还是认知问题,《教父》里有句台词:“花半秒钟就看透事物本质的人,和花一辈子都看不清事物本质的人,注定是截然不同的命运。” 希望同学们能明白,但是我也知道绝大部分同学即使明白了也做不到,因为想做到太难了,需要花大量的努力和时间去训练,这个过程要耐得住寂寞,受得了失败,要有很多的毅力和延迟满足感。

还有一点也非常重要,子贡这样说过自己的老师孔子:“譬之宫墙,赐之墙也及肩,窥见室家之好。夫子之墙数仞,不得其门而入,不见宗庙之美、百官之富。得其门者或寡矣。” “智慧”这事,很多人“门口”兜兜转转多年而不得入,要明白老师的重要性,真的是“师父”的那种老师,告诉你一些知识点根本不算“师父”,什么时候厉害的老师真的愿意告诉你他的“世界观”和构建这个“世界观”的逻辑和过程的时候,才真的是你的“师父”,才是传授衣钵了。还是要花时间和精力去寻找自己的“师父”的,少走弯路和缩短探索时间。

#今日份十分钟#在校招生述职会上写的,希望同学们将来的路越走越平坦,都能达成心中所愿。