無伺服器運算和容器都是降低雲端託管 Web 應用程式負荷的架構,但它們在幾個重要方面有所不同。容器比虛擬機器更輕巧,但是無伺服器部署比容器架構更輕巧,並且更容易擴充。
閱讀本文後,您將能夠:
複製文章連結
無伺服器運算與容器都能讓開發人員建置應用程式,其負載遠低於傳統伺服器或虛擬機器上裝載的應用程式,而且具有更大的彈性。開發人員應該使用哪種架構樣式取決於應用程式的需求,但無伺服器應用程式更具可擴充性,而且通常更具成本效益。
容器「包含」應用程式和應用程式正常執行所需的所有元素,包括系統庫、系統設定和其他相依項。就像「只需加水」的煎餅混合物一樣,容器只需要一件事——託管和執行——就可以執行它們的功能。
任何類型的應用程式都可以在容器中執行。無論裝載在何處,容器化應用程式都會以相同的方式執行。容器可以輕鬆地在需要的地方移動和部署,就像實體運輸集裝箱一樣,它們是標準尺寸,因此可以透過各種運輸方式(船舶、卡車、火車等)運送到任何地方,無論其內容物為何。
就技術而言,容器是將機器或伺服器分割到不同使用者空間環境中的一種方式,這樣每個環境都只執行一個應用程式,而且不會與電腦上的任何其他分割區段互動。每個容器都會與其他容器共用機器的核心(核心是作業系統的基礎,它會與電腦的硬體互動),但它的執行方式就好像是機器上唯一的系統一樣。
虛擬機器是模仿完整電腦系統的軟體。它與託管它的機器的其餘部分隔開來,就像它是主機上唯一作業系統一樣行事,包括擁有自己的內核。虛擬機器是在一台伺服器上託管多個環境的另一種常見方式,但它們使用的處理能力比容器多得多。
無伺服器應用程式被分解成功能,並由第三方廠商代管,第三方廠商僅根據每個功能執行的時間向應用程式開發人員收費。如需無伺服器運算的詳細資訊,請參閱什麼是無伺服器運算?
「無伺服器」運算實際上是在伺服器上執行,但是由無伺服器廠商決定根據應用程式需要佈建伺服器空間;不會針對特定功能或應用程式指派特定機器。與之相反,每個容器一次都存在於一台機器上,並使用該機器的作業系統,儘管如果需要,它們可以很容易地移動到不同的機器上。
在以容器為基礎的架構中,部署的容器數量是由開發人員預先決定的。與之相反,在無伺服器架構中,後端會自動擴充以滿足需求。
如果繼續套用運輸集裝箱這一比喻的話,運輸公司可以嘗試預測某種產品的需求增加,然後將更多的集裝箱運送到目的地以滿足該需求,但是如果仍不能滿足要求,它就無法瞬間提供更多的集裝箱來滿足超出預期的需求。
而無伺服器架構則恰好可以做到這一點。在雲端能力方面,無伺服器雲端就像現代家庭中的供水:開啟水龍頭,消費者可以隨時獲取和使用所需的水量,而他們只為所用的水量付費。這比嘗試買水桶或運輸容器更具可擴展性。
容器會保持一直執行,因此即使沒有人使用該應用程式,雲端提供者也會繼續對伺服器空間收費。
而無伺服器架構不會有任何持續性的費用,因為除非叫用應用程式代碼,否則它不會執行。相反,開發人員僅為其應用程式實際使用的伺服器容量而付費。
容器託管在雲端中,但是雲端提供者不會更新或維護它們。開發人員必須管理和更新他們部署的每個容器。
從開發人員的角度來看,無伺服器架構無需管理後端。廠商負責管理執行代碼的伺服器以及保持其軟體更新。
容器初始設定所花費的時間比無伺服器功能更長,因為必須設定系統設定、程式庫等等。設定完成後,容器只需幾秒鐘即可部署。但由於無伺服器功能比容器微服務小,並且不會與系統相依性搭配在一起,因此只需幾毫秒即可部署。無伺服器應用程式可以在代碼上傳後立即上線。
測試無伺服器 Web 應用程式很困難,因為後端環境難以在本機環境中複製。相較之下,無論容器在何處部署,都會執行相同的作業,因此在將容器型應用程式部署到生產環境之前,測試容器型應用程式相對簡單。
對於支援無伺服器架構的 Cloudflare Worker,我們建立了虛擬測試環境以協助改善開發流程。
兩者都是基於雲端的,並且都大大減少了基礎結構開銷——無伺服器運算比容器更有效。在這兩種架構中,應用程式都被分解並部署為更小的元件。在基於容器的架構中,每個容器將執行一個微服務。
微服務是應用程式的區段。每個微服務都會執行一項服務,並結合多個整合式微服務來組成應用程式。儘管這個名稱似乎暗示著微服務很小,但事實並不一定如此。
將應用程式建置為微服務集合的其中一個優點是,開發人員可以一次更新一個微服務,而不是在需要進行變更時更新整個應用程式。對於無伺服器架構,將應用程式構建為功能集合可提供相同的好處,但層次更細。
選擇無伺服器架構的開發人員將能夠快速發佈和反覆運算新的應用程式,而不必擔心應用程式是否能夠擴展。此外,如果應用程式沒有持續的流量或使用率,則無伺服器運算將比容器更具成本效益,因為代碼不需要持續執行。
容器則讓開發人員可以更好地控制應用程式執行的環境(儘管這也帶來了更多的維護)以及所使用的語言和庫。因此,容器對於將舊版應用程式遷移到雲端非常有用,因為這樣可以更緊密地複製應用程式的原始執行環境。
最後,也可以使用混合架構,將一些無伺服器功能和一些部署在容器中的功能相結合。例如,如果某個應用程式功能所需的記憶體比無伺服器廠商配置的記憶體更多,或者某個功能太大,或者某些功能需要長時間執行而另一些不必如此,那麼混合架構可使開發人員獲得無伺服器所帶來的優勢,並同時利用容器來獲取無伺服器無法支援的功能。
Cloudflare 使開發人員能透過 Cloudflare Workers 來構建高效能的無伺服器應用程式。