谈一谈对数据一致性的理解
概述
从数据一致性这个名词出发,我们探讨的是如何保证数据的一致性。那么对数据的定义又是什么?对一致性的定义又是什么?
- 数据:对客观事物的记录和描述,是信息的原始形式,可以被存储、处理和传输的信息载体
- 一致性:数据在任何时刻、任何地方都保持逻辑上的正确性和相同性,确保所有用户看到的数据符合预期的业务规则和约束条件
如果单看上述两个名词的解释还是比较抽象的,而且数据一致性这个只是一个名词并没有构成一个主谓宾形式的完整的句子。让我们在添加一些角色
- 数据发送方
- 数据接收者
对数据一致性的补充就变成:数据发送方 产生数据 发送给 数据接收者。但是这个动作没有形成数据一致性的问题,因为数据接收者仅仅只是接收到数据并没有使用数据(左耳朵进右耳朵出),所以还需要继续完善这个句子。数据发送方 产生数据 发送给 数据接收者 数据接收方需要使用数据完成一些操作,这样一个完整的流程就出现了,可以发现我们真正需要关注的点是数据发送方产生的数据和数据接收者使用的数据一致(只要数据发送方数据发送成功,不管接收者有没有收到其使用的数据应该要和发送的数据保持一致)。
数据一致性的定义就比较明确了,即发送者发送成功的数据和接收者使用的数据保持一致,这个是有一个时序关系的。
这就要求我们:数据接收者要能够感知到数据发送者是否成功发送了数据;数据发送者必须等待所有数据接收者,回复收到后才可以继续产生后续的数据
这个其实就是强一致性。
强一致性的关键点
- 接收者要能够感知到有新的数据到来,且在同步数据的过程中不能使用历史数据
- 发送者只有收到所有接收者的回复后,才能够继续产生数据
我们可以直观的发现强一致性有很大性能瓶颈和对三方因素(网络和系统健壮性)的要求,上面的强一致性的例子和ZooKeeper保持CP的原理是十分相似的。可以假设互联网使用CP,如果发送者需要发送大量的数据、接收者有很多,那么整个系统或者流程的TPS就会非常低。
所以可以对强一致性进行改造
- 接收者不需要感知是否有新的数据到来,在任何时间都可以使用历史数据(弱化)
- 发送者可以持续产生数据(弱化)
- 接收方能够在某一个时刻收到发送方发送的数据,且接收数据的顺序和发送的数据保持一致
值得思考的点
- 数据生产者:数据接收者 = 1:n ok我能够 我一定能保证
- 数据生产者:数据接收者 = n:n ok我不行,因为在一定时间误差内可以认为同时产生n条数据,下游的数据接收者如果还是按照来了我就认为是最新的 就违背了保持数据有序性的原则。所以这里需要我们自己在数据接收方进行处理,舍弃掉一些已经不是最新的数据(但是这里数据已经走到了接收者,我可没有违背数据最终可以到接收者的原则,只是我不用😁),常见的就是利用产生数据的时间戳来进行比对,也可以自己维护一个版本号均可以
对强一致性进行弱化就得到了最终一致性
业界常说CAP
- C:数据一致性(接收者要能够感知到有新的数据到来,且在同步数据的过程中不能使用历史数据)
- A:可用性(接收者不需要感知是否有新的数据到来,在任何时间都可以使用历史数据)
- P:分区容错性(网络分区),这个其实讨论的是健壮性,我个人觉得与一致性没有关系
可以发现C和A是互斥的,所以就又出了一个BASE理论,其实就是我CA互相让一点形成最终一致性
如果用一个现实例子来说:假设你和你男/女朋友吵架了
CA:要么你认错 要么他/她认错,只能二选一
BASE:你给一个台阶,他/她顺着台阶下来,互让一步
其实更多的时候我认为大家还是遵循BASE理论,连现代互联网架构都是使用BASE理论,大家也是可以的
CAP和BASE从笔者看来其实是一种架构的风格。
TODO 待补充
笔者希望大家在大学期间能够谈一份恋爱,可以一起为了一个目标所奋斗,比如落脚在一个新城市。因为出来工作后其实很少再有那种淳朴的爱情,PS笔者没有谈过,但是笔者还是希望大家能够能有一段可以值得回忆的爱情,如果你有了 那么希望可以遵循BASE理论😯 可不要选则C or A