做者:高露前端
凹凸實驗室公衆號:AOTULabs數據庫
Serverless 架構即「無服務器」架構,它是一種全新的架構方式,是雲計算時代一種革命性的架構模式。與雲計算、容器和人工智能同樣,Serverless 是這兩年IT行業的一個熱門詞彙,它在各類技術文章和論壇上都有很高的曝光度。編程
目前行業可能更多處在容器 Docker+Kubernetes, 利用 IaaS、PaaS和SaaS 來快速搭建部署應用後端
Serverless 圈內俗稱爲「無服務器架構」,Serverless 不是具體的一個編程框架、類庫或者工具。簡單來講,Serverless 是一種軟件系統架構思想和方法,它的核心思想是用戶無須關注支撐應用服務運行的底層主機。這種架構的思想和方法將對將來軟件應用的設計、開發和運營產生深遠的影響。安全
所謂「無服務器」,並非說基於 Serverless 架構的軟件應用不須要服務器就能夠運行,其指的是用戶無須關心軟件應用運行涉及的底層服務器的狀態、資源(好比 CPU、內存、磁盤及網絡)及數量。軟件應用正常運行所須要的計算資源由底層的雲計算平臺動態提供。服務器
Serverless 的核心思想是讓做爲計算資源的服務器再也不成爲用戶所關注的一種資源。其目的是提升應用交付的效率,下降應用運營的工做量和成本。以 Serverless 的思想做爲基礎實現的各類框架、工具及平臺,是各類 Serverless 的實現(Implementation)。Serverless不是一個簡單的工具或框架。用戶不可能簡單地經過實施某個產品或工具就能實現 Serverless 的落地。可是,要實現 Serverless 架構的落地,須要一些實實在在的工具和框架做爲有力的技術支撐和基礎。網絡
隨着 Serverless 的日益流行,這幾年業界已經出現了多種平臺和工具幫助用戶進行 Serverless 架構的轉型和落地。目前市場上比較流行的 Serverless 工具、框架和平臺 有:架構
列舉的 Serverless 實現有的是公有云的服務,有的則是框架工具,能夠被部署在私有數據中心的私有云中(私有云 Serverless 框架 OpenWhisk、Fission 及 OpenFaaS)。每一個 Serverless 服務或框架的實現都不盡相同,都有各自的特色。併發
IT是一個永遠都不消停的行業,在這個行業裏不斷有各類各樣新的名詞和技術誕生,雲計算(Cloud Computing)的出現是21世紀IT業界最重大的一次變革。雲計算的發展從基礎架構即服務(Infrastructure as a Service, IaaS),平臺即服務(Platform as a Service,PaaS),軟件即服務(Software as a Service,SaaS),慢慢開始演變到函數即服務(Function as a Service,FaaS)以及後臺即服務(Backend as a Service,BaaS),Serverless 無服務化。框架
目前業界的各種 Serverless 實現按功能而言,主要爲應用服務提供了兩個方面的支持:函數即服務(Function as a Service,FaaS)以及後臺即服務(Backend as a Service,BaaS)。
FaaS 提供了一個計算平臺,在這個平臺上,應用以一個或多個函數的形式開發、運行和管理。FaaS 平臺提供了函數式應用的運行環境,通常支持多種主流的編程語言,如 Java、PHP 及 Python 等。FaaS 能夠根據實際的訪問量進行應用的自動化動態加載和資源的自動化動態分配。大多數 FaaS 平臺基於事件驅動(Event Driven)的思想,能夠根據預約義的事件觸發指定的函數應用邏輯。
目前業界 FaaS 平臺很是成功的一個表明就是 AWS Lambda 平臺。AWS Lambda 是 AWS 公有云服務的函數式計算平臺。經過 AWS Lambda,AWS 用戶能夠快速地在 AWS 公有云上構建基於函數的應用服務。
爲了實現應用後臺服務的 Serverless 化,BaaS(後臺即服務)也應該被歸入一個完整的 Serverless 實現的範疇內。經過 BaaS 平臺將應用所依賴的第三方服務,如數據庫、消息隊列及存儲等服務化併發布出來,用戶經過向 BaaS 平臺申請所須要的服務進行消費,而不須要關心這些服務的具體運維。
BaaS 涵蓋的範圍很普遍,包含任何應用所依賴的服務。一個比較典型的例子是數據庫即服務(Database as a Service,DBaaS)。許多應用都有存儲數據的需求,大部分應用會將數據存儲在數據庫中。傳統狀況下,數據庫都是運行在數據中內心,由用戶運維團隊負責運維。在DBaaS的場景下,用戶向 DBaaS 平臺申請數據庫資源,而不須要關心數據庫的安裝部署及運維。
爲了實現解耦應用和服務器資源,實現服務器資源對用戶透明,與傳統架構相比,Serverless 架構在技術上有許多不一樣的特色。
在 Serverless 架構下,應用的加載(load)和卸載(unload)由 Serverless 雲計算平臺控制。這意味着應用不老是一直在線的。只有當有請求到達或者有事件發生時纔會被部署和啓動。當應用空閒至必定時長時,應用會到達或者有事件發生時纔會被部署和啓動。當應用空閒至必定時長時,應用會被自動中止和卸載。所以應用並不會持續在線,不會持續佔用計算資源。
Serverless 架構的應用並不老是一直在線,而是按需加載執行。應用的加載和執行由事件驅動,好比HTTP請求到達、消息隊列接收到新的信息或存儲服務的文件被修改了等。經過將不一樣事件來源(Event Source)的事件(Event)與特定的函數進行關聯,實現對不一樣事件採起不一樣的反應動做,這樣能夠很是容易地實現事件驅動(Event Driven)架構。
雲計算平臺自動控制應用實例的加載和卸載,且應用和服務器徹底解耦,應用再也不與特定的服務器關聯。所以應用的狀態不能,也不會保存在其運行的服務器之上,不能作到傳統意義上的狀態本地持久化。
應用再也不與特定的服務器關聯。每次處理請求的應用實例多是相同服務器上的應用實例,也多是新生成的服務器上的應用實例。所以,用戶沒法保證同一客戶端的兩次請求由同一個服務器上的同一個應用實例來處理。也就是說,沒法作到傳統意義上的會話保持(Sticky Session)。所以,Serverless架構更適合無狀態的應用。
Serverless 應用原生能夠支持高可用,能夠應對突發的高訪問量。應用實例數量根據實際的訪問量由雲計算平臺進行彈性的自動擴展或收縮,雲計算平臺動態地保證有足夠的計算資源和足夠數量的應用實例對請求進行處理。
每個調用完成一個業務動做,應用會被分解成多個細顆粒度的操做。因爲狀態沒法本地持久化,這些細顆粒度的操做是無狀態的,相似於傳統編程裏無狀態的函數。Serverless 架構下的應用會被函數化,但不能說 Serverless 就是 Function as a Service(FaaS)。Serverless 涵蓋了 FaaS 的一些特性,能夠說 FaaS 是 Serverless 架構實現的一個重要手段。
經過將 Serverless 的理念與當前 Serverless 實現的技術特色相結合,Serverless 架構能夠適用於各類業務場景。
Serverless 架構能夠很好地支持各種靜態和動態Web應用。如 RESTful API 的各種請求動做(GET、POST、PUT及DELETE等)能夠很好地映射成 FaaS 的一個個函數,功能和函數之間能創建良好的對應關係。經過 FaaS 的自動彈性擴展功能,Serverless Web 應用能夠很快速地構建出能承載高訪問量的站點。
Serverless 應用經過 BaaS 對接後端不一樣的服務而知足業務需求,提升應用開發的效率。前端經過FaaS提供的自動彈性擴展對接移動端的流量,開發者能夠更輕鬆地應對突發的流量增加。在 FaaS 的架構下,應用以函數的形式存在。各個函數邏輯之間相對獨立,應用更新變得更容易,使新功能的開發、測試和上線的時間更短。
物聯網(Internet of Things,IoT)應用須要對接各類不一樣的數量龐大的設備。不一樣的設備須要持續採集並傳送數據至服務端。Serverless 架構能夠幫助物聯網應用對接不一樣的數據輸入源。
視頻和圖片網站須要對用戶上傳的圖片和視頻信息進行加工和轉換。可是這種多媒體轉換的工做並非無時無刻都在進行的,只有在一些特定事件發生時才須要被執行,好比用戶上傳或編輯圖片和視頻時。經過 Serverless 的事件驅動機制,用戶能夠在特定事件發生時觸發處理邏輯,從而節省了空閒時段計算資源的開銷,最終下降了運維的成本。
Serverless 能夠用於對一些持續不斷的事件流和數據流進行實時分析和處理,對事件和數據進行實時的過濾、轉換和分析,進而觸發下一步的處理。好比,對各種系統的日誌或社交媒體信息進行實時分析,針對符合特定特徵的關鍵信息進行記錄和告警。
Serverless 應用的函數式架構很是適合用於實現系統集成。用戶無須像過去同樣爲了某些簡單的集成邏輯而開發和運維一個完整的應用,用戶能夠更專一於所需的集成邏輯,只編寫和集成相關的代碼邏輯,而不是一個完整的應用。函數應用的分散式的架構,使得集成邏輯的新增和變動更加靈活。
世界上沒有能解決全部問題的萬能解決方案和架構理念。Serverless 有它的特色和優點,可是同時也有它的侷限。有的侷限是由其架構特色決定的,有的是目前技術的成熟度決定的,畢竟 Serverless 仍是一個起步時間不長的新興技術領域,在許多方面還須要逐步完善。
Serverless 的一個突出優勢是用戶無須關注底層的計算資源,可是這個優勢的反面是用戶對底層的計算資源沒有控制力。對於一些但願掌控底層計算資源的應用場景,Serverless 架構並非最合適的選擇。
Serverless 應用的實如今很大程度上依賴於 Serverless 平臺及該平臺上的 FaaS 和 BaaS 服務。不一樣IT廠商的 Serverless 平臺和解決方案的具體實現並不相同。並且,目前 Serverless 領域尚沒有造成有關的行業標準,這意味着用戶將一個平臺上的 Serverless 應用移植到另外一個平臺時所須要付出的成本會比較高。較低的可移植性將形成廠商鎖定(Vendor Lock-in)。這對但願發展 Serverless 技術,可是又不但願過分依賴特定供應商的企業而言是一個挑戰。
在 Serverless 架構下,用戶不能直接控制應用實際所運行的主機。不一樣用戶的應用,或者同一用戶的不一樣應用在運行時可能共用底層的主機資源。對於一些安全性要求較高的應用,這將帶來潛在的安全風險。
當一個 Serverless 應用長時間空閒時將會被從主機上卸載。當請求再次到達時,平臺須要從新加載應用。應用的首次加載及從新加載的過程將產生必定的延時。對於一些對延時敏感的應用,須要經過預先加載或延長空閒超時時間等手段進行處理。
Serverless 的一個重要特色是應用按需加載執行,而不是長時間持續部署在主機上。目前,大部分 Serverless 平臺對 FaaS 函數的執行時長存在限制。所以 Serverless 應用更適合一些執行時長較短的做業。
雖然 Serverless 技術的發展很快,可是畢竟它仍是一門起步時間不長的新興技術。所以,目前 Serverless 相關平臺、工具和框架還處在一個不斷變化和演進的階段,開發和調試的用戶體驗還須要進一步提高。Serverless 相關的文檔和資料相對比較少,深刻了解 Serverless 架構的架構師、開發人員和運維人員也相對較少。