本页目录
Webhook 与回调
服务器主动 POST 到客户端注册 URL 的"反向 API"——事件发生时实时推送,替代低效轮询。HMAC 签名防伪造,重试+幂等去重保证可靠性。几乎所有 SaaS 平台(GitHub、Stripe、Grafana)都提供 webhook 集成。
概述
Webhook 是服务器主动 POST 到客户端注册 URL 的"反向 API"——事件发生时实时推送,替代低效的轮询。核心安全机制是 HMAC 签名验证(防止伪造),核心可靠性机制是重试 + 幂等去重。几乎所有 SaaS 平台(GitHub、Stripe、Grafana)都提供 webhook。DingTalk/WeChat 机器人 webhook 是 IM 应用的常见集成点。
原理
Webhook = 服务器主动 POST 到客户端注册的 URL (用户定义的 HTTP callback):
传统 Polling: Client → GET /api/status (每 30s) → 浪费, 延迟
Webhook: Server → POST https://client/hook (事件发生时) → 实时, 零轮询
Payload + Signature:
POST /hook HTTP/1.1
Content-Type: application/json
X-Signature-256: sha256=3a2b1c...
X-Delivery: uuid-1234 ← 唯一事件 ID, 去重用
{"event":"alert","status":"firing"}
HMAC 签名验证
接收方验证: 用共享 secret 计算 HMAC(payload_body, secret) → 比对 header。不匹配 → 拒绝 (伪造或中间人篡改)。
重试策略
非 2xx 响应 → 指数退避重试 (5s, 25s, 125s, ...)。多次失败 → disable webhook。
去重: delivery UUID → 记录已处理的事件 ID → 重复 → skip。幂等操作 (多次执行相同 effect) 是更好的保证。
Grafana → DingTalk webhook
POST https://oapi.dingtalk.com/robot/send?access_token=<token>
Content-Type: application/json
Grafana 内置 dingding channel 的 singleURL 硬编码指向 Grafana 自身 → 改为 webhook 自定义 actionCard → singleURL 指向 Loki drilldown。
参考
- Grafana: grafana.com/docs/grafana/latest/alerting/configure-notifications
- DingTalk: open.dingtalk.com
Keywords: webhook, HMAC, idempotency, retry, Grafana, DingTalk, signature