Polling 和 Webhook 是什麼?如何更有效的串接第三方系統?

古古

2025/02/18


一般在實作後端系統時,如果想要去串接外部的第三方系統,這時候就會有兩種串接方式:Polling 和 Webhook,所以這篇文章我們就來了解一下 Polling 和 Webhook 之間的差別吧!

什麼是 Polling?什麼是 Webhook? #

在串接第三方的系統時,我們可以使用兩種方式來串接,分別是 Polling 和 Webhook,而他們兩個在實作上其實是完全相反的兩種方式:

  • Polling(輪詢): 由「我們的後端程式」主動且瘋狂的去問「第三方系統」,詢問當前數據的值為何。
  • Webhook: 當數據有變動時,由「第三方系統」主動通知「我們的後端程式」,告訴我們數據已經變化了。

這個乍聽之下會覺得有點抽象,所以下面就透過一個例子,來介紹一下 Polling 和 Webhook 的差別。

串接股票中心的故事 #

假設你現在想要實作一個後端的系統,當你偵測到某隻股票的價格低於某個點時(譬如說台積電股價跌破 1000 元),這時候你就要在後端系統中儲存當下的時間,如果是由你來實作這個後端程式,你會怎麼實作?

使用 Polling 來串接 #

最直覺的做法,就是在你的後端程式裡面,每秒鐘都去 call 股票中心的 API,瘋狂的去問台積電現在的價格是多少,因此假設在 12:01 分時台積電的價格跌到 960 元,你就可以在你的系統中記錄當前的這筆時間。

上面這種「不斷的去詢問股票中心 Server 當前的股價為何」的行為,就稱為是 Polling(輪詢)。

但是上面這個做法有一個缺點,就是你 「每一秒」 都得要 call 一次股票中心的 API,才能知道當下的台積電股價,又因為一天有 86400 秒,所以你的後端程式一天就得要 call 股票中心的 API 86400 次,就會造成很大量的 API call,加重股票中心 server 的負擔。

並且上面的做法除了會使得 API call 的數量飆升之外,其實在這些 API call 中,也不是每一次的 API 都很有用處。因為我們真正想要的功能,是「當台積電跌破 1000 元以下時,記錄當下的時間」,所以當台積電現在是 1100、1200、1300 元時,這些 API call 的返回值對我們都是沒有意義的,就只有跌破 1000 元的那個時間點,才是我們真正關注的部分。

所以為了解決 Polling 的問題,Webhook 就出現了!

使用 Webhook 來串接 #

在剛剛的 Polling 中,主動方是「我們實作的後端程式」,也就是由我們主動發起 API call,一直不斷地瘋狂去煩股票中心,問他現在台積電的股價是多少。

而在 Webhook 中,則是會反過來,主動方變成是「股票中心」,也就是當台積電跌破 1000 元時,股票中心就會主動 call 我們的 API,通知我們台積電跌破 1000 元了!!

所以在 Webhook 的設計中,主動方會變成是「股票中心」,只有當股票中心發現台積電跌破我們預期的值時,才發送通知給我們,在其他時間時,股票中心則是會什麼事都不做,完全不會 call 我們的 API,大大的減少了 API call 的次數。

因此透過 Webhook 的設計,就可以將 API call 的次數降到最低,只有在台積電的股價跌破 1000 元時才會 call 一次我們的 API,比起前面的 Polling 的設計要 call 86400 次少多了!!因此在一般在實作上,通常會建議採用 Webhook 的設計,這樣子可以讓兩邊的 Server 負擔都不會那麼大,減少浪費的 API call 次數。

Polling 和 Webhook 總結 #

所以總結上面的介紹的話,當我們在串接第三方的系統時,就可以使用兩種方式來串接,分別是:

  • Polling(輪詢): 由「我們的後端程式」主動且瘋狂的去問「第三方系統」,詢問當前數據的值為何。
  • Webhook: 當數據有變動時,由「第三方系統」主動通知「我們的後端程式」,告訴我們數據已經變化了。

因此下次大家在串接第三方系統時,就可以看一下他們的系統是否有支援 Webhook 的設計,如果有的話,就可以使用 Webhook 的方式來串接,這樣子就不用再瘋狂的一直去重複大量的 API call 了!

補充:在 Webhook 的實作中,股票中心是如何通知我們的後端程式? #

了解了 Polling 和 Webhook 的差異之後,這裡也順便補充一下 Webhook 的實作。

因為 Webhook 的核心設計理念是「由股票中心變成主動方」,因此當台積電股價跌破 1000 元時,股票中心需要主動通知我們的後端程式,告訴我們台積電目前的股價。

所以為了讓「股票中心有能力通知我們的後端程式」,需要實作兩個步驟:

1. 我們需要先在我們自己的後端程式中,先新增一個新的 API

首先我們需要在我們的後端程式裡面,先新增一個 API 出來(假設叫做 /myapi),至於這個 API 的請求參數有哪些、以及這個 API 的請求方法(ex: GETPOST)為何,通常第三方系統都會有詳細的定義,到時可以查詢一下第三方系統的相關文件。

@RestController
public class MyController {

    @RequestMapping("/myapi")
    public void myApi(@RequestParam String stockName,
                      @RequestParam Integer price) {
        // 記錄當前股價和時間
    }
}

2. 到第三方系統中,在 Webhook 處填上你的 /myapi 的 API

創建好 API 之後,接著可以登入到第三方系統,然後通常就會有一個填寫 Endpoint URL 的地方(如下圖所示),讓你將你剛剛所創建的 /myapi 的 API 給填上來(這邊因系統不同而有不同的介面,甚至有的第三方系統沒有 UI 介面,要自己去跟他們的工程師對接)。

只要完成了上述的步驟之後,未來當你預期的事件發生時(ex: 台積電跌破 1000 元),這時候第三方系統就會 call 你所填上的 API(也就是 https://example.com/myapi)。

所以換句話說的話,當你的 /myapi 被 call 時,就表示台積電跌破 1000 元了,因此你就可以在這個 /myapi 的程式中,去實作你想要實作的功能(如記錄當前的股價和時間…等等),這樣子就可以和第三方系統成功使用 Webhook 串接在一起了!

結語 #

這篇文章我們先分別介紹了 Polling 和 Webhook 是什麼,並且也比較了他們之間的差別,Polling 和 Webhook 可以說是在串接第三方系統時很常見的兩種方式,雖然目前比較流行的是 Webhook 的作法,但是多了解一下 Polling 的設計理念也是很可以的~

如果你對後端技術有興趣的話,也歡迎免費訂閱 《古古的後端筆記》電子報 ,每週二為你送上一篇後端技術分享,那我們就下一篇文章見啦!

補充:我開設的 Spring Boot 零基礎入門 Spring Security 零基礎入門 GitHub 免費架站術 已在 Hahow 平台上架啦!輸入折扣碼「HH202503KU」即可享 85 折優惠。

免費訂閱《古古的後端筆記》電子報

每週二學習後端技術,和 3100 人一起變強💪