微服務架構(三): 部署
這個部署的基礎設施由公有云提供商來操作。它一般使用容器或者虛擬機器的方式來分離服務,但是這些細節你並不需要知道。你不需要負責管理作業系統等等。現在有一些不同的serverless部署的環境: AWS Lambda、Google Cloud Functions、 Azure Functions, 他們提供了類似的功能,但是AWS有最豐富的功能。
一個AWS Lambda function是一個無狀態的元件,它被呼叫去處理事件。 要建立一個AWS Lambda function, 你需要把你的程式碼打包成一個ZIP檔案,然後上傳到AWS Lambda。你同時還要指定這個處理事件的function的名字以及它的資源使用限制。
當事件產生的時候,AWS Lambda找到你的function的空閒例項,然後呼叫處理的function。
有四種方法來呼叫一個Lambda function。
一種選擇是你配置你的Lambda function,使它對別的AWS service(比如S3, DynamoDB)所產生的事件(比如S3 bucket上建立了一個新的object、DynamoDB上有條資料被刪除等等)進行響應。
另一種方法是配置AWS Lambda Gateway,把HTTP 請求路由到lambda function上。 AWS Gateway把一個HTTP請求轉化成一個事件物件, 然後呼叫lambda function,然後根據lambda function的返回值生成HTTP響應。
你也可以通過AWS Lambda Web Service API明確呼叫Lambda function。你呼叫Lambda function的應用提供一個JSON物件,傳給Lambda function, web service會把結果返回給你。
第四種方法是使用CRON的方式週期性呼叫。比如說,你可以告訴AWS每5分鐘呼叫一次你的Lambda function。
這種模式的優點:
- 不需要關心底層架構,只要關注程式碼
- 非常有彈性,根據負載自動scale
- 只要為請求數付錢, 便宜
這種模式的缺點:
- 這種架構比VM或者容器有更多的限制。比如說,AWS只支援很少幾種語言,只適用於部署響應請求的無狀態應用,你不能部署一個長期執行的有狀態的應用如資料庫、訊息代理
- 輸入源有限制。比如說AWS Lambda不能訂閱一個像RabbitMQ那樣的訊息代理
- 應用必須快速啟動。Serverless 架構不適用於花很多時間啟動的service
- 高延遲的風險。基礎設施在為你的function啟動一個instance、function 初始化的時間可能比較長。當突發的、大量請求進來的時候,一開始會比較緩慢。