工程问题
发布事件很容易,但在接收端缓慢或不可用时仍不丢失事件,需要完整的系统。Hookrelay 是独立开源项目,支持持久化扇出、签名、重试、交付检查和死信重放。
持久协调
Go API 将事件和交付任务写入 PostgreSQL。工作节点使用 SELECT … FOR UPDATE SKIP LOCKED 领取任务,锁仅覆盖领取操作,不跨越 HTTP 请求。
租约与隔离令牌防止过期工作节点的迟到结果覆盖新状态。领取任务、执行任务和记录结果是不同的故障边界。
故障、重试与身份
有上限的指数退避、随机抖动、请求超时,以及对 429/503 响应中 Retry-After 的支持构成重试策略。达到上限后进入死信队列,通过重放恢复;410 响应禁用端点。
发布需要幂等键。相同请求返回原始事件,同键不同内容被拒绝。HMAC-SHA256 签名遵循 Standard Webhooks,接收端仍需验证签名并去重。
保证与局限
这是至少一次交付,并不保证外部副作用恰好一次。接收端可能已处理,但发送端未收到响应。浏览器演示简化模型并压缩时间,仓库文档包含测试、监控与 PostgreSQL 队列的取舍。