如果你因為服務(wù)器出問題而在凌晨3點被喚醒,你就會明白像“無服務(wù)器”這樣的流行詞如此具有吸引力的原因。這些設(shè)備可能需要數(shù)小時、數(shù)天甚至數(shù)周才能配置完畢,然后需要不斷地更新以修復(fù)錯誤和安全漏洞。這些更新程序通常會給其自身帶來麻煩,因為新更新程序會導(dǎo)致與其他更新程序不兼容,或者這一工作看起來永無休止。
管理服務(wù)器帶來的無休止的麻煩是大型云服務(wù)公司采用“無服務(wù)器”架構(gòu)的原因之一。他們知道老板已經(jīng)聽夠了服務(wù)器出這樣或那樣問題的借口。如果我們能夠擺脫那些服務(wù)器,那么老板一定會考慮。
這是一個很棒的銷售語言,但唯一的問題是它并不完全正確。這些應(yīng)用程序處于無服務(wù)器架構(gòu),就像餐廳里沒有廚房一樣。如果你想要的菜在菜單上,并且你喜歡廚師的烹飪方法,那么坐在餐廳里是很棒的選擇。但如果你想要一種不同的菜肴,如果你想要不同的調(diào)料,那么你最好有自己的廚房。
亞馬遜、谷歌和微軟是三家大公司,正在為未來管理應(yīng)用程序而戰(zhàn),他們希望將這些應(yīng)用程序?qū)懭肫錈o服務(wù)器API中,并通過其自動化層進(jìn)行管理。如果這些平臺可提供你想要的東西,而且這些新模型非常通用化,那么這些平臺可能是創(chuàng)建自己的價值數(shù)十億美元的獨(dú)角獸網(wǎng)絡(luò)應(yīng)用的最簡單和最快捷的方式。你只需編寫關(guān)鍵的邏輯部分,而平臺會處理所有的細(xì)節(jié)。
無服務(wù)器功能正在成為連接所有云功能的粘合劑或腳本語言。曾經(jīng)相當(dāng)獨(dú)立的映射或人工智能工具現(xiàn)在通過事件驅(qū)動的無服務(wù)器功能進(jìn)行鏈接?,F(xiàn)在,更多的工作可以通過請求來解決,這些請求會通過每個云的各個部分產(chǎn)生波動和回彈,產(chǎn)生觸發(fā)并由一系列事件觸發(fā)。如果你想了解機(jī)器學(xué)習(xí)技術(shù)并使用它來分析你的數(shù)據(jù),那么最快速的方法之一就是創(chuàng)建一個無服務(wù)器應(yīng)用程序,并開始將事件發(fā)送到云計算的機(jī)器學(xué)習(xí)部分。
隱含的承諾是,將所有內(nèi)容切割得更薄,這樣可以更輕松地共享云端的資源。過去,每個人都會瘋狂地創(chuàng)建新的實例,例如在自己的虛擬機(jī)上運(yùn)行Ubuntu服務(wù)器。每個人都使用相同的操作系統(tǒng),并且這個系統(tǒng)在同一個真實機(jī)箱上復(fù)制無數(shù)次,假裝成十幾個或更多的虛擬Ubuntu機(jī)箱。無服務(wù)器操作可以避免所有重復(fù)操作,使云計算成本大幅降低,特別是對于偶爾運(yùn)行的作業(yè),而且從未使在空調(diào)服務(wù)器機(jī)房中的舊機(jī)箱發(fā)生堵塞。
當(dāng)然,所有這些便利都有隱性成本。如果你想離開或想將你的代碼移動到另一個站點,你可能會陷入重寫大部分堆棧的困境。這些API是不同的,盡管JavaScript等流行語言有一些標(biāo)準(zhǔn)化,但它們更接近于專有技術(shù)。使用者有很多被鎖定的機(jī)會。
為了理解無服務(wù)器的吸引力,我花了一些時間來構(gòu)建一些函數(shù),并圍繞堆棧進(jìn)行研究。我沒有寫太多的代碼,但這就是關(guān)鍵。我花了更多時間點擊按鈕并輸入網(wǎng)頁表單來配置一切。你還記得我們用XML和JSON配置過所有的東西嗎?現(xiàn)在我們填寫一個網(wǎng)絡(luò)表單,云端就會為我們做這一切。盡管如此,你仍然必須像程序員一樣思考,了解幕后發(fā)生的事情,以及你無法控制的事情。
AWS Lambda正在成長為亞馬遜整個云端的shell腳本層。這是一個基本系統(tǒng),可讓你嵌入響應(yīng)事件的函數(shù),這些事件可能是由亞馬遜云基礎(chǔ)架構(gòu)任何部分所產(chǎn)生的。如果一個新文件上傳到S3,你可以讓它觸發(fā)一個函數(shù),做一些有趣的事情。如果某些視頻正在被Amazon Elastic Transcoder媒體轉(zhuǎn)碼工具進(jìn)行轉(zhuǎn)碼,你可以在轉(zhuǎn)碼完成后等待其去觸發(fā)Lambda函數(shù)。這些函數(shù)反過來可以觸發(fā)其他Lambda操作,也可能只是向某人發(fā)送更新。
你可以使用JavaScript(Node.js)、Python、Java、C#和Go語言編寫Lambda函數(shù)。鑒于這些語言可以嵌入許多其他語言中,所以很可能運(yùn)行其他代碼,如Haskell、Lisp甚至C ++。(關(guān)于將舊版C ++編譯為庫以與AWS Lambda一起使用的內(nèi)容,請參閱本文案例。)
編寫Lambda函數(shù)往往比你預(yù)想的要復(fù)雜得多,因為亞馬遜提供了很多配置和優(yōu)化選項。雖然技術(shù)上你可以只寫幾行代碼,就能完成很不錯的功能,但是我覺得,我必須花更多時間來配置代碼的運(yùn)行方式。這一工作的大部分內(nèi)容是通過在瀏覽器中填寫表單而不是在文本文件中輸入來完成的。有時候感覺就像我們只是將文本編輯器換成了瀏覽器表單,但這就是使用亞馬遜為Lambda用戶提升靈活性的代價。
其中一些額外的步驟是由于亞馬遜向用戶提供更多的選項所帶來的,并期待有更多首次函數(shù)編寫者。一旦我在谷歌或微軟上編寫完一個函數(shù)后,我就可以將瀏覽器指向正確的URL并立即進(jìn)行測試。亞馬遜讓我點擊來配置API網(wǎng)關(guān),并在防火墻中打開恰當(dāng)?shù)穆┒础?/div>
最后,所有這些點擊會增加一層輔助工具,使得工作比一開始使用文本文件更輕松一些。當(dāng)我創(chuàng)建一個函數(shù)時,瀏覽器會彈出一個警告,“這個函數(shù)包含外部庫”。在純節(jié)點的時代,這是我希望知道的事情,或者我可以通過谷歌來搜索錯誤信息,然后希望找到答案進(jìn)行學(xué)習(xí)。而現(xiàn)在云端正急著來提供幫助。
如果無服務(wù)器意味著將你從管理服務(wù)器的雜事中解放出來,那么亞馬遜還有許多其他如同AWS Lambda一樣的“無服務(wù)器”選項。它具有像Amazon EC2 Auto Scaling和AWS Fargate這樣的彈性工具,可以啟動和關(guān)閉服務(wù)器,以及具有AWS Elastic Beanstalk工具可將你上傳的代碼部署到Web服務(wù)器并處理負(fù)載平衡和縮放。當(dāng)然,擁有許多這些自動化工具,你仍然需要負(fù)責(zé)創(chuàng)建服務(wù)器映像。
AWS Step Functions是一種更有用的產(chǎn)品,它是一種無代碼流程圖工具,用于創(chuàng)建狀態(tài)機(jī)以創(chuàng)建軟件架構(gòu)師調(diào)用工作流的模型。一部分問題是所有的無服務(wù)器函數(shù)都是完全沒有狀態(tài)的,當(dāng)你執(zhí)行非?;镜臉I(yè)務(wù)邏輯時,這些函數(shù)是正常的,但當(dāng)你通過一個清單或流程圖來處理客戶端問題時,這些函數(shù)可能會是一場噩夢。你要不斷地到數(shù)據(jù)庫重新加載有關(guān)客戶端的信息。Step Function可將Lambda函數(shù)與狀態(tài)結(jié)合在一起。
谷歌云函數(shù)和Firebase平臺
如果你的目標(biāo)是擺脫配置服務(wù)器的麻煩,那么谷歌云提供了許多服務(wù)可以讓你更輕松,例如輸入根密碼,甚至使用命令行等工作。
從2008年的Google App Engine平臺開始,谷歌一直在慢慢地添加不同的“無服務(wù)器”選項,并將各種消息發(fā)送和數(shù)據(jù)透明度結(jié)合在一起。一個名為Google Cloud Pub / Sub的工具可對用戶隱藏消息隊列,因此你只需為數(shù)據(jù)生產(chǎn)者和消費(fèi)者編寫代碼即可。谷歌云函數(shù)為許多主要產(chǎn)品(包括某些選取框工具和API)提供事件驅(qū)動的計算。然后是谷歌Firebase平臺,這是一個很強(qiáng)大的數(shù)據(jù)庫,可讓你將JavaScript代碼混合到數(shù)據(jù)存儲層,該數(shù)據(jù)存儲層將數(shù)據(jù)傳送到客戶端。
其中,F(xiàn)irebase平臺是我最感興趣的。一些人認(rèn)為數(shù)據(jù)庫是原始的無服務(wù)器應(yīng)用程序,它將數(shù)據(jù)結(jié)構(gòu)和磁盤存儲工作抽象出來,通過TCP/IP端口傳遞所有信息。Firebase平臺通過添加JavaScript代碼和消息發(fā)送功能來完成你想在服務(wù)器端基礎(chǔ)架構(gòu)執(zhí)行的幾乎所有工作(包括身份驗證),使這種抽象性工作做到極致。從技術(shù)上講,它只是一個數(shù)據(jù)庫,但它可以處理堆棧的大部分業(yè)務(wù)邏輯和消息傳遞。你真的可以擺脫一些客戶端的HTML、CSS、JavaScript和Firebase平臺。
你可能會像對待Oracle一樣,試圖將Firebase平臺的JavaScript層稱為“存儲過程”,但這樣做會忽略更多內(nèi)容。Firebase代碼是用JavaScript編寫的,因此它將以本地版本的Node.js運(yùn)行。你可以在該層中嵌入大部分業(yè)務(wù)邏輯,因為節(jié)點環(huán)境中已經(jīng)充滿了處理此工作流的庫。另外,你還會享受在客戶端、服務(wù)器上運(yùn)行的同構(gòu)代碼的樂趣,現(xiàn)在可以運(yùn)行在數(shù)據(jù)庫中。
引起我注意的部分是Firebase中內(nèi)置的同步層。它可將整個網(wǎng)絡(luò)中來自數(shù)據(jù)庫的對象副本進(jìn)行同步。其訣竅是,你可將你的客戶端應(yīng)用程序設(shè)置為另一個數(shù)據(jù)庫節(jié)點,該節(jié)點可訂閱所有相關(guān)數(shù)據(jù)(僅包含相關(guān)數(shù)據(jù))的更改。如果數(shù)據(jù)在一個地方發(fā)生改變,它會在所有位置進(jìn)行改變。你可以避免所有消息傳遞的麻煩,并專注于將信息寫入Firebase中,因為Firebase會將其復(fù)制到需要的位置。
你無需只關(guān)注于Firebase。更基本的谷歌云函數(shù)是一種更簡單的方法,可將定制代碼嵌入整個谷歌云中。目前,云函數(shù)很大程度上只是編寫Node.js代碼的一個選項,該代碼將在預(yù)配置的節(jié)點環(huán)境中運(yùn)行。雖然谷歌云平臺的其他部分可支持各種語言,包括Java、C#、Go、Python和PHP,但云函數(shù)卻僅限于使用JavaScript和Node語言。有跡象表明,其他語言選擇即將實現(xiàn),如果這些選擇很快出現(xiàn),我不會感到驚訝。
至少在這一點上,谷歌云函數(shù)不會像AWS Lambda進(jìn)入AWS一樣深入到谷歌云中。當(dāng)我嘗試構(gòu)建一個與Google Docs交互的函數(shù)時,我發(fā)現(xiàn)我可能不得不使用REST API并將代碼寫入名為Apps Script的應(yīng)用程序中。換句話說,Google Docs環(huán)境擁有自己的REST API,其在無服務(wù)器這個流行詞出現(xiàn)很久之前就處于無服務(wù)器狀態(tài)。
值得注意的是,Google App Engine的功能持續(xù)變得強(qiáng)大。一開始,它提供了啟動Python應(yīng)用程序以滿足訪問者進(jìn)入網(wǎng)站的需求,但多年來一直在擴(kuò)展功能,目前可處理許多不同的語言運(yùn)行環(huán)境。將代碼打包成可執(zhí)行文件后,App Engine將啟動流程,開啟足夠的節(jié)點來處理流量,并在用戶發(fā)送請求時按比例放大或縮減數(shù)量。
要牢記的是,仍存在一些障礙。與云函數(shù)一樣,你的代碼必須以相對無狀態(tài)的方式編寫,并且必須在有限的時間內(nèi)完成每個請求。但是App Engine不會拋棄所有的scaffolding,也不會忘記各請求之間的所有東西。App Engine是無服務(wù)器革命中的重要組成部分,對于那些仍采用舊方法并使用Python,PHP,Java,C#或Go語言構(gòu)建自己的堆棧的人來說,它仍然是最容易獲得的平臺。
微軟Azure Function
當(dāng)然,微軟與其他公司一樣在努力工作,以確保人們可以使用微軟Azure完成所有的無服務(wù)器架構(gòu)工作。微軟公司已經(jīng)為處理事件創(chuàng)建了自己的基本函數(shù),即Azure Function,并且還構(gòu)建了一些更復(fù)雜的工具,這些工具對于不太成熟的程序員來說更加易于使用。
微軟擁有的最大優(yōu)勢可能是它的Office應(yīng)用程序集合,這些前期的桌面可執(zhí)行文件正在緩慢而穩(wěn)定地遷移到云端。事實上,在云計算收入的一種財務(wù)核算方法上,微軟已領(lǐng)先于亞馬遜公司,這部分原因在于微軟將其部分Office收入納入到短期的“云”計算收入中。
Azure Functions文檔中最好的一個示例說明了,當(dāng)某人在將電子表格保存到OneDrive時,云函數(shù)是如何被觸發(fā)的。突然間,云端的小精靈活躍起來,可以處理電子表格中一些事情。對于喜歡Excel電子表格(或其他Office文檔)的IT支持團(tuán)隊來說,這絕對是天賜之物。他們可以編寫Azure Function來做幾乎任何事情。我們通常認(rèn)為HTML和網(wǎng)絡(luò)是云端的唯一接口,但沒有理由不能通過Microsoft Word或Excel等文檔格式連接至云端。
Azure的Logic Apps引起了我的注意,它的一個工具可以幫你填寫表單,而不用擔(dān)心語義和語法。你仍然需要像程序員一樣思考,并對抽象概念和數(shù)據(jù)做出明智的決定,但是你可能會說服自己,你并沒有像填寫表格那樣來編寫“代碼”。
像亞馬遜的Step Functions一樣,Logic Apps的目的是對“工作流”進(jìn)行編碼,這是一種流行詞,比起普通的“函數(shù)”要復(fù)雜得多,這要?dú)w功于可使用某種狀態(tài)。你仍然可以用類似流程圖的方式編寫鏈接各種函數(shù)和連接器的邏輯,但是你不會用像正式計算機(jī)語言那樣進(jìn)行詳細(xì)說明。
Logic Apps的一大優(yōu)勢是預(yù)先構(gòu)建的“連接器”,可深入到微軟和第三方的一些更大應(yīng)用程序中。你可以有效地從Logic Apps 以及Salesforce、Twitter和Office 365等程序中推送或提取數(shù)據(jù)。這些連接對于公司IT人員來說非常有價值,他們現(xiàn)在可以通過編寫Logic Apps來連接外部工具,就像他們過去創(chuàng)建shell腳本一樣。
Azure另一個有趣的地方是Azure Cosmos DB,它同時是NoSQL數(shù)據(jù)庫和SQL數(shù)據(jù)庫。微軟已經(jīng)復(fù)制了Cassandra和MongoDB的API,這樣你就可以在不改寫Cassandra或MongoDB代碼的情況下輸入和輸出信息。或者,如果你想寫SQL語句的話,你也可以這樣做。Cosmos DB可以讓內(nèi)容很直觀,并為所有內(nèi)容建立索引,以使其快速運(yùn)行。如果你有很多SQL和NoSQL代碼需要同時使用,這將使它成為一個非常不錯的中心連接?;蛘撸苍S你只是想在未來為采用不同的方法敞開大門。
無服務(wù)器云的比較
哪個無服務(wù)器平臺適合你?在所有三個獨(dú)立平臺中編寫基本函數(shù)幾乎都是一樣的,但是存在一些差異。最明顯的區(qū)別可能是可使用的語言,因為這些平臺在完成支持Node.js和JavaScript語言后都會使用自己偏好的語言。你可以為微軟的Azure使用C#語言編寫,這并不令人驚訝,但它對F#和TypeScript語言的支持是獨(dú)一無二的。亞馬遜可支持Java、C#和Python語言。谷歌目前的基本函數(shù)嚴(yán)格限于使用JavaScript語言,但它在App Engine中支持更多的語言。
對無服務(wù)器云進(jìn)行對比最難的是掌握其價格和速度,因為更多的東西隱藏在底層。當(dāng)我啟動虛擬機(jī),并按每小時價格收費(fèi)時,我常常覺得自己像個瘋狂的消費(fèi)者。現(xiàn)在,提供商正在將其服務(wù)切分的如此精細(xì),以至于你可以以不到一美元的價格獲得數(shù)十萬次函數(shù)調(diào)用。你會像在“王牌大賤諜”電影中的“邪惡博士”一樣,反復(fù)去說“百萬”這個詞。
當(dāng)然,這種明顯的低價很快就會削弱我們大腦中理性的和預(yù)算意識的部分,就像我們在一個陌生的國家度假一樣,這個國家使用完全不同的貨幣面額。不久之后,你將訂購另外數(shù)百萬次的數(shù)據(jù)庫調(diào)用,就像你在墨西哥坎昆的酒吧喝酒一樣,因為你無法快速換算價格以確定其實際成本。
當(dāng)云計算為你提供一臺原始的虛擬機(jī)時,你可以猜測其內(nèi)存容量和CPU性能,但是在無服務(wù)器的環(huán)境中,你并不真正知道其中的內(nèi)在配置。
值得注意的是,無服務(wù)器模式幾乎會迫使你將數(shù)據(jù)存儲在本地云數(shù)據(jù)庫中,因為它不允許你在代碼中保留任何狀態(tài)。你必須相信這些后端架構(gòu)。你的函數(shù)必須運(yùn)行在沒有任何本地緩存或配置的環(huán)境中,因為其他版本總是被創(chuàng)建和銷毀。因此,數(shù)據(jù)庫膠水代碼會填滿你的代碼,就像在《怪奇物語》(Stranger Things)電影中表里世界(Upside Down)的那些藤蔓一樣。
比較成本的唯一現(xiàn)實方法是在所有平臺上構(gòu)建應(yīng)用程序,這是一項艱巨的挑戰(zhàn)??梢栽谌咧g移動一些代碼,因為它們都運(yùn)行Node.js,但即便如此,你仍然會遇到并忍受一些差異。 (例如,你直接在Microsoft和Google中處理HTTP請求,但要通過AWS中的API Gateway進(jìn)行處理。)
好消息是你不必如此偏執(zhí)。在我的實驗中,許多基本應(yīng)用程序幾乎不使用任何資源,你可以使用這三個平臺所提供的免費(fèi)資源很長時間,這些資源是為吸引那些不愿付費(fèi)的開發(fā)人員。無服務(wù)器模式確實為我們節(jié)省了開銷。除非你的服務(wù)器是始終接近滿負(fù)荷運(yùn)行,并且放置在擁有免費(fèi)空調(diào)的機(jī)房,否則你將業(yè)務(wù)轉(zhuǎn)向無服務(wù)器方式,這很可能最終會為你節(jié)省一些大筆資金。你會節(jié)省如此多的資金,你也就不會計較它每百萬次函數(shù)調(diào)用的價格是1美元或1.50美元。
還有一個更深層的問題。如果你受夠了這些云,你就會陷入困境。這并不是很輕松地就能將代碼取出并在其他地方的商品服務(wù)器上運(yùn)行,而是你可能要使用裝滿自己代碼的Docker容器進(jìn)行操作。如果幸運(yùn)的話,你可以復(fù)制相同的原始架構(gòu)和基本的JavaScript函數(shù),但在此之后,你要在所有部位都重寫數(shù)據(jù)庫膠水代碼。所有這三家公司都有自己的專有數(shù)據(jù)存儲層。
目前還不清楚出現(xiàn)故障時會發(fā)生什么。運(yùn)行你自己的服務(wù)器意味著,當(dāng)你的老板不能正常工作時,你需要立即解決問題。目前還不清楚在這個領(lǐng)域會發(fā)生什么。在谷歌公司的一個頁面中包含一個溫和的警告,“這是谷歌云函數(shù)的測試版。此API可能會以不兼容的方式進(jìn)行更改,并且不受任何服務(wù)水平協(xié)議(SLA)或棄用政策所約束。”
亞馬遜的服務(wù)條款比它首次進(jìn)入這一領(lǐng)域時要好一些,但它仍然包含一些你需要記住的警告內(nèi)容,例如:“如果你上傳到AWS Lambda的任何內(nèi)容超過三個月未使用,那么我們會在30天內(nèi)通知你,并可能將其刪除,且不承擔(dān)任何形式的責(zé)任。”如果你想在亞馬遜云端保留你的代碼,那么請確保你經(jīng)常運(yùn)行該代碼。像這樣的警告內(nèi)容當(dāng)然是公平的(這樣的話,我會知道我的舊Lambda函數(shù)不會再被使用),但這也表明了你將如何放棄一些控制權(quán)。
微軟為Azure服務(wù)提供服務(wù)水平協(xié)議,其承諾通過服務(wù)積分對故障時間進(jìn)行經(jīng)濟(jì)補(bǔ)償。這些承諾也適用于你的函數(shù)故障嗎?也許,只要你不使用一些測試版服務(wù)。如果你打算構(gòu)建比兒童聊天室更重要的工作,那么就值得花一點時間關(guān)注這些細(xì)節(jié)內(nèi)容。
在大多數(shù)情況下,你真正想進(jìn)行的是在亞馬遜、谷歌和微軟云的其他功能和服務(wù)之間的比較,而不是函數(shù)層面。如果你對喜歡使用Office應(yīng)用程序的用戶提供支持,則利用在OneDrive上的Office文件來觸發(fā)Azure Functions的功能,這對你是極具吸引力的。借助谷歌Firebase平臺,可以輕松使用各種功能為Web應(yīng)用提供消息傳遞和身份驗證等支持服務(wù)。AWS Lambda提供了許多亞馬遜服務(wù),看起來天空真的是有極限的。
從技術(shù)上講,混合和匹配所有這些云和函數(shù)是可能的,因為它們都使用相同的PUT和GET語言來調(diào)用HTTP API。你沒有理由不使用這些融合很多微服務(wù)的應(yīng)用程序,因為這些應(yīng)用程序集合了三個云平臺中最好的功能。但是,當(dāng)數(shù)據(jù)包離開本地云,并在開放互聯(lián)網(wǎng)的荒野中傳遞時,你將最終遇到更大的延遲。然后,在解析和結(jié)構(gòu)上會有細(xì)微的差異,這使得坐在一家公司的溫暖環(huán)境中工作變得更輕松。
因此,使用單個云的安全部分可能是更合理的,至少在涉及相互關(guān)聯(lián)的應(yīng)用程序時是這樣。你真的很喜歡谷歌地圖嗎?你是否想把它們用于你的項目?那么,即使在你的心中,你也可以使用谷歌云函數(shù),而不是將F#語言與微軟的Azure Functions結(jié)合使用。亞馬遜的語音識別,或谷歌的圖像分析API,或任何數(shù)十種不同的服務(wù)和機(jī)器學(xué)習(xí)API也是如此。功能并不那么重要,它們的相互連接才是真正重要的。
版權(quán)聲明:本文為企業(yè)網(wǎng)D1Net編譯,轉(zhuǎn)載需注明出處為:企業(yè)網(wǎng)D1Net,如果不注明出處,企業(yè)網(wǎng)D1Net將保留追究其法律責(zé)任的權(quán)利。