什麼是 Serverless?無伺服器運算簡單說明
Serverless 是一種執行程式的方式,你不需要自己設定或管理任何伺服器。你把程式交給雲端服務商,它只在有事件觸發時才執行該程式(例如網路請求、上傳檔案、付款通知),執行完就停止。你通常只為程式實際執行的時間付費,而不是為閒置的機器付費。
用 AI 建立東西時,為什麼 serverless 很重要
用 AI 建立應用程式、查看託管選項或程式碼時,你會遇到「serverless 函式」、「edge 函式」或「雲端函式」等名詞。許多託管平台都提供這些功能,有些 AI 建構工具也以這種方式部署後端。了解這種模式,有助於你回答三個實際問題:
- 成本。 沒有人使用時,你的應用程式還會花錢嗎?
- 速度。 為什麼長時間沒人使用後的第一次請求會比較慢?
- 限制。 為什麼某個耗時的任務(例如產生大型報表、處理影片)會逾時?
同時也要知道 serverless 不是什麼:它不代表沒有後端。你仍然有伺服器端的程式,只是機器改由別人運行。關於基礎概念,請參閱什麼是伺服器。
日常生活中的比喻
傳統伺服器就像自己擁有一台車。它隨時都在那裡,可以立刻出發,但不論你開不開,你都要付保險、停車費和保養費。
Serverless 則像是叫計程車。你只為實際搭乘的車程付費,如果一百個人同時需要搭車,就會有一百輛計程車來。但車子到達可能需要一點等待時間(也就是冷啟動),每趟車程都有最長時限,而且司機不會記得你上次搭車的事(函式是無狀態的)。
Serverless 函式如何運作
最常見的形式稱為函式即服務(functions as a service):
- 你撰寫一個函式:一小段程式,負責處理某一類事件,例如「處理送到
/api/bookings的 POST 請求」。 - 你部署它。 服務商會儲存它,並將它連接到觸發條件:一個網址、一個排程、儲存空間中新增的檔案,或佇列中的一則訊息。
- 事件抵達。 服務商會啟動你函式的一份副本(或重複使用一份已暖機的副本),執行它並回傳結果。
- 自動擴充。 如果同時抵達一千個請求,服務商會平行執行多份副本,直到達到你帳號的限制為止。
- 進入閒置。 流量停止後,副本會被關閉。沒有任何程式在執行時,運算就不需要付費。
一個用 JavaScript 寫的簡單 serverless 函式可能長這樣:
export default async function handler(request) {
const { name } = await request.json();
return Response.json({ message: `Hello, ${name}` });
}
你不需要任何程式碼來啟動伺服器、開啟連接埠或讓程序持續運行。這些都由平台處理。
「Serverless」一詞也會較寬鬆地用於其他會自動擴充、依使用量計費的代管服務,例如閒置時會暫停的 serverless 資料庫。
關鍵術語
| 術語 | 意思 |
|---|---|
| 函式(Function,FaaS) | 服務商隨需執行的一小段程式。 |
| 觸發條件/事件(Trigger / event) | 啟動函式的原因,例如 HTTP 請求、檔案上傳、計時器或佇列訊息。 |
| 冷啟動(Cold start) | 處理請求前,必須先啟動一份新函式副本所造成的延遲。 |
| 暖機(Warm) | 已經在執行、可以立即回應的副本。 |
| 無狀態(Stateless) | 函式在每次執行之間不保存記憶體。任何必須持久保存的內容,都要放進資料庫或儲存空間。 |
| 逾時(Timeout) | 單次執行允許的最長時間。例如 AWS Lambda 的上限是 15 分鐘;許多平台的預設值則短得多。 |
| Edge 函式 | 在靠近使用者的多個地點執行的函式,限制通常較嚴格。 |
| 縮減至零(Scale to zero) | 沒有流量時不執行任何程式,也不需要為運算付費。 |
實例:小型預約網站
一間瑜伽教室的預約網站,每週日晚上新課表上線時會湧入大量訪客,其餘時間幾乎沒有人造訪。
- 使用永遠開著的伺服器時, 教室必須全天候付費租用一台機器,其規格要配合週日晚上的尖峰流量,而其他時間大多閒置。
- 使用 serverless 函式時,
GET /api/classes和POST /api/bookings都是函式。週日的湧入流量會自動啟動許多副本;在安靜的週二早上,幾乎沒有任何程式在執行,帳單也接近於零。
取捨也會出現。週二早上第一位打開網站的人,可能要多等一下冷啟動。資料庫必須處理許多來自不同函式副本、且存活時間很短的連線,可能需要連線池(connection pooler)。而如果教室之後想要「產生所有人的年度出席 PDF」這類任務,可能會超過函式的時間限制,因而需要在其他地方執行。
適合與不適合 serverless 的情況
| 較適合 | 較不適合 |
|---|---|
| 流量低、忽高忽低或難以預測 | 持續大量的流量,此時永遠開著的伺服器可能較便宜 |
| 簡短的請求/回應任務:API、表單處理程式、webhook | 長時間執行的工作:大型影片處理、大量資料匯入 |
| 不想管理伺服器的小型團隊 | 需要保持即時連線的應用程式(例如某些聊天或多人遊戲功能),除非平台支援 |
| 事件處理:「上傳檔案時,產生縮圖」 | 需要在多次請求之間保留大量記憶體的應用程式 |
常見迷思
- 「Serverless 代表沒有後端。」 它的意思是沒有需要你管理的伺服器。你仍然要撰寫並保護後端程式碼。
- 「Serverless 一定比較便宜。」 在低流量時確實便宜,但在高且穩定的流量下,按請求計費的費用可能會累積得很快。
- 「Serverless 可以無限擴充。」 平台有併發數量的限制,而且你的資料庫可能遠在函式之前就成為瓶頸。
- 「函式中儲存的檔案下次還會在。」 本機儲存空間是暫時的。請使用資料庫或檔案儲存服務。
- 「縮減至零就等於 serverless。」 兩者相關但並不完全相同。有些平台會以一般伺服器的方式運行你的應用程式,閒置時進入休眠,並在下一次請求時喚醒。它能節省類似的費用,首次請求的延遲也類似,但沒有按請求計算的函式式時間限制。
可以向 AI 建構工具要求的事項
- 「這個後端會以 serverless 函式運行,還是以永遠開著或會休眠的伺服器運行?這對成本有什麼影響?」
- 「有沒有任務可能會超過平台的時間限制?如果有,我們應該如何處理?」
- 「所有必須持久保存的內容,都請存進資料庫或檔案儲存空間,而不是記憶體或本機檔案。」
- 「如果有許多副本同時執行,資料庫連線應該如何管理?」
- 「應用程式閒置一段時間後,第一次請求的延遲是多少?」
Mythex 如何託管應用程式
Mythex 不會把它的託管方式描述為 serverless 函式。當你發布時,你的應用程式會以一般的網頁應用程式或容器形式運行,由 Mythex 為你管理,你不需要設定任何託管環境。它採用縮減至零的方式:已發布的應用程式與其資料庫在閒置時會休眠,並在下一次造訪時喚醒;休眠中的應用程式不產生運算費用,只有在流量很大時才會啟動額外的機器(Pro 方案每個服務最多可有 3 台)。附加的 Postgres 資料庫在閒置 5 分鐘後也會休眠,並依其清醒的時間計費。因此,你可以享有大部分「用多少付多少」的好處,而在長時間沒人使用後,第一次請求的延遲也與上述情況類似。請參閱文件中的託管限制,以及我們的網站託管和降低託管成本指南。
常見問題
簡單來說,serverless 是什麼意思?
Serverless 是指你把程式交給雲端服務商,只在需要時才執行它,例如有請求進來的時候,而你不必設定或照顧任何伺服器。你通常只為程式實際執行的時間付費,而不是為一台永遠開著的機器付費。
Serverless 真的沒有伺服器嗎?
其實還是有伺服器,只是你不需要管理它們。服務商會在它自己的機器上執行你的程式,在請求抵達時啟動,在負載增加時自動擴充,閒置時再將它關閉。
什麼是冷啟動?
冷啟動是指 serverless 函式在閒置一段時間後執行時多出來的延遲,因為服務商必須先啟動一份全新的副本。依平台、程式語言和程式碼大小不同,延遲可能從幾乎察覺不到到一秒以上都有。
Serverless 比一般伺服器便宜嗎?
對於流量少或時多時少的應用程式,通常是的,因為閒置時幾乎不用付費。對於持續大量流量的應用程式,永遠開著的伺服器可能比較便宜。這取決於你的使用模式與服務商的定價。
有哪些 serverless 平台的例子?
知名的例子包括 AWS Lambda、Google Cloud Run functions、Azure Functions、Cloudflare Workers,以及 Vercel 和 Netlify 等託管平台所提供的函式功能。