Skip to main content
首页博客比较Webhook 货件跟踪:跟踪 Webhook 如何工作与轮询的对比(负载、重试与设置)

Webhook 货件跟踪:跟踪 Webhook 如何工作与轮询的对比(负载、重试与设置)

17TRACK

货件跟踪 Webhook 会在跟踪服务有更新可报告时向您的应用程序发送 HTTP 请求。轮询的方向相反:您的应用程序会反复请求最新的跟踪信息。对于需要将货件数据连接到订单管理系统、商店或客户通知服务的开发者来说,在支持 Webhook 的情况下,Webhook 通常是更好的主要更新机制;定向轮询则有助于恢复遗漏的更新并核对记录。

Webhook Shipment Tracking How Tracking Webhooks Work vs Polling Payloads

这两种方法都不会让承运商更快地扫描包裹。两者都取决于跟踪来源何时接收并公开新信息。实际差异在于您的应用程序如何获知这些信息、会产生多少请求流量,以及传递失败时会发生什么。

跟踪 Webhook 与轮询:运营层面的差异

这两者是集成模式,而不是相互竞争的跟踪数据库。承运商或跟踪平台可能提供其中一种模式,也可能两者都提供,并且访问条件各不相同。请比较您计划使用的具体 API 的行为,不要假定所有 Webhook 服务都提供相同的保障。

决策点Webhook轮询
谁发起请求?跟踪服务调用您的端点。您的应用程序调用跟踪 API。
更新延迟取决于来源的新鲜度、事件生成、传递和处理。还取决于下一次计划请求何时运行。
请求量由发出的更新、批处理和传递重试决定。由货件数量、轮询频率和批处理决定。
基础设施需要可访问的接收端以及安全的入站请求处理机制。需要调度器、出站 API 访问权限以及限流处理机制。
故障恢复取决于提供商的重试机制以及您自己的核对流程。取决于后续请求,以及 API 是否保留所需的历史记录。

优先选择 Webhook,当及时更新很重要且您的团队能够运行可靠的接收端时。优先选择轮询,当入站端点不切实际、货件量较小,或来源不提供合适的 Webhook 时。采用混合设计,当遗漏更新会影响客户沟通或运营,且 API 支持核对时。

不要假定 Webhook 成本更低。订阅费用、跟踪注册、API 调用、事件传递和基础设施可能采用不同的计费方式。请比较实际的商业条款和预期工作量,不要把请求更少视为账单更低的证明。

从承运商扫描到您的应用程序之间会发生什么?

  1. 识别货件。关联跟踪号码、必要时关联承运商信息以及内部货件参考号。某些服务要求在开始监控前完成注册。
  2. 配置事件传递。提供 HTTPS 回调 URL,并选择支持的事件订阅。
  3. 来源接收跟踪信息。承运商扫描或状态变化对跟踪服务变得可用。
  4. 服务发送 Webhook。请求可能包含完整的跟踪快照、单个检查点,或者仅包含一个需要通过 API 查询的引用。
  5. 您的接收端验证并存储信息。验证请求身份,检查其结构,并持久化记录或将事件加入队列。
  6. 工作程序更新业务系统。规范化状态、更新货件记录,并仅触发仍然适用的操作。

Webhook 传递并不等同于实物配送。它是一条关于货件信息的消息。同样,Webhook 响应成功也不能证明邮件已发送或订单记录已更新;这些属于下游处理结果,需要单独监控。

读取跟踪 Webhook 负载

以下 JSON 是用于说明的集成设计,并非 17TRACK 负载,也不是通用架构。实际字段名称、状态代码、时间戳格式和事件标识符必须以所选提供商的文档为准。

{
  "event_id": "evt_example_001",
  "event_type": "shipment.updated",
  "created_at": "2025-04-08T10:16:00Z",
  "shipment": {
    "reference": "shipment_example_123",
    "tracking_number": "EXAMPLE123456",
    "carrier_code": "example_carrier",
    "status": "in_transit",
    "checkpoint": {
      "occurred_at": "2025-04-08T10:10:00Z",
      "description": "Departed processing facility"
    }
  }
}

在您的数据模型中区分三个时间:货件事件发生的时间、提供商生成消息的时间,以及您的应用程序接收消息的时间。延迟的检查点可能会在更新的检查点之后到达。不带偏移量的时间戳也需要明确解释;不要默默地将每个承运商本地时间戳都视为 UTC。

将您的内部货件参考号与提供商的标识符一并保留。仅凭跟踪号码可能不足以作为永久的全局标识符,尤其是在不同承运商环境中。对于拆分订单,请维护货件级记录,不要让一个包裹的已送达状态将整个订单标记为完成。

在保留原始状态和描述的同时,保存规范化后的业务状态。您的应用程序可能会将多个承运商消息映射为“运输中”,但支持人员仍可能需要原始检查点来了解延误。将预计送达日期视为估计值,并区分字段缺失与明确要求清除现有值。

重试、确认和重复事件

Webhook 传递可能因超时、网络中断、身份验证错误或接收端不可用而失败。提供商可能会重试,但不存在通用的重试计划、保留期限或最大尝试次数。请确认哪些响应会触发再次尝试、如何处理重定向,以及是否支持手动重新传递。

持久接受后再确认

保持请求路径简短:验证请求、持久化已接受的工作,并返回提供商要求的成功响应。异步发送邮件并执行较慢的业务操作。HTTP 规范将 202 Accepted 定义为已接受处理,而不是处理完成,但您的提供商可能要求不同的成功响应。请遵循其 Webhook 协议。

在存储任何内容之前返回成功,如果进程崩溃,可能会丢失更新。等待所有下游操作完成,则可能导致超时并触发再次传递。持久化收件箱或队列可以在接收与处理之间提供边界。

