揭開革命序幕:探索無伺服器運算的世界

揭開革命序幕:探索無伺服器運算的世界

什麼是無伺服器?

無伺服器(Serverless),顧名思義,就是無伺服器運算。你可能會疑惑,沒有伺服器怎麼進行運算?實際上,無伺服器並非真的沒有伺服器,而是透過技術手段將伺服器的概念從業務邏輯中抽離,讓開發者只需專注於應用程式本身,而無需操心底層基礎設施。

無伺服器如何運作?

自從無伺服器出現以來,許多開發者將其視為一項新技術,它確實很新,因為它帶來了極大的便利。不過,我們不必把它想得太複雜或感到畏懼。應用程式運行的底層邏輯並未改變,無伺服器只是採用技術手段幫我們屏蔽了其中繁瑣的部分,就像其他雲端技術一樣。

在無伺服器出現之前,部署一個網頁應用程式是相當麻煩的。為了讓應用程式跑起來,我們必須先在伺服器端建置執行環境。這包括購買虛擬機器、初始化環境、安裝所需的依賴套件——並盡可能確保與本地開發環境一致。接著,為了讓用戶能存取應用程式,我們需要購買網域名稱、用虛擬機器的 IP 位址註冊、配置並啟動 Nginx,最後上傳並啟動應用程式程式碼。

與傳統工作流程形成鮮明對比的是,無伺服器部署只需要三個簡單步驟,是對伺服器端操作的極致抽象。本質上,用戶 HTTP 資料請求的整個鏈條並未改變,無伺服器只是簡化了整體模型。

具體來說,過去我們必須在伺服器端建置執行環境,而 FaaS(函數即服務)應用程式將這一步抽象成函數服務。過去我們需要負載平衡和反向代理,FaaS 應用程式將其抽象成 HTTP 函數觸發器。過去需要上傳程式碼並啟動應用程式,FaaS 應用程式則將其抽象成函數程式碼。

當用戶首次存取一個 HTTP 函數觸發器時,觸發器會持有用戶的 HTTP 請求,並為函數服務生成一個 HTTP 請求事件通知。

接著,函數服務會檢查是否有閒置的函數實例。如果沒有,它會從函數程式碼儲存庫中取得你的程式碼,初始化並啟動一個函數實例,執行函數,將 HTTP 請求物件作為參數傳入,然後運行函數。

此外,函數執行後的 HTTP 回應會返回給函數觸發器,再由觸發器將結果轉發給等待的用戶客戶端。

無伺服器與應用程式託管 PaaS 平台之間最大的差異在於資源利用率,這也是無伺服器最顯著的創新。無伺服器應用程式的實例可以縮減到零,而 PaaS 平台至少需要一個伺服器或容器持續運行。

在第一次調用之前,函數實際佔用的伺服器資源為零。只有當用戶發出 HTTP 資料請求時,函數服務才會被 HTTP 事件觸發,啟動一個函數實例。這意味著如果沒有用戶請求,函數服務就沒有運行中的實例,也就不消耗任何伺服器資源。相反,在 PaaS 平台上建立一個應用程式實例通常需要幾十秒,而且為了確保服務可用性,至少要有一個伺服器持續運行你的應用程式實例。

打個比方,無伺服器就像一個聲控燈——有人時迅速亮起,沒人時自動關閉。與傳統的手動開關燈相比,聲控燈在節能方面表現出色。不過,這種節能能力取決於聲控燈在需要時能迅速點亮。

同樣地,無伺服器優勢的關鍵在於其快速啟動時間。它是如何做到的呢?

為什麼無伺服器能這麼快啟動?

冷啟動(Cold Start)原本是個人電腦領域的概念,指的是在電源關閉後重新載入 BIOS 表的過程——基本上是從硬體驅動程式開始啟動,因此啟動時間較長。

在當今的雲端環境中,幾乎不會對實體伺服器進行電源關閉。在無伺服器的語境下,冷啟動指的是從函數被調用到函數實例準備就緒的整個過程。我們的重點是盡可能縮短啟動時間,因為啟動時間越短,資源利用率就越高。目前,雲端供應商利用語言特定的優化,已將平均冷啟動時間控制在 100 到 700 毫秒之間。Node.js 得益於 Google 的即時編譯(Just-In-Time compilation)技術,擁有最快的冷啟動速度。

值得注意的是,一個無伺服器服務可以在 100 毫秒內從零開始、執行函數並完成整個流程——這也是無伺服器能自信地縮減到零的主要原因。當開啟一個網頁時,響應時間低於一秒通常被認為是極佳的表現。在這種情況下,100 毫秒的啟動時間對頁面載入時間的影響微乎其微。

此外,可以合理地預期雲端供應商會持續優化其基礎設施,以實現更快的啟動速度,最終提高資源利用率。例如,在冷啟動過程中,下載函數程式碼是一個耗時的步驟。因此,在程式碼更新後,雲端供應商通常會主動啟動資源調度,提前下載並建置函數實例的容器映像。當第一個請求到達時,它們可以利用這些快取的映像檔,跳過冷啟動中的程式碼下載步驟,直接從映像檔啟動容器。這種技術稱為暖啟動(Warm Start)。因此,對於延遲敏感的應用程式,我們可以利用暖啟動或實例預熱策略來加速或規避冷啟動時間。

無伺服器是如何分層的?

當你的無伺服器實例執行時,它至少包含三個層級:容器(Container)、執行期(Runtime)和函數程式碼。

可以將容器視為作業系統(OS)。程式碼執行需要與硬體互動,容器模擬了核心和硬體資訊,讓你的程式碼和執行期能在其中運行。容器資訊包括記憶體大小、作業系統版本、CPU 詳細資料、環境變數等。目前,FaaS 的實現可能使用 Docker 容器、虛擬機器(VM),甚至沙箱環境。

執行期代表函數執行的環境。執行期資訊包括所使用的程式語言和版本,例如 Node.js v10 或 Python 3.6;可呼叫的物件,如 aliyun SDK;以及系統資訊,如環境變數。

這種分層架構有什麼好處?容器層的適用範圍更廣,讓雲端供應商可以預先準備大量容器實例,有效地將實體伺服器資源碎片化。執行期實例的適用範圍較低,可以預先準備較少數量。一旦容器和執行期固定下來,下載並執行程式碼就變得簡單。這種分層架構實現了高效的資源優化,讓你的程式碼能夠快速且經濟地執行。

總結

  1. 純粹的無伺服器應用程式的調用鏈包含三個主要部分:函數觸發器、函數服務和函數程式碼。它們分別取代了傳統伺服器端操作中的負載平衡與反向代理、伺服器與應用程式執行環境,以及應用程式程式碼部署。
  2. 無伺服器與傳統應用程式託管 PaaS 平台之間最大的差異在於:無伺服器應用程式可以縮減到零,並在事件觸發時迅速啟動。例如,Node.js 函數可以在 100 毫秒內完成啟動和執行。
  3. 無伺服器在設計上犧牲了用戶的控制權和應用程式範圍,以換取程式碼模型的簡化。其分層結構進一步提高了資源利用率,這也是其冷啟動時間極短的主要原因。

Novita AI 即將為用戶推出無伺服器服務,立即加入等待清單,利用無伺服器運算展開您的業務。

Novita AI 是一個全方位雲端平台,助力您的 AI 抱負。整合 API、無伺服器、GPU 實例——為您提供經濟實惠的工具。免除基礎設施負擔,從免費開始,讓您的 AI 願景成真。

推薦閱讀

解鎖 PyTorch 的威力

如何使用 Novita AI 部署 Llama3.1 405B