谈一谈对数据一致性的理解

概述

从数据一致性这个名词出发,我们探讨的是如何保证数据的一致性。那么对数据的定义又是什么?对一致性的定义又是什么?

  • 数据:对客观事物的记录和描述,是信息的原始形式,可以被存储、处理和传输的信息载体
  • 一致性:数据在任何时刻、任何地方都保持逻辑上的正确性和相同性,确保所有用户看到的数据符合预期的业务规则和约束条件

如果单看上述两个名词的解释还是比较抽象的,而且数据一致性这个只是一个名词并没有构成一个主谓宾形式的完整的句子。让我们在添加一些角色

  • 数据发送方
  • 数据接收者

对数据一致性的补充就变成:数据发送方 产生数据 发送给 数据接收者。但是这个动作没有形成数据一致性的问题,因为数据接收者仅仅只是接收到数据并没有使用数据(左耳朵进右耳朵出),所以还需要继续完善这个句子。数据发送方 产生数据 发送给 数据接收者 数据接收方需要使用数据完成一些操作,这样一个完整的流程就出现了,可以发现我们真正需要关注的点是数据发送方产生的数据和数据接收者使用的数据一致(只要数据发送方数据发送成功,不管接收者有没有收到其使用的数据应该要和发送的数据保持一致)。

数据一致性的定义就比较明确了,即发送者发送成功的数据和接收者使用的数据保持一致,这个是有一个时序关系的。

这就要求我们:数据接收者要能够感知到数据发送者是否成功发送了数据;数据发送者必须等待所有数据接收者,回复收到后才可以继续产生后续的数据

这个其实就是强一致性

强一致性的关键点

  • 接收者要能够感知到有新的数据到来,且在同步数据的过程中不能使用历史数据
  • 发送者只有收到所有接收者的回复后,才能够继续产生数据

我们可以直观的发现强一致性有很大性能瓶颈和对三方因素(网络和系统健壮性)的要求,上面的强一致性的例子和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

全部评论

相关推荐

点赞 评论 收藏
分享
今天 11:22
已编辑
门头沟学院 Unity3D客户端
先说bg,非92院校 27届本科,能OC腾讯感觉也是运气好吧,四月份那次流程挂的莫名其妙。本来都准备好找不到实习暑假好好沉淀了,这次五月底了突然又打电话约面试,中间面试链接最长卡过6天,等的很折磨,两次技术面也没有传统意义上的手撕算法,恰好我算法刷了很多题但是感觉还是写不好,就手撕了一个shared_ptr和口撕了LRU。去年十月份才开始学算法,十一月进了腾讯客户端公开课之后就把算法扔了,今年三月份才捡回来,中间投过很多公司,但是都没有进面,就像图一那样,总结下来其实就是算法写的不好,笔试的时候时间压力一上来人就晕了。投腾讯其实也是因为当时腾讯公开课结业的时候说有特别通道,筛选几率更大点,但是投了之后也没筛到我,就一直泡池子了。其实最开始我的目标是进西山居seed的,等到大三再找实习,但是无奈seed笔试挂了(其实我接受我没写好笔试导致进不了的事实,但是我很难接受一个岗位招聘的时候,分开多轮笔试,但是事实上的题只有三套,但是开的笔试轮次远远大于题的套数,甚至每一套题之间的题型分布完全不一样,所以相对晚做和晚投能直接知道题目,也确实是我学生思维重吧,我觉得这样挺不公平的,而且我也觉得我的水平是完全能够进的)。之后有一天中午无聊把腾讯的简历更新了一下,其实内容没怎么改,然后突然下午就给我约面了,但是还是二面就挂了,八股也是为了准备这次面试才开始正式背的。在这前后又投了很多(其实现在想想确实是因为seed挂的我不甘心,激起了那份胜负欲吧),吉比特,快手,不鸣,巨人,鹰角训练营,炎魂(炎魂的笔试没做,因为发的太晚了),电魂,萨罗斯,完美,莉莉丝,ssob上也沟通过五六家中小厂,甚至还报名了字节的飞书客户端训练营。但是投了这么多的结果全是nullptr,要么是已读不回,要么是笔试挂,要么是简历筛选不过,要么是嫌弃到岗时间太晚。再就是这次了,前后满打满算其实也就准备了三四个月,感谢腾讯收留,也很感激各位牛友们的面经,祝福牛友们都能早日找到心仪的工作or实习。
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务