跳至主要内容

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 版本,這樣就能直接爽用啦~

Windows 環境測試 Safari 瀏覽器

· 閱讀時間約 1 分鐘

WebKit

前陣子在「DVD 彈跳動畫」這篇文章中,使用到 marquee 這個已經被棄用的 HTML 標籤,結果貼文發出後,才發現蘋果的 Safari 不支援這種作法,超級尷尬。

由於我手邊沒有蘋果的裝置可以拿來測試,於是在網路上搜尋了一下,發現在 Windows 的環境底下,可以透過 Playwright 內建的 Webkit 引擎來做測試。

有了這個方法之後,以後就很方便可以測試煩人的 WebKit(Safari 的引擎)啦~

筆記

FFmpeg 壓縮影片

· 閱讀時間約 1 分鐘

FFmpeg

上週在部落格上放了一些「復古遊戲的影片」。

我希望能夠兼顧支援度與畫質的同時,檔案也盡量不要太大。(Cloudflare Pages 檔案上限是 25 MB)

最後將影片都壓縮到 4 MB 左右,並維持 60 FPS 的流暢度,效果還算不錯。

我的小訣竅是:把編碼速度調到最慢,然後慢慢去調 CRF,直到「檔案大小」與「畫面品質」達到可接受的範圍就好囉~

筆記