标准答案

  1. 事件应带业务对象 ID、事件 ID、版本或发生时间,消费端用版本判断是否过期。
  2. 同一对象的写入可以按 Key 串行,但不能假设所有来源都按顺序到达。
  3. 迟到事件应被忽略、转为补偿或触发重新读取权威状态,不能直接覆盖当前状态。
  4. 消息记录、目标状态和处理结果要可查询,以支持重放和对账。

题目解析

跨系统事件的到达顺序可能被网络、重试和分区改变,客户端时间也可能有时钟偏差。真正的业务顺序应由权威写入产生的版本、领域序列或明确的状态迁移表达。

消费端要区分重复、迟到和未知版本:重复可以返回已处理结果,迟到事件可以忽略或触发重新读取,未知版本通常需要暂停并等待补齐,而不是盲目覆盖。

事件处理记录、目标状态和失败原因要可查询,才能在重放和对账时判断已经做过什么。删除失败消息会让系统失去恢复证据,最终只能靠人工猜测。

常见误区

  • 误区:按到达顺序覆盖状态。改正:按领域版本或状态机校验事件是否仍然有效。
  • 误区:只用客户端时间比较事件新旧。改正:使用权威提交版本或服务端生成的序列,时钟只作为辅助信息。
  • 误区:处理失败后直接删除事件。改正:保留失败状态、重试次数和死信记录,必要时通过对账或补偿恢复。

作者信息