使处理具备幂等性

幂等性意味着再次处理同一事件不会重复产生业务影响。发送方可能在您的服务器接受事件但确认信息丢失后重试。因此,重复传递应作为常规测试用例。

  • 如果存在已记录的事件标识符,请将其用作去重键,并限定在正确的提供商或账户范围内。
  • 如果不存在标识符,请根据稳定的事件字段设计组合键,并测试其冲突风险。
  • 在存储中原子地强制唯一性;单独执行“检查,然后插入”的顺序,在并发传递时可能发生竞争。
  • 也要保护下游操作。重复事件不得再次发送配送通知或重复执行财务操作。
  • 根据提供商的重放行为和您的恢复要求设置保留期限,而不是立即删除去重记录。

不要假定事件按时间顺序到达

不要仅因为某个请求最后到达,就覆盖当前货件状态。请比较事件含义、时间戳以及任何已记录的顺序信息。在历史记录中保留延迟到达的检查点,但不要自动将显示状态回退。同时,也要允许已记录的更正:规定已送达货件永远不能改变的僵化规则,可能会掩盖合理的例外或已更正的信息。

实用设置清单

1. 确认提供商协议

在实施前,确认注册要求、支持的事件、负载结构、身份验证、响应要求、超时、重试行为和 API 限制。检查通知表示快照还是增量变化,传递是否可能包含多条记录,以及订阅是否会发送初始状态。

对于 17TRACK 集成,请从官方 Tracking API 页面和 API 文档开始。使用提供商专属文档确定请求字段和回调要求;上面的通用负载不能替代这些文档。确认您计划部署的集成所适用的访问条件和运营限制。

2. 保护接收端点

使用 HTTPS 以及提供商文档规定的身份验证机制。如果使用 HMAC 签名,请准确验证其指定的签名输入。对于签署原始请求字节的情况,在验证前解析并重新序列化 JSON 可能会改变这些字节,从而使签名失效。对基于密钥生成的签名值使用恒定时间比较。

如果提供了带签名的时间戳或传递标识符,请应用文档规定的重放控制。有效签名可以验证消息身份,但本身不能证明消息是新鲜的。不要将密钥放入 URL 和应用程序日志中,支持密钥轮换,并限制请求大小。在存在可维护的地址范围时,IP 允许列表可以作为额外控制措施,但不能替代消息身份验证。

3. 将接收与业务处理分离

存储足够的信息,以便追踪并安全地重放已接受的事件。队列工作程序应规范化更新、应用状态转换规则并记录操作结果。将反复失败的工作放入可审查的死信流程,而不是无限重试。由于跟踪负载可能包含与客户相关的信息,因此应限制访问和保留期限。

4. 在上线前测试故障路径

  • 发送同一事件两次,包括并发传递。
  • 在较新的检查点之后传递较旧的检查点。
  • 模拟队列中断以及接收后工作程序崩溃。
  • 测试无效身份验证、格式错误的 JSON 和超大请求。
  • 测试未知货件、缺失的可选字段以及新增字段。
  • 验证一个已送达包裹不会完成拆分订单。
  • 在恢复后重放事件,并确认通知仍然完成去重。

在安全的情况下,应容忍新增字段,但不要默默地重新解释未知状态值。保留原始值,并通过已定义的备用或审查流程处理无法识别的情况。

轮询仍然适用的场景

轮询适用于初始同步、服务中断后的恢复,以及检查未收到预期更新的货件。不过,单纯没有消息并不能证明 Webhook 失败:包裹可能确实没有新的扫描记录。请根据 API 的当前状态或历史记录进行核对,而不是假设每个安静的货件都需要发出警报。

在规模规划中,一个简化的轮询模型是 每小时请求数 ≈ 活跃货件数 × 每个货件每小时的轮询次数,假设每个请求包含一个货件。批量端点会改变这一计算方式。例如,1,000 个货件每小时检查四次,在重试之前每小时会产生 4,000 个请求;这只是算术结果,并非提供商配额或价格估算。

根据货件活动和业务风险安排检查,遵守速率限制,并加入抖动,避免所有作业同时启动。对于可重试的失败,请使用有界退避并遵守适用的服务器指引。不要在未纠正永久性凭据或验证错误的情况下反复重试。

实用的混合系统使用 Webhook 处理常规更新,并通过定向 API 读取检查疑似遗漏。分别监控接收失败、队列年龄、处理失败、重复率和核对不匹配。如果时间戳可信,请区分来源数据延迟、Webhook 传递延迟和内部处理延迟。

常见问题

跟踪 Webhook 是实时的吗?

它们可以减少等待下一轮轮询所造成的延迟。但它们无法保证承运商立即扫描或来源立即更新。端到端的新鲜度包括承运商报告、提供商处理、请求传递以及您自己的应用程序处理。

启用 Webhook 后可以完全停止轮询吗?

如果提供商的恢复功能和您的业务要求允许,可能可以。对于运营上重要的货件记录,请保留一种核对方法。它可以是定向核对,而不是持续轮询每个货件。

如果我的 Webhook 端点离线,会发生什么?

恢复方式取决于发送方记录的重试策略。不要假定重试会无限持续。恢复端点后,检查失败的传递,使用受支持的重新传递工具,并在可用时通过 API 核对受影响的货件。

每个 Webhook 都应该触发客户通知吗?

不应该。事件可能是重复事件、历史检查点,或者是不改变面向客户状态的更新。应根据完成去重的业务状态转换触发通知,并为例外和更正制定规则。

HTTP 响应成功是否意味着货件更新已完成?

不一定。在异步设计中,这意味着接收端已根据约定协议接受事件。请分别跟踪处理完成情况和下游通知结果,以免已接受的请求掩盖失败的工作流。

来源

Loading