标准答案

  1. 对一次性业务动作可建立唯一约束或幂等记录,插入成功者执行副作用,重复者返回已处理结果。
  2. 对状态推进应校验当前版本、允许的前置状态和事件版本,旧事件或重复事件直接忽略并保留审计。
  3. 幂等记录要保存足够长时间,覆盖消息最大重试、回放和对账窗口;记录结果摘要能帮助重复请求复用结果。
  4. 数据库写入和幂等记录应在同一事务中完成;外部调用则需要操作状态、回查或补偿,不能只靠内存 Map。

题目解析

幂等的判断对象是业务副作用,而不是消息处理函数是否被调用两次。重复请求可以返回第一次结果、忽略过期事件或重新查询状态,但不能再次扣款、发货或推进非法状态。

唯一约束适合“一次成功”的动作,幂等记录适合保存处理中和最终结果,状态机适合处理有版本和前置状态的事件。它们都必须落在可恢复的持久化边界,不能只放在进程内存。

同一幂等键的参数冲突、保留期和失败重试要有明确规则。参数不一致时应返回冲突,处理中的记录要有租约或超时恢复,避免幂等表把任务永久锁死。

常见误区

  • 误区:只用消息 ID 做进程内去重。改正:把幂等证据持久化,并覆盖实例重启、消息重放和多实例竞争。
  • 误区:只判断请求是否重复,不保存成功或失败结果。改正:保存状态码、结果摘要和错误,重复请求才能得到一致响应。
  • 误区:状态机不拒绝过期版本和非法迁移。改正:在最终写入处校验当前状态、事件版本和唯一事件 ID。

作者信息