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

这两种方法都不会让承运商更快地扫描包裹。两者都取决于跟踪来源何时接收并公开新信息。实际差异在于您的应用程序如何获知这些信息、会产生多少请求流量,以及传递失败时会发生什么。
跟踪 Webhook 与轮询:运营层面的差异
这两者是集成模式,而不是相互竞争的跟踪数据库。承运商或跟踪平台可能提供其中一种模式,也可能两者都提供,并且访问条件各不相同。请比较您计划使用的具体 API 的行为,不要假定所有 Webhook 服务都提供相同的保障。
| 决策点 | Webhook | 轮询 |
|---|---|---|
| 谁发起请求? | 跟踪服务调用您的端点。 | 您的应用程序调用跟踪 API。 |
| 更新延迟 | 取决于来源的新鲜度、事件生成、传递和处理。 | 还取决于下一次计划请求何时运行。 |
| 请求量 | 由发出的更新、批处理和传递重试决定。 | 由货件数量、轮询频率和批处理决定。 |
| 基础设施 | 需要可访问的接收端以及安全的入站请求处理机制。 | 需要调度器、出站 API 访问权限以及限流处理机制。 |
| 故障恢复 | 取决于提供商的重试机制以及您自己的核对流程。 | 取决于后续请求,以及 API 是否保留所需的历史记录。 |
优先选择 Webhook,当及时更新很重要且您的团队能够运行可靠的接收端时。优先选择轮询,当入站端点不切实际、货件量较小,或来源不提供合适的 Webhook 时。采用混合设计,当遗漏更新会影响客户沟通或运营,且 API 支持核对时。
不要假定 Webhook 成本更低。订阅费用、跟踪注册、API 调用、事件传递和基础设施可能采用不同的计费方式。请比较实际的商业条款和预期工作量,不要把请求更少视为账单更低的证明。
从承运商扫描到您的应用程序之间会发生什么?
- 识别货件。关联跟踪号码、必要时关联承运商信息以及内部货件参考号。某些服务要求在开始监控前完成注册。
- 配置事件传递。提供 HTTPS 回调 URL,并选择支持的事件订阅。
- 来源接收跟踪信息。承运商扫描或状态变化对跟踪服务变得可用。
- 服务发送 Webhook。请求可能包含完整的跟踪快照、单个检查点,或者仅包含一个需要通过 API 查询的引用。
- 您的接收端验证并存储信息。验证请求身份,检查其结构,并持久化记录或将事件加入队列。
- 工作程序更新业务系统。规范化状态、更新货件记录,并仅触发仍然适用的操作。
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 响应成功是否意味着货件更新已完成?
不一定。在异步设计中,这意味着接收端已根据约定协议接受事件。请分别跟踪处理完成情况和下游通知结果,以免已接受的请求掩盖失败的工作流。
来源
- RFC 9110:HTTP 语义 — HTTP 响应语义,包括接受处理和 Retry-After。
- RFC 2104:HMAC——用于消息身份验证的密钥散列 — 签名验证指南中引用的 HMAC 构造。
- GitHub 文档:使用 Webhook 的最佳实践 — 关于 HTTPS、密钥、异步处理和传递标识的一般工程指南;其中针对具体服务的规则不代表货件提供商的行为。
- 17TRACK Tracking API — 评估 17TRACK 跟踪集成的官方入口。
- 17TRACK API 文档 — 有关实施要求的提供商专属参考资料。


