什麼是無伺服器(Serverless)?無伺服器運算簡單解說
無伺服器係一種運行程式碼嘅方式,你唔需要自己設定或者管理任何伺服器。你將程式碼交俾雲端供應商,而佢只會喺有嘢觸發時先運行嗰段程式碼,例如一個網頁請求、一個上載嘅檔案,或者一個付款通知,然後就停止。你一般只需要為程式碼實際運行嘅時間付費,而唔係為一部閒置著嘅機器付費。
用 AI 建造嘢時,點解無伺服器重要
用 AI 建造應用程式時,你睇託管選項或者程式碼,就好可能會遇到「無伺服器函式」、「邊緣函式」(edge functions)或者「雲端函式」。好多託管平台都提供呢類功能,而有啲 AI 建構器亦會以呢種方式部署後端。明白呢個模式,有助你解答三條實際問題:
- 成本。 冇人用嘅時候,你嘅應用程式會唔會都要俾錢?
- 速度。 點解一段冷清時間之後嘅第一個請求會慢啲?
- 限制。 點解一個耗時嘅任務(例如生成一份大型報告,或者處理一段影片)會超時?
同時,知道無伺服器唔係咩嘢,亦好有幫助:佢唔係代表冇後端。你仍然有伺服器端程式碼,只係由別人負責運行部機器。基礎知識可以睇什麼係伺服器。
日常生活比喻
傳統伺服器就好似擁有一部私家車。佢一直都喺度,隨時可以即刻開行,但不論你有冇用佢,你都要付費:保險、泊車、保養。
無伺服器就好似叫的士。你只需要為你搭嘅每一程付費;如果一百個人同時需要車,就會來一百部的士。不過,車子到達可能要等一陣(即冷啟動),每程都有最長行車時間,而且司機唔會記得你上次嘅車程(函式係無狀態,stateless)。
無伺服器函式點運作
最常見嘅形式稱為函式即服務(functions as a service):
- 你寫一個函式,即一段處理某類事件嘅小程式碼,例如「處理發送到
/api/bookings嘅 POST 請求」。 - 你部署佢。 供應商會儲存佢,並將佢連接到一個觸發器:一個網址、一個排程、儲存空間入面嘅新檔案,或者佇列中嘅一則訊息。
- 事件到達。 供應商會啟動你函式嘅一個副本(或者重用一個已經暖機嘅副本),運行佢,然後返回結果。
- 自動擴展。 如果同時有一千個請求到達,供應商會並行運行多個副本,上限視乎你帳戶嘅限制。
- 進入閒置。 流量停止時,副本就會關閉。冇嘢運行,就唔使為運算付費。
一個細小嘅 JavaScript 無伺服器函式可能會咁樣寫:
export default async function handler(request) {
const { name } = await request.json();
return Response.json({ message: `Hello, ${name}` });
}
你唔需要寫程式碼去啟動伺服器、開啟埠口或者保持程序運行。呢啲全部都由平台處理。
「無伺服器」亦會被較寬鬆地用於其他會自動擴展、按用量收費嘅代管服務,例如無伺服器資料庫,佢哋閒置時就會暫停。
常見名詞
| 名詞 | 意思 |
|---|---|
| 函式(Function,FaaS) | 供應商按需要運行嘅一個細小程式碼單元。 |
| 觸發器/事件(Trigger/event) | 啟動函式嘅原因,例如 HTTP 請求、檔案上載、計時器或者佇列訊息。 |
| 冷啟動(Cold start) | 函式嘅新副本要先啟動,才能處理請求所造成嘅延遲。 |
| 暖機(Warm) | 一個已經運行中、可以即時回應嘅副本。 |
| 無狀態(Stateless) | 函式喺每次運行之間唔會保留記憶。任何必須持續保存嘅嘢都要放入資料庫或者儲存空間。 |
| 超時(Timeout) | 一次運行所允許嘅最長時間。例如 AWS Lambda 嘅上限係 15 分鐘;好多平台預設嘅時限遠遠短於呢個。 |
| 邊緣函式(Edge function) | 喺好多個靠近用戶嘅地點運行嘅函式,通常限制較嚴。 |
| 縮減至零(Scale to zero) | 冇流量時,唔運行任何嘢,亦唔需要為運算付費。 |
實例:一個細型預約網站
一間瑜伽室嘅預約網站,每個星期日晚上新課表推出時會有一陣訪問高峰,平日其他時間就幾乎冇人。
- 用一部長期開著嘅伺服器,瑜伽室就要 24 小時付費租用一部機器,容量要配合星期日晚上嘅高峰,而平時大部分時間都閒置。
- 用無伺服器函式,
GET /api/classes同POST /api/bookings都係函式。星期日嘅高峰會自動啟動多個副本;而喺一個寧靜嘅星期二早上,幾乎冇嘢運行,賬單亦接近零。
取捨亦會出現。星期二早上第一個打開網站嘅人,可能要多等一陣,因為冷啟動。資料庫要處理來自多個函式副本嘅大量短暫連線,或者需要連線池(connection pooler)。而如果瑜伽室之後想加入「為所有人生成年度出席 PDF」嘅任務,佢可能會超出函式嘅時限,需要另外喺其他地方運行。
無伺服器幾時啱用,幾時唔啱
| 較啱用 | 較唔啱用 |
|---|---|
| 流量低、突然湧現或者難以預測 | 持續大量流量,此時一直開著嘅伺服器可能更平 |
| 短暫嘅請求/回應任務:API、表格處理器、webhook | 長時間運行嘅工作:大型影片處理、大數據匯入 |
| 唔想管理伺服器嘅小團隊 | 需要保持即時連線開啟嘅應用程式(例如部分聊天或者多人遊戲功能),除非平台支援 |
| 事件處理:「當檔案上載時,製作縮圖」 | 需要喺多次請求之間保留大量記憶體嘅應用程式 |
常見誤解
- 「無伺服器即係冇後端。」 意思係冇伺服器需要管理。你仍然要寫同保護後端程式碼。
- 「無伺服器一定較平。」 流量少時係平,但如果流量高而且穩定,按每次請求計費可以累積成一筆大數目。
- 「無伺服器可以無限擴展。」 平台有並發上限,而你嘅資料庫可能會比函式先成為瓶頸。
- 「喺函式入面儲存嘅檔案,下次都會在。」 本地儲存是暫時性嘅。應該使用資料庫或者檔案儲存空間。
- 「縮減至零即係無伺服器。」 兩者有關連,但並不完全相同。有啲平台會將你嘅應用程式當作一般伺服器運行,閒置時休眠,並喺下一個請求到達時喚醒。佢哋能夠節省類似嘅費用,首個請求延遲亦相近,但冇函式式嘅每次請求時限。
要問你嘅 AI 建構器嘅嘢
- 「呢個後端會以無伺服器函式運行,定係以長期開著或者會休眠嘅伺服器運行?對成本有咩影響?」
- 「有冇任務可能會超出平台嘅時限?如果有,我哋應該點樣處理?」
- 「所有必須持續保存嘅嘢,都要儲存喺資料庫或者檔案儲存空間,而唔係記憶體或者本地檔案。」
- 「如果好多副本同時運行,資料庫連線應該點樣管理?」
- 「應用程式閒置之後,第一個請求會有幾多延遲?」
Mythex 點樣託管應用程式
Mythex 唔會將其託管描述為無伺服器函式。你發布時,應用程式會以一般網頁應用程式或者容器嘅形式運行,由 Mythex 為你管理,你唔需要設定任何託管。佢係縮減至零:已發布嘅應用程式同其資料庫閒置時會休眠,並喺下一次訪問時喚醒;休眠嘅應用程式唔會有運算費用,只有流量高峰時先會啟動額外機器(Pro 計劃每項服務最多 3 部)。附加嘅 Postgres 資料庫亦會喺閒置 5 分鐘後休眠,並按佢保持運行嘅時間收費。所以你可以享有「用多少付多少」嘅大部分好處,而一段冷清時間之後,首個請求嘅延遲亦會類似。詳情可以參閱文件中嘅託管限制,以及我哋嘅指南網頁託管同減少託管成本。
常見問題
簡單嚟講,無伺服器係咩意思?
無伺服器即係你將程式碼交俾雲端供應商,佢只喺有需要嗰陣先運行,例如有請求到達時,而你唔使設定或者照顧任何伺服器。你通常只需要為程式實際運行嘅時間付費,而唔係為一部長期開著嘅機器付費。
無伺服器真係冇伺服器嗎?
其實有伺服器,只係你唔使管理佢哋。供應商喺自己嘅機器上運行你嘅程式碼,請求到達時先啟動,負載增加時就擴展,閒置時就關閉。
什麼係冷啟動(cold start)?
冷啟動係無伺服器函式閒置一段時間之後運行時,額外多出嚟嘅延遲,因為供應商要先啟動一個全新嘅副本。視乎平台、語言同程式碼大小,延遲可以由幾乎察覺唔到,到一秒或者以上不等。
無伺服器比一般伺服器平嗎?
對於流量少或者時多時少嘅應用程式,通常係平,因為閒置時你幾乎唔使付費。對於流量龐大而且持續嘅應用程式,一部長期開著嘅伺服器反而可能更平。要視乎你嘅使用模式同供應商嘅收費。
無伺服器平台有咩例子?
知名例子包括 AWS Lambda、Google Cloud Run functions、Azure Functions、Cloudflare Workers,以及 Vercel 同 Netlify 等託管平台嘅函式功能。