资源 · 54

Webhook:处理重复、延迟和恢复

将收到的通知转换为唯一、可追溯的业务影响,以便在发生故障后恢复。

已更新 · 3 min

本指南有助于实现的目标

  • 验证通知
  • 将收据与处理分离
  • 防止重复影响
  • 恢复被阻塞的事件

快速检查

  • 哪些字节已签名?
  • 收据何时持久?
  • 两个工作进程可以同时执行操作吗?
  • 提供商是否保证顺序?
  • 如何查找丢失的事件?

分步指南

  1. 1

    读取提供商契约

    记录类型、版本、账户上下文、签名、时间安排和重试规则。 Stripe 声明不保证交付顺序,并且可能会出现重复;不要对每个 API 应用 Stripe 特有的延迟。

    交付物:带有日期的提供商契约。

  2. 2

    在生效前进行验证

    使用提供商要求的库和原始正文检查签名。 限制接受的大小和类型。 在授权环境中测试无效签名和意外的帐户上下文,且不记录密钥。

    交付成果:无影响的拒绝。

  3. 3

    确认前持久化

    将持久化接收与缓慢处理区分开来。 如果队列无法接受事件,则不要将其报告为已保留。 成功表示已根据您的合约收到,但不一定表示业务操作已完成。

    交付成果:已接收、正在处理、已完成和已阻塞状态。

  4. 4

    强制幂等性

    定义事件键和业务效果标识。 测试并发重复,而不仅仅是顺序交付。 在没有原子约束或锁定的情况下进行初步检查,可能会允许两个工作进程创建相同的效果。

    交付成果:效果唯一性的证据。

  5. 5

    处理延迟和混乱

    不要假设旧的通知描述了当前状态。 在合约允许的情况下,查阅源并应用已验证的业务转换。 保留尚无法解释的事件。

    交付物:转换和逆序测试。

  6. 6

    协调和重放

    准备一个包含所有者、原因、尝试次数和关闭信息的错误队列。 在重放期间保持重复保护。 定期比较提供程序和应用程序:成功恢复并不证明没有遗漏任何事件。

    交付物:恢复程序和差异报告。

可重复使用的工作表

填写您已授权的观察结果。 这些字段是工作模板,而非观察结果。

字段待记录信息
事件提供商、帐户、标识符和版本
收据已验证的签名和持久时间戳
影响业务密钥、状态和唯一性证明
恢复原因、尝试、所有者和关闭

虚构示例

示例情境

示例:两名工作人员在恢复过程中收到相同的确认通知。

决策及预期证据

通过独特的业务影响约束和事务状态,允许只履行一次交付,同时保持两次交付的可追溯性。

区分机制

机制目的验证或限制
签名根​​据合同验证来源不使效果唯一。
去重识别重复通知同时检查并发性和业务影响
协调查找遗漏和差异命名来源和周期

管理指标

指标衡量内容首要行动
队列年龄未完成事件的延迟检查最旧的事件
重复效果错误重复的业务操作纠正原子性
源/应用程序差距缺失或不一致的状态与闭合证据协调

常见错误

  • 在签名体验证之前进行解析
  • 在持久接收之前进行确认
  • 假设按顺序交付
  • 仅按顺序测试重复项

常见问题解答

HTTP 成功是否意味着处理完成?

这取决于合约。 对于异步处理,它应该意味着持久接收,而业务状态则单独跟踪。

是否可以假定只交付一次?

在实际合同下,针对重复交付和交付失败进行设计,并考虑其独特的影响和协调机制。

是否应该保留全部交付数据?

仅在必要时保留,并采用适当的访问权限和保留策略。 应尽可能减少追踪信息,以支持诊断和恢复,同时避免泄露机密信息。

官方参考文献

参考文献支持该方法。 请根据您的实际情况调整检查;它们并非认证。 原始参考文献标题和源文档可能使用其他语言。

参考资料查阅日期 .