假设我们经营一个电子商务网站。客户通过 API 网关将订单发送到订单服务,然后发送到支付服务进行支付交易。然后,支付服务与外部支付服务提供商 (PSP) 对话以完成交易。
有两种方法可以处理与外部 PSP 的通信。
1. 简短轮询
支付服务向PSP发送支付请求后,会不断向PSP询问支付状态,经过几轮询问后,PSP最终返回支付状态。
短轮询有两个缺点:
- 不断轮询状态需要支付服务的资源。
- 外部服务直接与支付服务通信,产生安全漏洞。
2. Webhook
我们可以向外部服务注册一个 webhook。这意味着:当您对请求有更新时,在某个 URL 上回调我。当 PSP 完成处理后,它将调用 HTTP 请求来更新支付状态。
这样,编程范式就发生了改变,支付服务不再需要浪费资源去轮询支付状态。
如果 PSP 一直不回电怎么办?我们可以设置一个日常工作来每小时检查一次付款状态。
Webhook 通常被称为反向 API 或推送 API,因为服务器会向客户端发送 HTTP 请求。使用 Webhook 时我们需要注意 3 件事:
- 我们需要设计一个合适的API供外部服务调用。
- 出于安全原因,我们需要在 API 网关中设置适当的规则。
- 我们需要在外部服务上注册正确的URL。