跳至主要内容

Cloudflare 即時聊天室

· 閱讀時間約 2 分鐘

聊天室

前陣子想說看可不可以用 Cloudflare Worker 來做個簡單的聊天室,因為我發現 Cloudflare Worker 雖然是 serverless,但是它的冷啟動時間超短,幾乎可以忽略不計。

總之,一般聊天室做法大概有三種:

  1. Polling
  2. Long Polling
  3. WebSocket

Polling

  • 資料儲存:使用 Cloudflare D1(基於 SQLite 的資料庫)
  • 讀取訊息:Worker 定期查詢 D1 獲取新訊息(每 4 秒查詢一次)
  • 傳送訊息:直接寫入 D1 資料庫
  • MOD 功能:可在 env 設定管理員密碼來刪除訊息
  • 安全限制:限制 API 速率、只能在指定網域使用等等

嗯...這個方法呢,稍微有點沒效率,尤其是一直去查詢資料庫的部分。

不過,以我這個小網站來說,用起來確實是沒問題的~

Long Polling

Long Polling 的原理是:Client 發送請求後,Worker 會等待一段時間(比如 30 秒),如果在這段時間內有新資料,就馬上回傳;如果時間到了還是沒資料,就直接回傳,然後再重新連接一次。

這個方法的問題是會一直占用 CPU,這樣非常浪費 Worker 的時間額度,所以感覺不太實際,就沒有去試了。

WebSocket

WebSocket 是一般比較正規的選擇。

  • 資料儲存:使用 Cloudflare Durable Objects 的 SQLite 方案
  • 連接管理:客戶端通過 WebSocket 建立持久連接到 Durable Object 上面
  • 傳送訊息:接收到訊息後直接 broadcast 給所有連接的人
  • 聊天歷史:通過 state.get()state.put() 等 Storage API 持久化到 SQLite

備註:如果是自己處理的話,就要架一個 WebSocket 伺服器;若想省事,就是用 Pusher 這類的第三方服務。

Bonus:交給別人來做

直接在網頁中崁入一個 Twitch 的聊天室就好了呀~(蛤?)

心得

因為我這次只是想試試看可行性,最後就只有做 Polling 而已,因為它足夠簡單,也已經夠用了。

再加上,我原本查 Durable Objects 好像是要付費的,不過現在好像有免費方案了!

如果未來真的有需要,可以直接用一些現成的、別人已經寫好的 Cloudflare Durable Objects 版本,這樣就能直接爽用啦~