想象你住在奶茶一条街的转角处。街角那家“珍珠岛奶茶店”是全小镇唯一的奶茶店,每天早高峰都有几十个人排队。你发现一个特别有意思的现象:店门口的队伍明明是一条直线,但不同的人看到的“谁先买到”却可能不一样。有人从东边窗口看,觉得小林比小张早;有人从西边窗口看,却觉得小张比小林早。更玄乎的是,如果你去问店员小美,她会告诉你一个和两边窗口都不同的顺序。 你以为这是奶茶店员工的记忆力问题?不,这就是分布式系统里最迷人的话题——一致性模型。今天我们要讲的“线性一致性”和“顺序一致性”,本质上是两种不同的“排队规则”:它们都承认“大家都在同一家店买奶茶”,但对“谁先谁后”的判定标准,却一个严苛、一个宽松。
作为一名 AI 从业者,理解线性一致性与顺序一致性,意味着你能在架构会议上一句话点破“这个系统到底能不能保证强一致”,避免被各种漂亮的数据库宣传词忽悠。这是分布式系统面试的高频考点,也是设计高可用数据系统的核心权衡工具。
可视化演示
展示分布式系统一致性模型从强到弱层级(严格→线性→顺序→因果→最终)、线性一致性与顺序一致性的操作顺序差异及实现代价权衡。切换模式查看各维度,拖动滑块调节节点数。
本节配有交互动效(进入视口后自动加载,约 3KB)。
一致性模型层级架构 严格一致性要求读返回最新写入值(物理时间决定),理论模型无法实现;线性一致性是实际可实现的最强一致性 顺序一致性保证线程内程序顺序和全局序列存在,但不保证实时性;因果一致性仅保证因果相关操作的顺序 strict > linearizable > sequential > causal > eventual 一致性强度与性能代价呈反比
一致性模型总览
还记得奶茶店前那条神奇的队伍吗?假设有三个朋友——小林、小张和小美,都在同一时刻用手机给奶茶店下单。你站在东边窗口,看到系统显示“小林先下单”,小张不服气,指着西边窗口说“明明显示我先”。这时店长掏出一本厚厚的账本,说:“都别吵,按我账本上的顺序来。”
这个账本,就是分布式系统中的一致性模型。它是一组规则,定义了系统中的多个副本(比如奶茶店的两台收银机、三台手机屏幕)如何对“操作顺序”达成共识。一致性模型决定了:当客户端 A 写入一个值时,客户端 B 什么时候才能看到这个值;当两个客户端并发写入时,谁先谁后。
分布式系统的一致性是一个谱系,从强到弱排列:线性一致性、顺序一致性、因果一致性、最终一致性……其中最常被放在一起比较的,就是线性一致性与顺序一致性——它们都属于“强一致家族”,在学术界和工业界都被广泛讨论。
理解一致性模型,是分布式系统架构师的必修课。选对了模型,系统既快又可靠;选错了,要么性能崩盘,要么出现让用户抓狂的“幽灵订单”。
从奶茶店的账本中我们看到:一致性模型就像账本上的记账规则。你选择什么样的规则,就决定了顾客在手机屏幕上看到的世界“有条不紊”还是“乱成一团”。
- 操作集系统中的所有读、写操作构成的集合,是模型管制的对象。
- 顺序约束对操作之间“先后关系”的约束条件。
- 可见性规则规定一个写操作的结果何时可以被读操作观测到。
线性一致性定义
让我们把奶茶店的场景继续推进。现在店长决定用严格的“叫号制”管理:每个订单盖一个时间戳,这个时间戳来自于全店统一的电子时钟。只要订单 A 的时间戳比订单 B 早,那么全世界所有屏幕都必须显示 A 先完成。哪怕 B 的奶茶其实已经做好了,只要时间戳晚,就必须排队。
这就是线性一致性(Linearizability)的核心精神:所有操作必须在某个单一的时间点原子地生效,并且这个时间点必须落在操作的“开始”和“结束”之间。一旦操作完成,它的结果对所有客户端立即可见,之后的所有读操作都必须看到这个结果。
形式上,线性一致性要求存在一个全局顺序 S,满足两个条件:
1. 合法顺序:S 是操作集的一个合法顺序(每个读操作读到的是该顺序中最近一次写操作的值);
2. 尊重实时序:如果操作 A 在物理时间上先于操作 B 完成,那么在 S 中 A 必须排在 B 前面。
这就好比奶茶店装了一个“上帝视角的监控摄像头”:每个人下单的真实先后次序,被完整地记录下来,所有窗口看到的世界都是同一个世界。任何一个操作都像“按下快门”一样——在那一瞬间,全世界都达成了共识。
奶茶店的严格叫号制就是线性一致性:时间戳就是线性化点,每个订单在电子时钟的某一刻被“盖章确认”,从此不可反悔。任何顾客在任何窗口查询,看到的都是同一个被时间锚定的世界。
- 全局顺序 S一个把系统中所有操作排成一行(全序)的序列。
- 实时序约束物理时间上先完成的操作,必须在 S 中排在后面操作的左边。
- 原子生效点每个操作在 S 中占据一个“不可分割”的位置,像一个原子一样整体见效。
顺序一致性定义
然而,现实中很多奶茶店并没有那么严苛。店长觉得时间戳系统太贵——每一单都要对齐全局时钟,高峰期差点把收银机搞崩。于是他换了一套方案:放弃“按真实时间排序”,只保证每个人手里的订单号不乱。
这就是顺序一致性(Sequential Consistency)的核心精神:系统只需要存在一个所有操作都认可的合法顺序,不需要这个顺序与真实物理时间对齐。唯一的硬性要求是:每个进程自己的操作顺序必须保留在全局顺序中。
还是用奶茶店打比方:店长不再看电子时钟,而是要求每个店员在订单上写下自己的“内部序号”。只要店员甲手里的订单 1、2、3 不乱序,店员乙的订单 1、2、3 也不乱序,至于甲的订单 3 是不是真的比乙的订单 1 早发生——没人关心。账本最终的排列只要能让每个店员自己的序号顺序保持,就算合法。
顺序一致性下的奶茶店,店员们不需要昂贵的同步时钟,只要各自手里的序号不乱,账本怎么排都行。它的代价是:顾客在不同窗口看到的“谁先下单”可能不一致,但这在大多数业务场景下完全够用。
- 存在全局顺序 S系统必须至少能排出一个所有人都接受的操作序列。
- 进程内序保持同一进程发起的操作,在 S 中保持其发起顺序。
- 无实时约束不同进程的操作在 S 中的顺序不做实时要求。
两者核心区别
现在,我们把两种奶茶店放在一起对比。假设有两个操作:操作 A(小林下单)在物理时间 t=1 完成,操作 B(小张下单)在 t=1.5 开始,但 B 的完成时间早于 A。
- 线性一致性:因为 A 完成于 B 开始之前,所以全局顺序中 A 必须排在 B 前面;
- 顺序一致性:只要存在一个所有人都接受的顺序即可。如果 B 排在 A 前面也能满足所有进程内顺序约束,那么这种排列是允许的。
这就是两个模型的核心区别:实时序约束。线性一致性在顺序一致性的基础上,额外要求“先完成的操作必须先排序”。
反过来,一个系统如果是线性一致的,它必然也是顺序一致的,因为线性一致性满足的顺序就是顺序一致性所需的全局顺序。但反过来不成立——顺序一致性的系统不一定是线性一致的。
这一点对应到工程上,就是“实现成本”的分水岭。线性一致性要求系统有统一的“时间锚点”,通常需要借助单机串行化、分布式锁或共识算法来强制全局实时序;顺序一致性往往只需全序广播(Total Order Broadcast)即可实现,成本更低。
两种奶茶店的对比告诉我们:线性一致性是“带实时时钟的账本”,顺序一致性是“不带时钟只保序号的账本”。理解了这一点,你就掌握了分布式一致性最核心的二分法。
- 线性蕴含顺序线性一致性的全局顺序 S 天然满足顺序一致性的全部要求。
- 顺序不蕴含线性顺序一致可能违反实时序约束。
- 构造反例通过设计一个“实时序中 a 在 b 前,但 S 中 b 在 a 前”的执行,即可区分两者。
实现代价与工程
理论讲完了,我们回到真实的分布式系统。要实现线性一致性,就像给奶茶店装上“全球统一原子钟”——这需要非常昂贵的机制:
1. 单机串行化:把所有请求收敛到一台机器上处理。最简单但扩展性差。
2. 分布式锁 / 事务:用两阶段锁(2PL)或严格串行化事务保证操作的原子提交。
3. 共识算法:通过 Paxos、Raft 等算法让所有副本对操作顺序达成一致。这是现代分布式数据库的主路径。
对应到奶茶店:如果坚持线性一致性,要么把所有订单交给一个超级店长处理(单机串行化),要么每次下单都让所有店员开会举手表决(共识算法)。这两种方式的延迟都很高,但能保证全世界看到一样的顺序。
顺序一致性的实现成本则低得多:全序广播(Total Order Broadcast)即可。它让所有进程按同一顺序接收消息,但不要求这个顺序对应真实物理时间。就像奶茶店的店员们共享同一个“消息群”,群里的消息顺序所有人一样——但消息是 9:00 发的还是 9:01 发的,并不重要。
在工程选型时,关键问题是:你的业务真的需要线性一致性吗? 财务报表、库存扣减、分布式锁选择线性一致性;社交时间线、购物车合并、日志复制,顺序一致性往往已经足够。记住:线性一致性不是“更好”,只是“更贵”。用对了地方是强一致,用错了地方就是性能灾难。
回看奶茶店,你会明白分布式系统设计的本质就是“用钱买顺序”:你愿意为“全球统一时钟”花多少代价?这个问题没有标准答案,只有基于业务场景的权衡。
- 全序广播所有节点以相同的顺序接收和提交消息。
- 共识算法让所有节点对同一个值/顺序达成一致。
- 成本对比线性一致性需要共识 + 实时序同步,顺序一致性仅需全序广播。
一致性对比总结
终于,我们可以给奶茶店的故事画上句号。一个整洁的公式可以概括全文:
进一步拆解,三个关键结论值得你刻在脑子里:
1. 线性一致性是顺序一致性的强约束版本:满足线性必满足顺序,反之不然。
2. 实时序是最大的成本来源:多花的那部分钱,全花在“让全世界的时钟对齐”上。
3. 选型由业务需求决定:账务、锁、唯一性需求选线性;高吞吐、可扩展、弱交互选顺序。
在实际系统中,ZooKeeper 提供线性一致性(用于分布式锁和元数据管理),而一些分布式消息队列和日志系统仅保证顺序一致性。理解了这层差异,你在架构评审时就能提出尖锐的问题:“这个存储系统宣传的强一致,到底是线性还是顺序?”
奶茶店的账本选择,就是分布式系统的架构选择。世界没有免费的午餐,也没有免费的“绝对顺序”。理解线性一致性与顺序一致性,你便拥有了在分布式世界里精准定位“谁先谁后”的尺子——这把尺子,就是初代架构师与资深架构师的分水岭。
- 公式等价线性一致性是加上实时序的顺序一致性。
- 业务收益衡量一致性带来的正确性保障和用户信任度。
- 实现成本包含延迟、吞吐、可用性的综合代价。
AI 应用场景
场景一:AI推荐系统的特征存储选型
阶段:数据存储与特征管理
解决的问题:AI推荐系统需要实时读取用户特征(点击、收藏、购买记录)。若特征存储只保证顺序一致性,两个并发请求可能读到不一致的特征版本,导致推荐结果抖动;但若所有特征读取都要求线性一致性,系统吞吐量会大幅下降,无法支撑百万级 QPS。传统方案是“一刀切”选强一致,导致性能瓶颈。
具体案例:某头部电商的 AI 推荐系统将特征存储分为两层:核心特征(用户画像、黑名单)使用基于 Raft 的线性一致存储,保证“拉黑”操作立即生效;非核心特征(浏览记录、衰减权重)使用仅保证顺序一致性的内存缓存,批量写入 + 全序广播同步。结果:核心特征读取延迟稳定在 5ms 以内,整体 QPS 提升 3 倍。
场景二:大模型训练中的分布式 checkpoint 一致性
阶段:模型训练与容错
解决的问题:大模型训练集群中,多个 worker 节点需要定期同步模型权重(checkpoint)。如果各节点读取 checkpoint 的顺序不一致,可能导致部分节点加载到旧权重,引发训练发散。传统方案要求所有节点线性一致读取,代价是每次 checkpoint 都要全局同步,训练吞吐下降 20%。
具体案例:某大模型训练平台将 checkpoint 服务设计为顺序一致性模型:训练中间状态只要求各 worker 按相同顺序加载,不强制实时一致;仅在保存最终模型时才切换到线性一致性模式。这样训练迭代速度提升 15%,且最终模型权重依然可靠。
场景三:AI 客服系统的分布式会话状态
阶段:在线会话与状态管理
解决的问题:AI 客服系统中,用户与机器人对话的会话状态(当前意图、上下文)存储在分布式缓存中。若两个客服节点同时处理同一会话,读到不一致的状态会造成回复错乱。但每个会话都使用线性一致性,系统需要维护大量分布式锁,成本过高。
具体案例:某金融 AI 客服系统将会话状态按用户 ID 分片,每个分片使用单主复制(单机串行化保证线性一致性),跨分片的聚合查询仅要求顺序一致性。用户感知到的会话连续性得到保障,同时系统支持横向扩展。
Python 演示
import threadingimport timefrom collections import deque class LinearizableStore: """线性一致性存储:通过全局锁串行化所有操作""" def __init__(self): self.lock = threading.Lock() self.data = {} self.log = deque() def write(self, key, value): with self.lock: self.data[key] = value self.log.append(("write", key, value, time.time())) return True def read(self, key): with self.lock: val = self.data.get(key, None) self.log.append(("read", key, val, time.time())) return val class SequentialStore: """顺序一致性存储:每个线程维护自己的本地序,后台异步合并""" def __init__(self): self.data = {} self.pending = deque() self.lock = threading.Lock() def write(self, key, value): with self.lock: self.pending.append((key, value)) self.data[key] = value return True def read(self, key): with self.lock: return self.data.get(key, None) def demo_linearizable(): store = LinearizableStore() results = [] def worker(wid): store.write("user", wid) results.append(store.read("user")) threads = [threading.Thread(target=worker, args=(i,)) for i in range(5)] for t in threads: t.start() for t in threads: t.join() print("线性一致结果:", results) def demo_sequential(): store = SequentialStore() results = [] def worker(wid): store.write("user", wid) results.append(store.read("user")) threads = [threading.Thread(target=worker, args=(i,)) for i in range(5)] for t in threads: t.start() for t in threads: t.join() print("顺序一致结果:", results) if __name__ == "__main__": print("=== 模拟线性一致性存储 ===") demo_linearizable() print("=== 模拟顺序一致性存储 ===") demo_sequential()
self.lock = threading.Lock()用全局锁实现“单机串行化”,是线性一致性的最朴素实现。with self.lock:保证任何时刻只有一个线程能读写数据,模拟“原子生效”的线性化点。self.log.append(...)记录操作日志,方便调试验证线性化顺序。class SequentialStore:顺序一致性存储类:只用锁保护内部字典,不记录全局实时序。results.append(store.read("user"))多个线程读到的最终值,线性一致性下最后一次写必定被读到。demo_linearizable()演示线性一致存储:锁保证所有读写严格串行,结果确定。demo_sequential()演示顺序一致存储:本地序保持,但全局序不做实时约束。
常见误区
误区“线性一致性不就是最终一致性强一点吗?反正最终所有副本都会一样的嘛,区别不大。”
正解完全不同。最终一致性只保证“经过足够长时间后数据会收敛”,期间不同客户端可能读到不同的值;而线性一致性要求每一次操作完成后,结果立即对所有客户端可见,且所有操作必须能排成一个尊重实时序的全局顺序。可以这样想:最终一致性是“奶茶店打烊后对账,发现账目一致就行”;线性一致性是“每下一单,全世界屏幕必须立刻同步更新”。前者是财务日报,后者是直播。
为何常见:很多初学者只知道“强一致 vs 弱一致”的粗略分类,把“最终会一致”和“强一致”混为一谈,忽略了时间维度的约束差异。
误区“顺序一致性就是不太严格的线性一致性,有时也看看时间的,只是不那么精确嘛。”
正解顺序一致性完全不要求尊重实时顺序。它只要求存在一个所有进程都认可的全局操作顺序,并且保持每个进程内部的程序顺序。想象奶茶店的“内部序号制”:谁的序号先,谁就先,哪怕你实际是更晚到店的。它和实时时间没有一毛钱关系。正确理解是:线性 = 顺序 + 实时序约束,二者是“加约束”的关系,不是“宽松一点”的关系。
为何常见:“顺序”这个词容易让人联想到“时间上的先后”,于是下意识以为顺序一致性也需要考虑时间顺序。
误区“分布式系统要么选择线性一致性,要么选择顺序一致性,定下来了就不能变。”
正解真实系统往往是混合的。比如 ZooKeeper 对写操作保证线性一致性,但读操作可以配置为顺序一致性模式(允许读旧数据)。更常见的做法是:核心操作走线性一致路径(如余额扣减),非核心操作走顺序/最终一致路径(如用户昵称更新)。系统设计者可以根据操作的重要性配置不同的一致性级别,而不是“一瓶盖死”。
为何常见:教材通常把每个模型单独讲解,容易让人误以为系统只能选一种模型。实际上大型系统都是分层、分区、分路径地选择不同模型。
误区“既然线性一致性更严格,那它肯定更好吧?系统设计肯定优先选线性一致性。”
正解线性一致性更严格,意味着实现成本更高、性能更差、可用性更低。在 CAP 定理的框架下,追求线性一致性意味着在网络分区时必须牺牲可用性(选择 CP)。很多互联网业务(如购物车、文章浏览计数)根本不需要这么强的约束,选顺序一致性反而能以更低成本获得更高的吞吐和可用性。设计的目标是“匹配业务需求”,不是“选最强的模型”。
为何常见:技术新人容易把“更强”等同于“更好”,忽视了一致性模型背后的工程成本和 CAP 权衡。
误区“只要用了 Raft 或者全序广播,系统就是线性一致的了,不需要额外做别的。”
正解全序广播只保证所有节点以相同的顺序应用消息,但它并不保证消息顺序与真实时间相关。比如消息 m1 在物理时间 t=1 发出,m2 在 t=0.5 发出,但 m1 可能先被广播而在顺序上排在 m2 前面——这不违反顺序一致性,但违反线性一致性。要实现线性一致性,还必须确保操作的线性化点与实时序一致,通常需要额外的机制(如领导者的时间戳分配、读操作也走共识)。Raft 本身通过 leadership 机制实现线性一致读,但需要开启 ReadIndex / LeaseRead 等优化选项。
为何常见:人们容易把“全序”误解为“与时间相关的全序”,忽略了分布式系统中消息到达顺序和真实时间没有天然绑定关系。
面试题
Q1. 线性一致性与顺序一致性的根本区别是什么?
- A.线性一致性要求所有操作按真实时间排序← 正确答案
- B.顺序一致性要求按真实时间排序
- C.两者没有本质区别
- D.线性一致性不要求全局顺序
答案:A。线性一致性必须在顺序一致性的基础上额外尊重实时顺序——如果操作 A 在物理时间上先完成,则全局顺序中 A 必须排在 B 前面。顺序一致性只要求进程内顺序保持,不要求按真实时间排序。选项 B 正好说反了,C 忽略了两者在实时序约束上的本质差异,D 与线性一致性的定义(要求存在全局顺序)矛盾。
Q2. 如果一个系统是线性一致的,那么它是否一定是顺序一致的?
- A.一定不是
- B.一定是← 正确答案
- C.不一定,取决于网络延迟
- D.仅在单机系统下成立
答案:B。线性一致性是比顺序一致性更强的约束。线性一致性要求的全局顺序(尊重实时序 + 进程内序)天然满足顺序一致性对全局合法顺序和进程内序的要求,因此线性一致的系统一定顺序一致。选项 A 完全颠倒,C 将数学蕴含关系错误地依赖到工程性能上,D 误解了两个模型的普适性。
Q3. 下列哪些措施可以用来实现线性一致性?
- A.单机串行化所有请求← 正确答案
- B.使用 Raft 共识算法(配合线性一致读)← 正确答案
- C.仅使用全序广播
- D.使用分布式锁/两阶段锁保证原子提交← 正确答案
答案:ABD。单机串行化(A)和分布式锁/事务(D)都通过强制原子生效点实现线性一致性;Raft 配合 ReadIndex/LeaseRead 也可以实现线性一致读(B)。仅有全序广播(C)只能保证顺序一致性,因为它不确保顺序与实时时间绑定。注意区分“全序”与“实时序”。
Q4. 奶茶店店长放弃电子时钟改用内部序号后,顾客在不同窗口看到的下单顺序可能不同。这种系统属于什么一致性模型?
- A.线性一致性
- B.顺序一致性← 正确答案
- C.最终一致性
- D.因果一致性
答案:B。店长放弃统一时钟,仅保证每个店员内部序号不乱,这正是顺序一致性的核心特征——存在一个全局顺序且进程内序保持,但不与真实时间绑定。线性一致性(A)需要统一时钟保证实时序;最终一致性(C)只要求收敛不保证进程内序;因果一致性(D)只对有因果关系的操作做约束,比顺序一致性更弱。
Q5. 关于线性一致性和顺序一致性的“蕴含关系”,以下哪个说法正确?
- A.顺序一致性蕴含线性一致性
- B.线性一致性蕴含顺序一致性← 正确答案
- C.两者互不蕴含
- D.两者在多机系统下相互等价
答案:B。线性一致性 = 顺序一致性 + 实时序约束,因此线性一致必然顺序一致(B)。反过来,一个顺序一致的系统因为不保证实时序,可能是非线性一致的(A 错误)。两个模型是“包含”关系而非等价或无关(C、D 错误)。记住公式:线性 = 顺序 + 实时。
Q6. 以下哪些场景适合选择顺序一致性而非线性一致性?
- A.商品库存扣减
- B.社交平台的时间线feed← 正确答案
- C.只读缓存的多副本同步← 正确答案
- D.分布式锁服务
答案:BC。社交时间线(B)和只读缓存(C)对实时序不敏感,允许读到稍旧的数据,选顺序一致性成本更低、吞吐更高。商品库存扣减(A)和分布式锁服务(D)是典型需要线性一致性的场景——库存扣错或锁冲突会造成业务事故。选型原则:业务容忍短暂的不一致时,用更便宜的顺序一致性。
Q7. 一个执行历史中,操作 a(写 x=1)在物理时间 t=1 完成,操作 b(读 x)在 t=1.5 开始但在 t=0.8 已经完成(时钟异常)。若系统满足线性一致性,以下哪项必然成立?
- A.b 读到旧值 0
- B.b 必读到 1← 正确答案
- C.a 和 b 的顺序由系统自行决定
- D.线性一致性不适用于此场景
答案:B。线性一致性的定义是:若操作 a 完成于 b 开始之前,则 a 必须排在 b 前面。题目中 a 在 t=1 完成,b 在 t=1.5 开始,因此 a 必须先于 b 生效,b 必须读到 a 写入的值 1。即使 b 的完成时间异常提前,只要开始时间在 a 完成之后,线性化点仍可放在 b 开始之后、完成之前,且必须保证 b 看到 a 的结果。A 违反了线性一致的可见性要求;C 把“顺序必须尊重实时序”错误地弱化;D 忽视线性一致性对重叠操作的兼容性。
Q8. 关于 CAP 定理与一致性模型的关系,下列说法正确的是?
- A.线性一致性在网络分区时必然可用
- B.顺序一致性在网络分区时必须牺牲可用性
- C.强一致性模型在分区时通常需牺牲可用性← 正确答案
- D.CAP 定理与一致性模型无关
答案:C。在网络分区发生时,为了保证所有节点读到一致的数据,系统只能拒绝来自少数派的请求,即牺牲可用性(A)。顺序一致性和线性一致性都属于强约束,分区时都需要做出可用性取舍(B 错误,不只是顺序一致性)。CAP 讨论的正是强一致与可用性的取舍,与一致性模型强相关(D 错误)。
Q9. 以下哪些是顺序一致性与线性一致性的共同点?
- A.要求存在全局操作顺序← 正确答案
- B.要求保持每个进程内部的操作顺序← 正确答案
- C.要求按真实时间排序
- D.都属于强一致性模型← 正确答案
答案:ABD。两个模型都要求存在一个全局合法的操作顺序(A),并且保持每个进程内部的操作先后关系(B),都属于强一致家族(D)。只有线性一致性额外要求实时序(C,顺序一致性不做此要求)。记忆口诀:顺序一致性 = 全局序 + 进程内序;线性一致性 = 顺序一致性 + 实时序。
Q10. 一个分布式系统使用全序广播保证所有节点按相同顺序应用写入,但客户端 a 的读操作可能看到旧值,客户端 b 的读操作可能看到新值。该系统属于什么模型?
- A.线性一致性
- B.顺序一致性← 正确答案
- C.因果一致性
- D.弱一致性
答案:B。全序广播保证了写入操作的全局顺序,每个进程内部顺序也保持,因此满足顺序一致性(B)。但读旧值/新值的不一致说明系统没有保证“操作完成后立即可见”,违反了线性一致性的实时可见性约束。因果一致性(C)只要求有因果关系的操作被看到,但该场景没有体现因果约束,且全序广播是比因果更强的前提;弱一致性(D)不保证进程内序,与题意不符。