CMDCGateway.Webhook.Dispatcher (cmdc_gateway v0.4.2)

Copy Markdown View Source

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]
[
  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

child_spec(init_arg)

Returns a specification to start this module under a supervisor.

See Supervisor.

enqueue(callback_url, body, secret, opts \\ [])

@spec enqueue(String.t(), binary(), String.t() | nil, keyword()) ::
  :ok | {:error, term()}

把一条派发失败的 webhook 推入 dead-letter,等 Dispatcher 重试。

start_link(opts \\ [])

stats()

@spec stats() :: map() | {:error, :dispatcher_not_started}

聚合统计(运维用)。

tick_now()

@spec tick_now() :: :ok | {:error, :dispatcher_not_started}

强制 tick 一次(测试用)。