orriven
博客

工程8 分钟阅读

设计经得起重试的 webhook 消费端

投递语义是至少一次。一份消费端的简短指南:幂等键、顺序,以及如何处理不认识的事件。

文 Tomas Lindqvist平台

一串已投递的 webhook 事件

如果你的处理逻辑假设每个事件只到达一次,那它迟早会给某个人重复扣款,或者重复签发一张凭证。重试不是需要规避的异常,它就是契约本身。

用事件而不是负载做幂等键

每次投递都带一个稳定的事件 id。先记录它再执行动作,重复的 id 一律当作空操作。用负载内容做去重,只要接口加一个字段就会失效。

不要假设顺序

registration.updated 完全可能早于 registration.created 到达。依赖顺序的处理逻辑应当基于当前状态做对账,而不是重放一个序列——拉取记录,应用此刻为真的东西。

接受你不认识的事件

新的事件类型会不断加入。遇到无法识别的类型就报错的消费端,会把一次常规的接口扩展变成一次故障。记日志,确认接收,然后继续。

先确认,再处理

投递超时时间不是跑业务逻辑的地方。事件一旦可靠入队就返回 2xx,之后按你自己的节奏处理。比这更慢,就会把下游的一次变慢放大成一场重试风暴。

相关文章

新文章,直接送达邮箱。

定期接收最新技术文章与产品发布通知。每月不超过两次。

RSS 订阅

支持随时取消订阅。