Cloudflare Realtime
打造能擴展到上千人的視訊通話與即時語音——繁重的工作交給 Cloudflare 的全球網路。
Cloudflare Realtime 是什麼?
Cloudflare Realtime(前身叫 Cloudflare Calls)是用來打造即時音訊/影像應用的基礎設施——視訊通話、語音聊天、一起看影片等等——背後用的是 WebRTC,也就是瀏覽器用來傳即時影音的技術。
WebRTC(Web Real-Time Communication,網頁即時通訊)讓瀏覽器之間能以極低延遲互傳音訊與影像。難的是「很多人同時連線」這件事——而這正是 Realtime 用它的 SFU 來解決的。
把它想成一個總機交換台
與其讓每個人直接打給每個人(人一多就把裝置操爆),不如每人只把自己的串流送一次到 Cloudflare 的交換台,再由它轉發給其他所有人。送一次、多人收。
為什麼要用它?
在單純的點對點(mesh,網狀)通話裡,每個人都要把自己的影像各複製一份送給其他所有人。5 個人就已經是 20 條串流——很快就把手機和筆電壓垮。SFU 透過「集中轉發」幫大家解決這個問題。
撐得起大房間
每個用戶端只上傳一次,由 SFU 負責分送。房間人數可遠遠超過 mesh 的極限。
低延遲
媒體由離每位使用者最近的 Cloudflare 資料中心轉發,讓對話保持即時。
穿透防火牆
內建的 TURN 服務會在嚴格網路擋掉直連時,幫忙中繼媒體。
彈性掌控
它是不預設立場的基礎設施——上層的介面與邏輯都由你自由打造。
什麼時候該用?
視訊會議
多人互看互聽的群組通話與會議。
即時語音房
隨進隨聊的語音聊天、談話節目,或多人收聽的社群語音。
互動直播
遊戲大廳、一起看影片,或觀眾能上麥互動的活動。
即時客服與銷售
一對一或小組視訊,用於客服、家教或遠距醫療。
怎麼開始用?
Realtime 有三層:RealtimeKit(內建介面的現成 SDK)、SFU(低階 WebRTC 伺服器)、TURN(中繼服務)。下面直接用 SFU 的 HTTPS API:先建立 session,再推送一條本地軌道(track)。請先在控制台建立一個 Realtime app,取得 App ID 與 App Secret。
設定 app 憑證
App ID 用來辨識你的 app;App Secret 是它的密碼。Secret 要放在你的伺服器,千萬別放進瀏覽器。
export APP_ID="your-app-id" export APP_SECRET="your-app-secret"建立一個 session
一個 session 就是某位使用者與 Cloudflare 之間的一條 WebRTC 連線。回應會給你一個 sessionId,下一步會用到。
curl -X POST \ https://rtc.live.cloudflare.com/v1/apps/$APP_ID/sessions/new \ -H "Authorization: Bearer $APP_SECRET" # Response: # { "sessionId": "<SESSION_ID>" }推送本地軌道
一條 track 就是一路媒體串流(音訊或影像)。瀏覽器會產生一個 WebRTC「offer」(一段 SDP),描述它想送什麼;你把它轉送到這裡。location 設成 local,表示你正把媒體往上送到 Cloudflare。
curl -X POST \ https://rtc.live.cloudflare.com/v1/apps/$APP_ID/sessions/$SESSION_ID/tracks/new \ -H "Authorization: Bearer $APP_SECRET" \ -d '{ "sessionDescription": { "type": "offer", "sdp": "<LOCAL_OFFER_SDP>" }, "tracks": [ { "location": "local", "mid": "0", "trackName": "mic" }, { "location": "local", "mid": "1", "trackName": "camera" } ] }'套用 answer
Cloudflare 會回一段「answer」SDP。瀏覽器套用後就完成交握,媒體開始傳輸。要讓別人觀看,他們各自建立 session,並以 remote 方式拉取這些軌道即可。
{ "requiresImmediateRenegotiation": false, "sessionDescription": { "type": "answer", "sdp": "<CLOUDFLARE_ANSWER_SDP>" }, "tracks": [ { "mid": "0", "trackName": "mic" } ] }
想更省事?用 RealtimeKit
如果你不想碰原始的 WebRTC,RealtimeKit 提供帶有現成通話介面元件的 SDK——用少很多的程式碼就能做出會議功能。
重點概念
WebRTC
瀏覽器內建的即時音訊、影像與資料標準,延遲極低,不需外掛。
SFU(選擇性轉發單元)
Selective Forwarding Unit:一台伺服器,接收每人一份串流後,再轉發給其他人。
Mesh 對比 SFU
Mesh=人人互連(很吃資源)。SFU=大家連到同一個中繼(可擴展)。
Session(連線階段)
用戶端與 Cloudflare 之間的一條 WebRTC PeerConnection,內含一條或多條 track。
Track(軌道)
單一路媒體串流——麥克風一條、鏡頭一條。track 分 local(送出)與 remote(接收)。
TURN(中繼伺服器)
當防火牆擋掉直連時,負責中繼媒體的伺服器。搭配 SFU 使用時免費。
小提示與計費
計費方式
SFU 以「流出量(egress,從 Cloudflare 送出的媒體)」計費,每 GB 0.05 美元,每月前 1,000 GB 免費。TURN 搭配 SFU 使用時免費;單獨使用同樣是每 GB 0.05 美元、每月 1,000 GB 免費。
App Secret 只放伺服器端
絕對不要把 App Secret 送進瀏覽器。讓你的後端負責建立 session 與 track,再把用戶端真正需要的東西傳過去就好。
- 想快用 RealtimeKit,想完全掌控用 SFU——兩者互補。
- 一旦參與者超過約 3~4 人,SFU 的擴展性就遠勝 mesh。
- 搭配 Durable Objects 或 Workers 來管理房間狀態與信令(signaling)。
- 它是由 Cloudflare Calls 改名而來,舊文件可能仍用舊名稱。