Skip to Content

Odoo 19 Webhook:超时、重试与幂等怎么设计才稳

集成可靠的关键是:失败可观测、重试不重复记账
January 22, 2026 by
Odoo 19 Webhook:超时、重试与幂等怎么设计才稳

Webhook 在演示里几乎总是成功,在生产里却常因网络抖动、对端超时或重复投递变成丢单或重复记账。正确的错误处理与重试策略,是为了避免数据丢失与重复业务。

结构对照:Overview Of Webhook Error Handling and Retry Strategies in Odoo 19

一、两个方向,两类问题

  • 出站 Webhook:Odoo 把信息发给外部(自动化规则、服务器动作或自定义代码)。失败主因:对端无响应、慢、易错。
  • 入站 Webhook:外部调用 Odoo 自定义控制器。失败主因:Odoo 抛错、数据不合法、事件重复投递。

二、出站失败怎么处理

常见坑:直接 requests.post() 却不设超时、不处理异常。对端一慢,就会拖住 Odoo Worker;失败时异常若未妥善处理,会影响稳定性。

更好的做法:

  • 设置请求 timeout
  • 捕获 requests.exceptions.RequestException
  • 完整记录失败日志
  • 跟踪每次调用状态
  • 失败后可重试

示例:自定义模型 webhook.delivery 可含字段 destination、payload、status、attempts、next_try。再用计划动作扫描失败记录,按退避重试:1 分钟 → 5 分钟 → 30 分钟 → 更长。达到上限后标记人工处理。

这样重试离开用户请求线程,避免慢外部服务拖死 Worker。

三、入站失败怎么处理

入站优先:校验请求并快速响应。控制器建议顺序:

  1. 校验签名或认证
  2. 校验载荷
  3. 检查事件是否已处理(幂等)
  4. 记录事件
  5. 返回合适的 HTTP 响应
  6. 重业务(开票、出库等)必要时异步处理

四、处理重复 Webhook

对端若未在预期内收到确认,会重发。必须把去重写进设计:用事件唯一 ID 作幂等键,处理前先查是否已处理,避免同一支付记两笔。

五、返回正确的 HTTP 响应

  • 2xx:通常表示投递/接受成功
  • 4xx:请求本身有问题
  • 5xx:服务端问题,发送方往往会重试

业务失败却返回成功,会掩盖问题并造成不一致。响应必须如实反映结果。

六、设置重试上限

不要无限重试。达到上限后:停止重试、记录原因、标记待审、通知负责人。避免对着已坏终点狂重试,也便于发现持续性故障。

七、小结与国内补充

可靠 Webhook 不只“能发能收”,还要:超时、错误处理、日志、重试、去重、重试上限;入站幂等;出站与用户请求解耦。另建议每日与外部系统对账单据量,监控死信堆积。

八、FAQ

为什么要重试?网络会抖、服务会短暂失败,重试比直接丢数据更稳。

如何避免重复?保存事件唯一 ID,已处理则跳过。

要不要无限重试?不要。设上限,超限转人工。

中国Odoo网原创中文改写|保留出站/入站/幂等/响应码/FAQ 全要点。Odoo用户手册 · 中文文档 · 实操。

Odoo 19 Webhook:超时、重试与幂等怎么设计才稳
January 22, 2026
Archive