Webhook dead-letter 重试调度器。
职责:
- 启动时从
DeadLetter.Backend中 reload 所有 pending 条目 - 定时 tick(默认 30s)扫一遍 pending → 到时间的条目重新
Webhook.dispatch - 派发成功 →
DeadLetter.delete/2清除 - 派发失败 →
DeadLetter.mark_retried/3推后下一次重试(指数退避) - 达到
max_retries后永久放弃 +Logger.error+ emit telemetry 事件[:cmdc_gateway, :webhook, :dead_letter, :permanent_failure]
配置(start_link/1 opts)
[
backend: CMDCGateway.Webhook.DeadLetter.DETS, # 必填
backend_opts: [file: ~c"/var/cmdc/webhook_dlq.dets"],
tick_interval_ms: 30_000, # 默认 30s
max_retries: 10, # backend 不传时默认
enabled?: true # false 时 GenServer 仍启
# 但不调度(用于关闭场景)
]公共 API
Dispatcher.enqueue(callback_url, body, secret, opts \ [])
# 派发最终失败时,由 Webhook.dispatch/3 通过 enqueue/4 入库
Dispatcher.tick_now()
# 手动触发一次扫描(用于测试)
Dispatcher.stats()
# 返回 %{pending_count, last_tick_at_ms, total_retries, total_succeeded,
# total_permanent_failures}
Summary
Functions
Returns a specification to start this module under a supervisor.
把一条派发失败的 webhook 推入 dead-letter,等 Dispatcher 重试。
聚合统计(运维用)。
强制 tick 一次(测试用)。
Functions
Returns a specification to start this module under a supervisor.
See Supervisor.
把一条派发失败的 webhook 推入 dead-letter,等 Dispatcher 重试。
@spec stats() :: map() | {:error, :dispatcher_not_started}
聚合统计(运维用)。
@spec tick_now() :: :ok | {:error, :dispatcher_not_started}
强制 tick 一次(测试用)。