無服務(wù)器計算:終于給了開發(fā)者自由
無服務(wù)器計算為尋求減輕基礎(chǔ)設(shè)施負擔(dān)的開發(fā)人員提供了一個很好的機會。通過抽象除代碼塊之外的一切,無服務(wù)器模型使開發(fā)人員能夠更快地迭代和部署新代碼,并使預(yù)算較少的小團隊能夠做只有大公司才能做的事情?;蛘?,正如Cloudability創(chuàng)始人兼首席執(zhí)行官Mat Ellis在最近一期CloudCast中所說,“無服務(wù)器試圖將開發(fā)者的影響力產(chǎn)業(yè)化”。
當(dāng)然,在后臺,服務(wù)器依然存在,一直嗡嗡作響。但是無服務(wù)器架構(gòu)是無狀態(tài)的。他們通過執(zhí)行一些邏輯(一個函數(shù))和調(diào)用其他服務(wù)來完成他們的工作。如果您是一名開發(fā)人員,主要使用服務(wù)通過api構(gòu)建應(yīng)用程序,或者需要響應(yīng)事件,那么無服務(wù)器架構(gòu)可能是完成工作最簡單、最快和風(fēng)險最小的方法。
在本文中,我們將分解無服務(wù)器架構(gòu)的真正含義,提供主要公共云選項的詳細比較,并介紹可口可樂正在實施的一個真實的無服務(wù)器項目。
《品牌郵報》由HPE贊助。
管理多云復(fù)雜性的三種方法。
人工智能、編譯和自動化的新時代幫助企業(yè)管理日益增加的信息技術(shù)復(fù)雜性。
無服務(wù)器是一種云計算服務(wù)模式,它與IaaS、PaaS、SaaS、BaaS和CaaS一樣,依賴于對可配置網(wǎng)絡(luò)、存儲和計算資源的動態(tài)共享池的無處不在、方便和按需的訪問。然而,無服務(wù)器以不同的方式使用這些資源。目前,無服務(wù)器計算還沒有一致的定義,但已經(jīng)有關(guān)于這個概念的說法。在沒有服務(wù)器的情況下,一個功能就是一個部署單元。程序員看不到任何機器、虛擬機或容器。
云中無服務(wù)器可用的主要服務(wù)包括AWS Lambda、Azure功能和Google Cloud功能。在云計算中,“FaaS”(功能即服務(wù))可能是一個更好的術(shù)語。當(dāng)我們說“功能”時,我們實際上是指功能。這是AWS Lambda的一個例子。用Node.js寫:
就這樣。上傳一個函數(shù),并將其連接到請求或事件。當(dāng)您的無服務(wù)器宿主提供程序(在這種情況下是AWS)檢測到請求(例如,REST調(diào)用)或事件發(fā)生時(例如,文件被添加到S3桶),通過調(diào)用您的函數(shù)傳入的參數(shù)和您返回的參數(shù)將傳遞結(jié)果。當(dāng)然,在實踐中更為復(fù)雜。例如,您可以添加安全限制,但這是其本質(zhì)。
您的函數(shù)可以用提供商支持的任何語言編寫。您所需要做的就是將傳入的請求或事件映射到函數(shù)調(diào)用。每個提供商都有自己支持的語言、約定、流程、成本、功能和限制(見下表)。但這就是無服務(wù)器宣言的意思,也就是“使用你自己的代碼”。
您的函數(shù)可以任意復(fù)雜,它可以通過API調(diào)用包含的庫或外部服務(wù)。為了實現(xiàn)可伸縮性,沒有服務(wù)器的功能必須只使用可伸縮的服務(wù)。
根據(jù)提供程序的不同,代碼可以直接在在線編輯器中編寫,也可以作為代碼文件上傳。zip或。jar文件或容器。這也是無服務(wù)器的一個缺點,因為在整個發(fā)布周期中上傳和管理代碼的工具仍然不是很好,盡管許多框架正在填補這個空白。
當(dāng)然,代碼不能任意復(fù)雜。根據(jù)供應(yīng)商的不同,會有一些限制。每個主機都有一個最大代碼上傳大小(例如,AWS Lambda為50MB)。每個主機都有一個最大的函數(shù)執(zhí)行時間(AWS Lambda是1到300秒)。每個功能的可用內(nèi)存和CPU容量也是有限的。想要更多內(nèi)存、更好的CPU還是更長的執(zhí)行時間?你花了更多的錢。計費是提供商之間的另一個區(qū)別,我們將在下面看到。
當(dāng)然,幕后也有服務(wù)器,但作為開發(fā)人員,你不需要去想它們。你只需要知道你的功能。您不再需要處理容量規(guī)劃、部署、擴展、安裝、修補等。這通常被認為是一個錯誤,但實際上是一個不同的錯誤。仍然需要組織、開發(fā)、構(gòu)建、測試、版本控制、發(fā)布、記錄和監(jiān)控代碼。
因為您看到的都是函數(shù),所以您的提供者負責(zé)激活您的函數(shù)以響應(yīng)任何請求或事件。當(dāng)請求出現(xiàn)并且函數(shù)的空閑實例不可用時,必須將代碼分配給服務(wù)器并啟動。作為開發(fā)者,你什么都不做。這取決于您的提供商,以確保有足夠的容量來處理負載。當(dāng)然,在冷啟動場景中,延遲問題是無服務(wù)器的缺點之一。
在無服務(wù)器的情況下,您需要支付消費,并且僅在服務(wù)運行時。你永遠不會為閑置的計算時間買單。影響是巨大的。你不用花一分錢就能建造一個完整的基礎(chǔ)設(shè)施。運營、開發(fā)和擴展成本都降低了。
將此與PaaS/IaaS進行比較,在PaaS/IaaS中,您需要為容量付費。PaaS提供商將為您管理服務(wù)器,但是您的應(yīng)用程序有一些長時間運行的進程,即使它們是空閑的,您也必須為它們付費。容量可以通過構(gòu)建一個對負載敏感的自動擴展系統(tǒng)來管理,但是您總是需要為一些多余的容量付費。
因為你看到的是一個函數(shù),沒有地方存儲狀態(tài)。當(dāng)一個函數(shù)被執(zhí)行時,它的計算資源可以被垃圾收集和重用。狀態(tài)必須存儲在另一個服務(wù)中,如數(shù)據(jù)庫或緩存。
為了控制收費成本,提供商為一個功能設(shè)置最大執(zhí)行時間。目前AWS Lambda和Azure功能只需要5分鐘。執(zhí)法限制也有不利的一面。例如,如果我想升級數(shù)據(jù)庫,我應(yīng)該怎么做?還是你的函數(shù)多次調(diào)用其他服務(wù)來返回結(jié)果?還是你的函數(shù)有很多輸入要處理?在某些情況下,這些操作可能需要5分鐘以上。
除非您的函數(shù)很簡單,否則您需要將其編碼為由調(diào)用的無狀態(tài)、冪等、事件驅(qū)動的服務(wù)。
間將數(shù)據(jù)保存在持久存儲中的狀態(tài)機驅(qū)動。這可能會變得很復(fù)雜。通常的云計算方法仍然有效。例如,將輸入劃分為多個批,并將它們放在工作隊列中。為了在這方面提供幫助,AWS創(chuàng)建了一個名為Step Functions的新服務(wù),它實現(xiàn)了一個狀態(tài)機,并允許函數(shù)無限期地持續(xù)下去。實際上,AWS Lambda應(yīng)該更好,而不是要求使用完全不同且昂貴的服務(wù)。
盡管serverless將服務(wù)接口縮小到單個功能(有時稱為nanoservice),但復(fù)雜性始終是守恒的。對于PaaS,計算的原子單位是應(yīng)用程序。這有好處也有壞處。由于應(yīng)用程序很大,啟動和停止可能很慢;它很難根據(jù)需求擴大規(guī)模;它可能很難在一個顆粒級賬單。但是PaaS也易于管理、監(jiān)視和調(diào)試。
通過將代碼分散到可能大量的函數(shù)中,serverless確實很難調(diào)試。邏輯流的跟蹤分布在許多不同的日志文件中,調(diào)用之間沒有連接。需要日志和度量,但這還不夠。這個領(lǐng)域的工具需要改進。
如何開始?有許多選項可以使用serverless開始滾動。兩個主要方面:使用公共云和使用本地解決方案。
無服務(wù)器已經(jīng)成為任何公共云的表賭注,所以所有的主要供應(yīng)商都在開發(fā)自己的產(chǎn)品。亞馬遜有AWS Lambda,自2015年4月以來一直是GA。微軟擁有Azure功能,該功能自2016年11月以來一直在使用。谷歌具有谷歌云功能,處于封閉的alpha狀態(tài)。
在這三種選擇中,如果您已經(jīng)使用了公共云,那么最好使用當(dāng)前提供商的產(chǎn)品。使用serverless的一大好處是可以使用豐富的可用服務(wù)和事件。這些選擇在你的云里是最好的。但如果你剛開始接觸云計算,而且穩(wěn)定性很重要,那么AWS Lambda是迄今為止出現(xiàn)時間最長、最安全的選擇。
對于AWS Lambda,函數(shù)是獨立的,盡管在實踐中,它們常常使用類似于Serverless的框架在組中進行管理。根據(jù)函數(shù)請求的數(shù)量和代碼執(zhí)行的時間來收費。如果你想要更多的CPU,你必須分配更多的內(nèi)存。
通過Azure功能,一個功能應(yīng)用由一個或多個單獨的功能組成,這些功能由Azure應(yīng)用服務(wù)一起管理。功能應(yīng)用可以使用消費托管計劃,也可以使用應(yīng)用服務(wù)托管計劃。有了消費計劃,功能應(yīng)用程序可以自動伸縮,你可以根據(jù)內(nèi)存大小和所有功能的總執(zhí)行時間(以gb秒為單位)付費。使用應(yīng)用服務(wù)托管計劃更像是EC2。
由于谷歌云功能仍然處于封閉的alpha測試階段,關(guān)于功能如何操作和計費的很多信息仍然未知。我們知道有兩種類型的函數(shù):HTTP函數(shù)和后臺函數(shù)。HTTP函數(shù)是通過HTTP直接調(diào)用的。后臺函數(shù)是通過谷歌云發(fā)布/訂閱主題上的消息或谷歌云存儲桶中的更改來間接調(diào)用的。
標(biāo)簽: