文/陳東
隨著云計(jì)算技術(shù)的進(jìn)步氯夷,軟件系統(tǒng)的架構(gòu)方式也因此發(fā)生著一些變化到腥,其中Serverless架構(gòu)就是這里的一個典型的例子喘漏。
(圖片來自:http://t.cn/RadEFqr)
什么是Serverless架構(gòu)
目前關(guān)于Serverless架構(gòu)的準(zhǔn)確定義拴曲,業(yè)界并沒有一個統(tǒng)一的標(biāo)準(zhǔn)缺谴。那么我們從字面上來分析窗骑,所謂Serverless架構(gòu)女责,翻譯過來也就是無服務(wù)器架構(gòu)。那么似乎可以涵蓋以下兩個方面:
BaaS(Backend as a Service)即后臺即服務(wù)创译。后臺即服務(wù)出現(xiàn)有很長一段的時間了抵知,例如Parse,Firebase都是典型的代表。具體來說就是服務(wù)器端的邏輯和狀態(tài)是完全依賴于云平臺進(jìn)行管理的软族。
FaaS(Function as a Service)即函數(shù)即服務(wù)刷喜。函數(shù)即服務(wù),意味著這些函數(shù)中的后臺邏輯是由我們開發(fā)者自己實(shí)現(xiàn)的立砸。但是這些函數(shù)是執(zhí)行在一個無狀態(tài)的計(jì)算容器中的掖疮,函數(shù)的執(zhí)行是基于事件驅(qū)動的,關(guān)于這些函數(shù)的部署颗祝、執(zhí)行浊闪、觸發(fā)是由云平臺來管理的。其最典型的例子就是AWS Lambda螺戳。
我們這篇文章中的所討論的Serverless搁宾,是指的第二種,也就是FaaS倔幼。在我們Thoughtworks最新一期的技術(shù)雷達(dá)中盖腿,Serverless架構(gòu)位于試驗(yàn)象限,下文就介紹下我們在Serverless架構(gòu)下的一些實(shí)踐經(jīng)驗(yàn)损同。
數(shù)據(jù)處理業(yè)務(wù)的Serverless架構(gòu)演進(jìn)
所謂的數(shù)據(jù)處理業(yè)務(wù)翩腐,是指我們的系統(tǒng)需要每天定時獲取一些外部數(shù)據(jù)與我們自身的數(shù)據(jù)結(jié)合,生成一些數(shù)據(jù)報(bào)表膏燃。那么最初我們是怎么設(shè)計(jì)技術(shù)方案的呢茂卦?
傳統(tǒng)架構(gòu)方式
我們將業(yè)務(wù)拆分為3個獨(dú)立的服務(wù),2個Data Collector蹄梢,1個Data Loader疙筹,都分別部署在AWS服務(wù)器上富俄,將中間數(shù)據(jù)存儲在一個外部S3(AWS的數(shù)據(jù)存儲)上。最后將數(shù)據(jù)保存在數(shù)據(jù)庫中而咆,在數(shù)據(jù)庫之上使用專門的BI工具來制作報(bào)表霍比。我們第一個數(shù)據(jù)服務(wù)就是按照這樣的架構(gòu)進(jìn)行設(shè)計(jì)和實(shí)踐的。當(dāng)系統(tǒng)上線服務(wù)以后暴备,我們發(fā)現(xiàn)了里邊的一些問題悠瞬。
在這套系統(tǒng)中,Data Collector 2每天的執(zhí)行時間較長涯捻,需要1個小時左右的時間浅妆,而Data Collector 1每天的執(zhí)行時間較短,通常執(zhí)行時間不會超過1分鐘障癌,但是由于外部數(shù)據(jù)源的更新時間是不確定的凌外,所以雖然我們服務(wù)實(shí)際有效時間只有僅僅一到兩分鐘,但是也不得不讓服務(wù)器全天運(yùn)行涛浙。
可以看到康辑,這個系統(tǒng)每天的有效時間只有一個小時,其他23個小時實(shí)際上是在浪費(fèi)資源轿亮,如何改善這樣的情況呢疮薇?首先想到了讓服務(wù)定點(diǎn)運(yùn)行的方法。由于我們外服數(shù)據(jù)源的更新特點(diǎn)我注,雖然它的更新時間是不確定的按咒,但是它在某個特定的時間點(diǎn)前是一定會更新的〉牵基于這樣的前提励七,我們將服務(wù)運(yùn)行時間改為定點(diǎn)運(yùn)行,這樣是不是就能解決問題了呢嗽冒?
然而現(xiàn)實(shí)并不總是那么美好呀伙,因?yàn)槲覀兎?wù)間是有依賴關(guān)系的,Data Loader是依賴于我們Data Collector的處理結(jié)果的添坊,當(dāng)我們把運(yùn)行方式改為定點(diǎn)運(yùn)行后剿另,帶來的問題是,一旦Data Collector的運(yùn)行狀態(tài)出現(xiàn)了問題贬蛙,例如運(yùn)行時間過長雨女,運(yùn)行中出現(xiàn)錯誤,那么Data Loader必然出錯阳准。同時改為定點(diǎn)運(yùn)行后氛堕,我們的數(shù)據(jù)更新必然有延遲。
那么如何解決這些問題呢野蝇?
Serverless的系統(tǒng)架構(gòu)
我們引入了Lambda讼稚,將Data Collector 和 Data Loader用Lambda進(jìn)行了替換括儒,帶來了下面這些好處:
由于Lambda是由事件驅(qū)動的,S3上一個數(shù)據(jù)的變化可以觸發(fā)一個事件锐想,SNS的一條消息可以觸發(fā)一個時間等等帮寻,在使用Lambda后,我們就可以講原來基于時間的數(shù)據(jù)處理流程赠摇,轉(zhuǎn)變?yōu)榛谑录臄?shù)據(jù)處理流程固逗,這樣一方面可以保證我們數(shù)據(jù)更新的實(shí)時性,另一方面可以大大節(jié)省資源藕帜,由于Lambda是按照觸發(fā)次數(shù)收費(fèi)的烫罩,所以在我們的這個用例下,可以大大減少花費(fèi)洽故。
可能細(xì)心的讀者想問為什么我們Data Collector 2沒有使用Lambda進(jìn)行替換呢贝攒?這是因?yàn)樗臉I(yè)務(wù)邏輯比較復(fù)雜,每次運(yùn)行的時間較長收津,而Lambda的最長執(zhí)行時間是5分鐘饿这,所以在這種情況下浊伙,就不適合使用Lambda進(jìn)行替換了撞秋。
實(shí)時數(shù)據(jù)處理下的Serverless架構(gòu)
在初識Serverless架構(gòu)的好處之后,我們開始在其他方面的應(yīng)用嘗試嚣鄙,比較典型的一個例子就是在實(shí)時數(shù)據(jù)處理業(yè)務(wù)下的Serverless架構(gòu)吻贿。在我們業(yè)務(wù)下,我們需要實(shí)時跟蹤一個外部的數(shù)據(jù)源API哑子,根據(jù)它的數(shù)據(jù)變化來實(shí)時更新我們的數(shù)據(jù)舅列。
在我們的架構(gòu)設(shè)計(jì)中,我們使用一個Lambda來跟蹤外部數(shù)據(jù)源的數(shù)據(jù)變化卧蜓,并將其推到AWS Kinesis Stream里帐要,AWS Kinesis會觸發(fā)第二個Lambda進(jìn)行相應(yīng)的數(shù)據(jù)處理,并把數(shù)據(jù)存儲到數(shù)據(jù)庫中弥奸,值得注意的是由于Lambda是可以根據(jù)需求自動伸縮的榨惠,所以Lambda會根據(jù)Kinesis的需求來自動擴(kuò)展。這就體現(xiàn)了Serverless架構(gòu)下的另一個好處盛霎,可以相對簡單的赠橙,自動進(jìn)行伸縮擴(kuò)展。
Web系統(tǒng)的Serverless架構(gòu)
對于Web系統(tǒng)這種我們最為熟悉和常見的IT系統(tǒng)來說愤炸,它能不能用Serverless的架構(gòu)來實(shí)現(xiàn)呢期揪?我們來看下邊的例子。我們先來看看傳統(tǒng)的例子规个。
在傳統(tǒng)實(shí)現(xiàn)中凤薛,我們會利用Load Blancer來做負(fù)載均衡姓建,然后后續(xù)的應(yīng)用會部署在AutoScaling Group中,根據(jù)流量來做自動伸縮缤苫,這種模式已經(jīng)是十分成熟了引瀑。那么在Serverless的架構(gòu)下該如何設(shè)計(jì)呢?
在Serverless架構(gòu)下榨馁,一般我們的前端應(yīng)用的資源文件包括Html憨栽,JS,CSS翼虫,都是部署在S3(AWS的文件存儲)上的屑柔。前端應(yīng)用通過AJAX請求向后臺請求數(shù)據(jù)。后臺通過API GateWay定義對外的Endpoint珍剑,同時每個Endpoint會觸發(fā)一個Lambda進(jìn)行數(shù)據(jù)操作掸宛,例如圖中的GET,和POST請求會觸發(fā)兩個不同Lambda招拙。這樣的Serverless架構(gòu)可以讓開發(fā)者不必?fù)?dān)心水平擴(kuò)展的問題唧瘾。
Serverless架構(gòu)的未來
目前AWS Lambda似乎已經(jīng)成為了Serverless的代名詞,為了幫助開發(fā)者更好的構(gòu)建Serverless應(yīng)用别凤,市場上出現(xiàn)了一些工具和框架饰序,例如Serverless Framework。但是同樣我們還可以看到一些其他的云平臺和開源框架也在提供類似的服務(wù)规哪,例如webtask求豫,OpenWhisk,以及其在IBM Bluemix上的實(shí)現(xiàn)诉稍。
Serverless架構(gòu)作為一種新的架構(gòu)方式蝠嘉,還在不斷的發(fā)展中。希望本文能給您帶來一些思考杯巨。