最终一致性到底是什么??

2020-04-28 09:12:36 +08:00
 yeqizhang

我看到有 V 友发这个问题,但我看到有说数据一致性,这个应该没错?各节点数据的一致性会有延缓,这里强调的是数据相同。

但我以往在网上看到的好像都是讲的分布式事务相关的最终一致性,也就是比如我在一个系统扣款,我要在另外一个系统加钱,解决方案有 2pc,tcc,基于消息队列,补偿,最后还可以人工对账。这里强调的是扣钱加钱这两个动作最终一致,数据最终也是“一致“?

10453 次点击
所在节点    程序员
39 条回复
dilu
2020-04-28 09:28:05 +08:00
假设你从 A 账号转 100 块给 B 账号,由于 A 跟 B 在不同的数据库实例,无法使用事务


因此你的业务变成,A 扣 100,记录这笔流水日志,发送消息给队列


B 这里收到队列消息加 100 给 B 账号


那么最终月底对账的时候,你从流水日志里面反推,看看 B 有没有加上这 100


加上了就是最终一致性 没加上 说明一致性没有保证到
vindurriel
2020-04-28 09:31:36 +08:00
就是有一段时间不一致 最坏情况要另行定义 你说的几种方案里 2pc 算是强一致的 其他都是最终一致
问题是很多所谓具有最终一致性的系统 因为设计或实现的缺陷 在某些情况下是最终不一致的
kirch
2020-04-28 09:46:30 +08:00
一致性要求分布式系统里一旦写入数据,每个节点都更新并返回同样的结果,但是根据 cap 定理,一致性,可用性,分区容错性,三者只能保证 2 个,一般都优先保证可用性,分区容错性,最终一致性就是妥协的结果,一旦写入数据,可以过段时间,只要最终每个节点都更新并返回同样的结果就可以了
beiping96
2020-04-28 10:58:05 +08:00
redis 集群:最终一致性
etcd 集群:强一致性
lewis89
2020-04-28 11:15:27 +08:00
强奸-->坐牢 8 年
强奸-->逃逸 10 年-->坐牢 8 年

..结果一致就行了.. 就这么简单
yeqizhang
2020-04-28 11:27:35 +08:00
@dilu 嗯,那这个是针对业务上的事务来说的吧
liprais
2020-04-28 11:28:08 +08:00
最终一致性就是没有一致性
yeqizhang
2020-04-28 11:29:35 +08:00
@kirch 那你这个不是说的事务相关的吧,更多的偏向延迟使数据相同?
no1xsyzy
2020-04-28 11:52:05 +08:00
@yeqizhang #8 并不是主动延迟,而是相对来说放弃一部分一致性来更多地实现三难的其他两方面。
总体上来说还是 ASAP,但你知道,所谓 ASAP 就是没有期限。
EmdeBoas
2020-04-28 11:53:35 +08:00
https://zhuanlan.zhihu.com/p/47445841
- 单机场景一致性主要看并发隔离
- 分布式场景一致性主要看怎么获得全序关系
一致性门道很多,不系统性的学习根本就弄不清楚的;可以看看 DDIA 这本书
iugo
2020-04-28 12:25:28 +08:00
当我从桌上拿走一个苹果, 如果一个人的视觉暂留是 1 分钟, 那么在这一分钟内, 他都以为苹果还在, 但最终, 他会看到, 苹果不在桌上了. 他的认识与这个世界实际发生的事情, 最终一致了.
bottleimp
2020-04-28 12:27:50 +08:00
看看就行了,因为没有哪个最终一致性会跟你明确说多久达到一致。
luckyrayyy
2020-04-28 12:32:03 +08:00
这个概念是相对于强一致性的吧。
强一致性就是任何时间绝对一致,如果不一致就宁可不给你结果。
最终一致性就先给你结果,临时不对的结果也不要紧,隔一段时间会把结果修正,保证最终一致。
Aresxue
2020-04-28 12:34:03 +08:00
不要弄混 ACID 中的 C 和 CAP 的 C,前者的重心在于系统整体的一致性, 后者指的是多个副本之间的一致性
sioncheng
2020-04-28 12:41:23 +08:00
两个独立运行都系统,A 系统做一个变动,B 系统也做一个变动,它们要么都成功要么都失败,称为分布式事务(一致性是事务的一个特征);但是,这个同时成功或者同时失败在分布式系统里实现起来很困难或者会导致整个系统不高效(比如,整个系统的 TPS 太低),所以有一些其他方法来简化实现和提高整个系统的效率,允许在一定的时间范围内(这个时间范围对于计算机系统来说是比较明显的,比如 1 分钟,但是,对于很多业务场景来说,这个时间差是可以接受的,) A 、B 相继成功或者失败,称为最终一致性。
yeqizhang
2020-04-28 12:46:14 +08:00
@Aresxue 我觉得你讲到重点了!!所以我就觉得大家讲了两方面,一般都是解释分布式事务这块,但我觉得对于分布式事务的用 acid 的 C 来讲就不太正确
yeqizhang
2020-04-28 12:50:29 +08:00
@Aresxue 我上面一楼理解的可能还有问题,但我觉得你给我指明了方向,谢谢!
lhx2008
2020-04-28 12:51:19 +08:00
两阶段提交,要么成功要么失败那是原子性,事务的一致性通常是事务并发不出问题(有很多个级别),主从数据库集群的一致性本质上是从库复制延迟的问题,只要复制延迟不是 0 就是最终一致性
yeqizhang
2020-04-28 12:57:22 +08:00
@lhx2008 你说的也很准确
EmdeBoas
2020-04-28 13:35:35 +08:00
@yeqizhang 14 楼说得并不对,理解太浅显
ACID 里面的 C 定义非常模糊,与业务定义有关,ACID 这几个概念就不正交;单机数据库谈论 ACID 比较多,AID 是对 C 的约束
CAP 里面的 C 也不是指什么副本一致,而是指线性一致性(也就是大家谈论的强一致,但其实大部分人自己是说不清楚什么是强一致的)

还是去看书吧,这个需要扎实的理论基础

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/666807

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX