← 中文资源

简体中文版本

最终一致性

最终一致性保证更新停止后副本会收敛,但不承诺某次读取能看到最新写入。应用必须显式处理陈旧读与冲突。

阅读英文原文

保证的是什么

如果写入停止,所有副本最终会一致。这就是全部保证;除非系统提供 SLA 或读己之写机制,否则没有收敛时间承诺。

为它设计

  • 识别需要读己之写的任务,将其路由到主库或已追上的副本。
  • 用版本向量、时间戳或领域合并规则显式处理冲突。
  • 展示聚合或延迟数据时标注新鲜度。
  • 消费者保持幂等,使重复事件收敛而不产生重复副作用。
// 投影是最终一致的;重试必须幂等。
async function applyEvent(event) {
  await db.upsert('projection', {
    key: event.aggregateId,
    version: event.version,
    value: event.payload,
  }, { onConflict: 'version < excluded.version' });
}

何时使用

当有界陈旧可接受时,用于信息流、搜索索引、分析和跨区域读取。与强一致性相比,它通常提升可用性与延迟;与缓存相比,它是数据存储的属性而不是临时副本,但仍需处理冲突与新鲜度。

陷阱

last-write-wins 可能静默丢弃并发更新。除非消费者幂等,重试可能重复应用事件。写入后立即读取可能合法地看不到写入;UI 不应把它当作数据丢失。应在重复和乱序事件下测试收敛,而不仅是正常路径。