調(diào)用三方服務為什么要使用 Webhook?
今天來聊聊 Webhook。
Webhook 是 "用戶定義的 HTTP 回調(diào)"。它們通常有以下幾個特點:
- 由事件觸發(fā),例如支付完成事件。
- 回調(diào)地址由用戶配置。
下圖顯示了輪詢方式和 webhook 方式的比較。
圖片
假設我們運營一個電子商務網(wǎng)站。用戶通過 API 網(wǎng)關向訂單服務發(fā)送訂單,訂單服務轉(zhuǎn)到支付服務進行支付。然后,支付服務與外部支付服務提供商(PSP)進行對話以完成真正的支付交易。
我們有兩種方法可以處理與外部 PSP 的通信。
短輪詢
向 PSP 發(fā)送支付請求后,支付服務會不斷向 PSP 詢問支付狀態(tài)。經(jīng)過幾輪后,PSP 最終返回付款狀態(tài)。
短輪詢有兩個缺點:
- 持續(xù)輪詢狀態(tài)需要支付服務的資源。
- 外部服務直接與支付服務通信,可能造成安全漏洞。
Webhook
我們可以向外部服務注冊一個 Webhook。當有關于請求的最新狀態(tài)更新時,請回調(diào)某個 URL。當 PSP 完成處理后,它會調(diào)用 HTTP 請求來更新付款狀態(tài)。
這樣,編程模式就改變了,支付服務就不再需要浪費資源來輪詢支付狀態(tài)了。
如果 PSP 從未回調(diào)怎么辦?我們可以設置一個 housekeeping 任務,每小時檢查一次付款狀態(tài)。
Webhook 通常被稱為反向 API 或推送 API,因為服務器會向客戶端發(fā)送 HTTP 請求。
使用 Webhook 時,我們需要注意以下三點:
- 我們需要設計一個適當?shù)?API 供外部服務調(diào)用。
- 出于安全考慮,我們需要在 API 網(wǎng)關中設置適當?shù)囊?guī)則,比如白名單設置,限流等。
- 我們需要在外部服務中注冊正確的 URL。