面试题答案
一键面试常见的数据一致性模型
- 强一致性:
- 定义:任何时刻,所有的副本数据保持完全一致。当更新操作完成后,后续任何对数据的读取操作都能获取到最新的值。
- 特点:数据的实时性和准确性高,但实现成本高,对系统的性能和可用性有较大影响,因为在数据更新时可能需要等待所有副本都完成更新。
- 弱一致性:
- 定义:系统不保证数据在任意时刻都保持完全一致,在数据更新后,系统允许存在一段时间内,不同副本的数据不一致。
- 特点:牺牲了一定的数据一致性来换取系统的性能和可用性,适用于对一致性要求不是特别高,对性能和响应速度要求较高的场景。
- 最终一致性:
- 定义:是弱一致性的一种特殊情况,系统保证在没有新的更新操作的情况下,最终所有副本的数据会达到一致状态。
- 特点:在一定时间窗口内,副本数据可能不一致,但最终会收敛到一致。它结合了弱一致性的优点(性能和可用性),同时又在一定程度上保证了数据一致性,适用于很多互联网应用场景。
在实际场景中的运用
- 强一致性运用场景:
- 场景:银行转账。例如 A 向 B 转账 100 元,从 A 的账户扣除 100 元后,B 的账户必须立刻增加 100 元,任何查询操作都要能准确获取到转账后的最新余额。
- 应对挑战:使用两阶段提交(2PC)等协议来确保所有涉及的节点(如 A 账户所在数据库节点和 B 账户所在数据库节点)要么都完成操作,要么都回滚,以保证数据的强一致性。但这种方式可能会导致较长的等待时间和潜在的单点故障(如协调者故障)。
- 弱一致性运用场景:
- 场景:实时性要求不高的用户信息展示,比如用户修改了自己的个性签名,但该修改不一定需要立刻在所有展示端都呈现出来。
- 应对挑战:系统在用户修改签名后,只需要尽快在部分节点更新数据,允许其他节点在一段时间后再同步,这样可以提高系统的响应速度,减少更新操作的延迟。但可能会出现用户在不同终端看到不同个性签名的情况,不过这种不一致在该场景下是可接受的。
- 最终一致性运用场景:
- 场景:电商平台的库存系统。当一个商品有多个仓库时,用户下单后,不同仓库的库存数据可能不会立刻同步。但经过一段时间后,库存数据需要达到一致,以避免超卖等问题。
- 应对挑战:可以采用消息队列(如 Kafka)来异步处理库存更新,每个仓库接收到库存更新消息后进行本地更新。同时,使用版本号或时间戳等机制来处理可能的并发更新冲突,确保最终所有仓库的库存数据一致。在这个过程中,允许在短时间内不同仓库库存数据存在差异,但最终会趋于一致。