無服務(wù)器 vs 容器:為組織選擇更有效的云解決方案
在盡可能短的時(shí)間內(nèi)、以盡可能少的開銷完成盡可能多的工作是現(xiàn)代化開發(fā)的基本特征。 最終的目標(biāo)要實(shí)現(xiàn)易于部署、維護(hù)和調(diào)試。不僅如此,這一切也必須能夠運(yùn)行在云端之上。 針對這些高要求,無服務(wù)器應(yīng)用程序和容器都給出了相應(yīng)的解決方案。這是兩種看上去類似的方案,它們都是為了替代那些需要組織付出更多努力的虛擬機(jī)而設(shè)計(jì)出來的。 然而在這兩者之中,容器作為一種更強(qiáng)大的解決方案,包含了運(yùn)行應(yīng)用程序所需的一切,通常作為一組微服務(wù)來使用。 而無服務(wù)器應(yīng)用程序則是不太復(fù)雜的解決方案,專注于依賴于供應(yīng)商 API 提供的服務(wù)的應(yīng)用程序代碼。 我們將會(huì)在本篇文章中探討如何在二者之間做出選擇,但是您需要了解的是這兩種技術(shù)的選擇并沒有嚴(yán)格的正確或錯(cuò)誤之分,只有根據(jù)組織的需求做出最有利的選擇才是最好的選項(xiàng)。
延伸閱讀,了解 Akamai cloud-computing
什么是無服務(wù)器?
無服務(wù)器應(yīng)用程序托管在供應(yīng)商系統(tǒng)上,通過函數(shù)提供的功能來響應(yīng)事件。對于應(yīng)用了無服務(wù)器的組織,開發(fā)人員能夠?qū)W⒂诖a和應(yīng)用程序,而無需在服務(wù)器或硬件上耗費(fèi)更多的精力。后端服務(wù)和庫等基礎(chǔ)設(shè)施通常由供應(yīng)商提供。 因此,開發(fā)人員只需查看應(yīng)用程序代碼,而無需關(guān)心其依賴項(xiàng)。
無服務(wù)器應(yīng)用程序能夠提供自動(dòng)擴(kuò)展、配置、內(nèi)置服務(wù)集成、自動(dòng)配置和高可用性等功能。開發(fā)人員無需為此付出任何額外努力。由于托管方式的原因,無服務(wù)器應(yīng)用程序可以為組織節(jié)省大量依賴成本。
無服務(wù)器應(yīng)用程序可以提供傳統(tǒng)桌面支持、后端服務(wù)和無服務(wù)器 Web 應(yīng)用程序。與微服務(wù)相比,無服務(wù)器應(yīng)用程序代表運(yùn)行應(yīng)用程序的方法,而微服務(wù)代表設(shè)計(jì)應(yīng)用程序的方法。 此外,與微服務(wù)不同,無服務(wù)器應(yīng)用程序不會(huì)連續(xù)運(yùn)行,它需要一個(gè)事件的觸發(fā)才能開始執(zhí)行,并且各個(gè)函數(shù)只執(zhí)行一項(xiàng)任務(wù)。一個(gè)微服務(wù)可以長期持續(xù)運(yùn)行,并且可以支持多個(gè)任務(wù)或功能。與微服務(wù)相比,使用無服務(wù)器應(yīng)用程序的優(yōu)點(diǎn)是無服務(wù)器應(yīng)用程序等待事件、運(yùn)行,然后停止。 因此,在應(yīng)用程序預(yù)計(jì)會(huì)頻繁出現(xiàn)使用高峰的情況下,運(yùn)行無服務(wù)器應(yīng)用程序的成本比微服務(wù)更低。
無服務(wù)器可以用于哪些場景?
無服務(wù)器應(yīng)用程序非常適合移動(dòng)和 Web 應(yīng)用程序初創(chuàng)公司,因?yàn)樗鼈兊膯?dòng)成本較低并且能夠處理輕量級應(yīng)用程序。 它們經(jīng)常用于以下用例:
- 流量況不可預(yù)測的情況
- 物聯(lián)網(wǎng) (IoT) 應(yīng)用
- 任何發(fā)生持續(xù)且重大變化的應(yīng)用程序
- 可以將任務(wù)分解為單個(gè)功能,然后將這些功能組合在一起以創(chuàng)建打包業(yè)務(wù)能力 (PBC) 的應(yīng)用程序
考慮無服務(wù)器應(yīng)用程序流程
與大多數(shù)應(yīng)用程序開發(fā)一樣,構(gòu)建無服務(wù)器應(yīng)用程序需要遵循一個(gè)流程。最終的軟件是否代表后端服務(wù)、前端服務(wù)或兩者都并不重要。此流程本質(zhì)上不同于使用整體應(yīng)用程序、微服務(wù)、打包業(yè)務(wù)功能 (PBC)、容器應(yīng)用程序或任何其他軟件開發(fā)模式。 這一想法是將軟件需求分解成更小的部分,直到可以非常簡單地描述特定的部分。方法如下:
- 定義執(zhí)行特定任務(wù)的各個(gè)服務(wù)。
- 定義單個(gè)功能(執(zhí)行一項(xiàng)且僅一項(xiàng)任務(wù)的元素)來組成服務(wù)。
- 定義觸發(fā)函數(shù)的事件,請記住無服務(wù)器應(yīng)用程序的工作原理是函數(shù)啟動(dòng)、執(zhí)行任務(wù),然后停止。
- 創(chuàng)建描述每個(gè)功能的配置文件。
- 創(chuàng)建一個(gè)配置提供程序文件,描述該函數(shù)如何與支持無服務(wù)器應(yīng)用程序的框架交互。
- 創(chuàng)建一個(gè)服務(wù)配置,描述提供程序文件、函數(shù)文件以及構(gòu)成服務(wù)的任何插件。
什么是容器?
容器與無服務(wù)器應(yīng)用程序存在著區(qū)別,因?yàn)槿萜鲹碛羞\(yùn)行應(yīng)用程序所需的一切,例如庫、系統(tǒng)設(shè)置和其他依賴項(xiàng)。無服務(wù)器應(yīng)用程序上的這些附加內(nèi)容意味著開發(fā)人員需要關(guān)注應(yīng)用程序代碼及其相關(guān)的所有內(nèi)容。因此,開發(fā)人員面臨的工作量會(huì)更大。然而,與無服務(wù)器應(yīng)用程序相比,容器也具有一些明顯的優(yōu)勢,其中之一是消除供應(yīng)商的鎖定。例如,Docker 容器應(yīng)用程序可以在任何支持 Docker 的系統(tǒng)上運(yùn)行。就像用于運(yùn)輸?shù)募b箱一樣,集裝箱應(yīng)用程序也是標(biāo)準(zhǔn)化的。 它們可以移動(dòng)到任何系統(tǒng)上的任何地方,而無需考慮底層硬件或操作系統(tǒng)細(xì)節(jié)。
與虛擬機(jī)不同,容器只專注于一個(gè)應(yīng)用程序,虛擬機(jī)模仿整個(gè)計(jì)算機(jī)、操作系統(tǒng)等。 容器更簡單并且資源消耗更少。如果應(yīng)用程序的復(fù)雜程度相同,則可以在物理硬件上運(yùn)行比虛擬機(jī)更多的容器。另一方面,虛擬機(jī)可以運(yùn)行多個(gè)應(yīng)用程序。容器和虛擬機(jī)之間的主要區(qū)別在于容器在物理機(jī)上共享單個(gè)內(nèi)核(操作系統(tǒng))。 同時(shí),每個(gè)虛擬機(jī)都有自己的內(nèi)核。 因此,在物理設(shè)備上運(yùn)行的所有容器應(yīng)用程序都必須與同一個(gè)內(nèi)核兼容。 使用虛擬機(jī)提供了使用最適合相關(guān)應(yīng)用程序的特定內(nèi)核的機(jī)會(huì)。
容器可以用于哪些場景?
容器通常用于以下目的:
- 部署API 端點(diǎn)
- 部署重復(fù)性工作和任務(wù)
- 為持續(xù)集成和持續(xù)部署(CI/CD)提供開發(fā)運(yùn)營支持
- 托管后臺(tái)處理應(yīng)用程序
- 處理事件驅(qū)動(dòng)的處理
- 運(yùn)行微服務(wù)
- 將大型遺留應(yīng)用程序移至云端
考慮容器應(yīng)用程序流程
與無服務(wù)器應(yīng)用程序一樣,有一個(gè)通用流程用于創(chuàng)建各種容器應(yīng)用程序。 一般來說,這個(gè)過程遵循以下步驟:
- 據(jù)需要將現(xiàn)有的單體應(yīng)用程序分解為微服務(wù)。
- 基于現(xiàn)有鏡像模板創(chuàng)建新的容器鏡像。
- 使用主機(jī)命令將代碼、資源和其他應(yīng)用程序文件添加到映像中。
- 使用主機(jī)命令配置鏡像的啟動(dòng)命令。
- 從容器內(nèi)部構(gòu)建并運(yùn)行映像(而不是像平常一樣在外部)。
- 使用主機(jī)服務(wù)器的實(shí)例服務(wù)部署映像。
無服務(wù)器和容器有何相似之處?
無服務(wù)器應(yīng)用程序和容器采用類似的策略,將解決方案分解為更小、更易于管理的部分。 他們也有相同的目標(biāo),即降低成本、開發(fā)時(shí)間和維護(hù)時(shí)間,同時(shí)創(chuàng)建更靈活的環(huán)境。
無服務(wù)器和容器之間的主要差異有哪些?
除了前面已經(jīng)提到的差異之外,還可以通過特定方式對它們進(jìn)行比較。最值得注意的是,這兩種技術(shù)在使用物理機(jī)、擴(kuò)展、保持低成本和管理部署細(xì)節(jié)方面存在差異。
物理機(jī)
無服務(wù)器應(yīng)用程序能夠駐留在多臺(tái)物理機(jī)上,而容器應(yīng)用程序始終僅駐留在一臺(tái)物理機(jī)上。可以在多臺(tái)機(jī)器上運(yùn)行的能力為無服務(wù)器應(yīng)用程序提供了資源可用性優(yōu)勢,因此無需開發(fā)人員付出大量額外工作。但是,負(fù)載均衡等技術(shù)可用于在多個(gè)物理系統(tǒng)上的容器應(yīng)用程序的多個(gè)實(shí)例之間分配負(fù)載。最終結(jié)果看似相同,但容器應(yīng)用程序需要更多的配置和實(shí)現(xiàn)。
可擴(kuò)展性
無服務(wù)器應(yīng)用程序在可擴(kuò)展性方面具有優(yōu)勢,因?yàn)樗鼈兙邆渥詣?dòng)擴(kuò)展能力。托管供應(yīng)商根據(jù)需要提供盡可能少或盡可能多的計(jì)算能力來處理給定時(shí)間的特定負(fù)載。使用容器應(yīng)用程序時(shí),開發(fā)人員需要分配足夠的容器來處理預(yù)期的負(fù)載。 如果負(fù)載超出預(yù)期,應(yīng)用程序就會(huì)開始運(yùn)行緩慢,從而對客戶產(chǎn)生負(fù)面影響。
當(dāng)負(fù)載低于預(yù)期時(shí),組織就會(huì)在未使用的資源上浪費(fèi)金錢。完全有可能找到在虛擬機(jī)級別自動(dòng)擴(kuò)展的云提供商。雖然這可以在一定程度上幫助減輕容器的缺點(diǎn),但這可由開發(fā)人員配置,但不能由他們管理。
成本
無服務(wù)器應(yīng)用程序僅在需要時(shí)運(yùn)行,這意味著直接查看時(shí)它們的運(yùn)行成本低于容器。 然而,當(dāng)考慮應(yīng)用程序延遲的成本時(shí),就會(huì)出現(xiàn)問題。由于容器始終處于運(yùn)行狀態(tài),因此它可以立即響應(yīng)任何請求。如果需要從緩存外部加載無服務(wù)器應(yīng)用程序,則在任務(wù)完成之前需要考慮額外的時(shí)間。時(shí)間就是金錢。 因此,即使對于請求一致的負(fù)載,容器應(yīng)用程序?qū)嶋H上也可能成本更低,因?yàn)樗鼈冺憫?yīng)速度更快。
部署時(shí)間
部署應(yīng)用程序的時(shí)間不斷縮短。 過去使用物理系統(tǒng)需要幾個(gè)月的時(shí)間,使用虛擬機(jī)需要幾分鐘的時(shí)間,而現(xiàn)在使用容器只需幾秒鐘,使用無服務(wù)器應(yīng)用程序只需幾毫秒。無服務(wù)器應(yīng)用程序開發(fā)人員通常具有部署時(shí)間優(yōu)勢,因?yàn)闊o需配置底層系統(tǒng)依賴項(xiàng),并且無服務(wù)器應(yīng)用程序較小。
維護(hù)
無服務(wù)器應(yīng)用程序比容器需要更少的直接維護(hù),因?yàn)橥泄芊?wù)可以滿足所有維護(hù)需求。 在理想情況下,這意味著無服務(wù)器應(yīng)用程序開發(fā)人員在時(shí)間上具有顯著優(yōu)勢,因?yàn)槿萜鏖_發(fā)人員必須解決低級維護(hù)問題。 然而,Serverless應(yīng)用場景也會(huì)遇到問題。 例如,有興趣保持所有內(nèi)容最新的供應(yīng)商推送的意外或不需要的更新。 由于容器開發(fā)人員可以直接控制底層細(xì)節(jié),因此可以在對容器應(yīng)用程序最有利的時(shí)間進(jìn)行維護(hù)。 從長遠(yuǎn)來看,這可能會(huì)節(jié)省時(shí)間。
測試
使用無服務(wù)器應(yīng)用程序時(shí),由于它特殊的運(yùn)行方式,應(yīng)用程序測試具有挑戰(zhàn)性。事件觸發(fā)該函數(shù),該函數(shù)執(zhí)行任務(wù)并立即關(guān)閉。開發(fā)人員經(jīng)常被迫使用應(yīng)用程序日志來定位問題的根源。對于容器應(yīng)用程序,無論其在何處運(yùn)行,都會(huì)以相同的方式持續(xù)運(yùn)行。 在這種情況下,開發(fā)人員通常會(huì)在調(diào)試過程中使用標(biāo)準(zhǔn)化工具。 許多 IDE(例如 IntelliJ IDEA)都被設(shè)置為調(diào)試容器應(yīng)用程序。
開發(fā)者應(yīng)該基于哪些因素來選擇使用哪一種方案?
無服務(wù)器應(yīng)用程序在處理突然激增的負(fù)載時(shí)可以縮短部署時(shí)間、減少維護(hù)要求并降低成本。 對于那些需要管理較小、不太復(fù)雜的應(yīng)用程序而無需特殊底層支持需求的初創(chuàng)公司來說,它們是最佳選擇。
容器應(yīng)用程序可以降低一致負(fù)載的成本,并提高應(yīng)用程序配置的靈活性。 當(dāng)需要將遺留應(yīng)用程序從本地服務(wù)器遷移到云時(shí),容器應(yīng)用就成為最佳的選擇。
結(jié)論
無論是無服務(wù)器應(yīng)用程序還是容器都有各自的優(yōu)點(diǎn)和缺點(diǎn)。有時(shí),最好的選擇不是做出選擇,而是使用適合特定需求的技術(shù)。解決方案的一部分可以采用無服務(wù)器應(yīng)用程序運(yùn)行,其他部分可以采用容器方式運(yùn)行。當(dāng)0然,這種組合選項(xiàng)也會(huì)存在缺點(diǎn)。其中最重要的是必須為單個(gè)解決方案管理兩種不同的技術(shù)。這會(huì)增加復(fù)雜性并可能降低可靠性和安全性。
這篇文章的內(nèi)容感覺還行吧?有沒有想要立即在 Linode 平臺(tái)上親自嘗試一下?別忘了,現(xiàn)在注冊可以免費(fèi)獲得價(jià)值 100 美元的使用額度,快點(diǎn)自己動(dòng)手體驗(yàn)本文介紹的功能和服務(wù)吧↓↓↓
歡迎關(guān)注Akamai ,第一時(shí)間了解高可用的MySQL/MariaDB參考架構(gòu),以及豐富的應(yīng)用程序示例。