保证的是什么
如果写入停止,所有副本最终会一致。这就是全部保证;除非系统提供 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 不应把它当作数据丢失。应在重复和乱序事件下测试收敛,而不仅是正常路径。