指南

什麼是 Serverless?無伺服器運算簡單說明

Serverless 是一種執行程式的方式,你不需要自己設定或管理任何伺服器。你把程式交給雲端服務商,它只在有事件觸發時才執行該程式(例如網路請求、上傳檔案、付款通知),執行完就停止。你通常只為程式實際執行的時間付費,而不是為閒置的機器付費。

用 AI 建立東西時,為什麼 serverless 很重要

用 AI 建立應用程式、查看託管選項或程式碼時,你會遇到「serverless 函式」、「edge 函式」或「雲端函式」等名詞。許多託管平台都提供這些功能,有些 AI 建構工具也以這種方式部署後端。了解這種模式,有助於你回答三個實際問題:

  • 成本。 沒有人使用時,你的應用程式還會花錢嗎?
  • 速度。 為什麼長時間沒人使用後的第一次請求會比較慢?
  • 限制。 為什麼某個耗時的任務(例如產生大型報表、處理影片)會逾時?

同時也要知道 serverless 不是什麼:它不代表沒有後端。你仍然有伺服器端的程式,只是機器改由別人運行。關於基礎概念,請參閱什麼是伺服器。

日常生活中的比喻

傳統伺服器就像自己擁有一台車。它隨時都在那裡,可以立刻出發,但不論你開不開,你都要付保險、停車費和保養費。

Serverless 則像是叫計程車。你只為實際搭乘的車程付費,如果一百個人同時需要搭車,就會有一百輛計程車來。但車子到達可能需要一點等待時間(也就是冷啟動),每趟車程都有最長時限,而且司機不會記得你上次搭車的事(函式是無狀態的)。

Serverless 函式如何運作

最常見的形式稱為函式即服務(functions as a service):

  1. 你撰寫一個函式:一小段程式,負責處理某一類事件,例如「處理送到 /api/bookings 的 POST 請求」。
  2. 你部署它。 服務商會儲存它,並將它連接到觸發條件:一個網址、一個排程、儲存空間中新增的檔案,或佇列中的一則訊息。
  3. 事件抵達。 服務商會啟動你函式的一份副本(或重複使用一份已暖機的副本),執行它並回傳結果。
  4. 自動擴充。 如果同時抵達一千個請求,服務商會平行執行多份副本,直到達到你帳號的限制為止。
  5. 進入閒置。 流量停止後,副本會被關閉。沒有任何程式在執行時,運算就不需要付費。

一個用 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 等託管平台所提供的函式功能。

Mythex · Pricing · 用 AI 打造任何東西 · 網站與應用程式範本 · Mythex 比較 · AI 應用程式開發詞彙表 · 免費的 AI 應用程式開發工具 · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港)