摘要:例如,控制臺使用調(diào)用類型,因此當(dāng)您使用控制臺調(diào)用函數(shù)時,控制臺將顯示返回的值。如果別名用于調(diào)用函數(shù),將為別名指向的版本。
場景:現(xiàn)在需要開發(fā)一個前后端分離的應(yīng)用,后端采用 RESTful API 最為方便,但是如果這個后端服務(wù)會在一天中的某些時候有高并發(fā)的情況,使用什么樣的架構(gòu)最為簡單呢?
剛思考這個問題的時候我想到的解決方案可能有以下幾種:
使用CDN內(nèi)容分發(fā)網(wǎng)絡(luò),減少主服務(wù)器的壓力
使用LVS服務(wù)器負(fù)載均衡
使用緩存
硬件層 提高帶寬,使用SSD 硬盤,使用更好的服務(wù)器
代碼層,優(yōu)化代碼(使用性能更好的語言等
?
但以上的幾個方法都需要關(guān)注服務(wù)器的存儲和計算資源,以便隨時調(diào)整以滿足更高的性能,并且高并發(fā)的請求也是分時段的,配置了更高性能的服務(wù)器在訪問量變低的時候也是資源浪費。
這個時候可以使用 FaaS(Functions as a Service) 架構(gòu),跟傳統(tǒng)架構(gòu)不同在于,他們運行于無狀態(tài)的容器中,可以由事件觸發(fā),短暫的,完全被第三方管理,功能上FaaS就是不需要關(guān)心后臺服務(wù)器或者應(yīng)用服務(wù),只需關(guān)心自己的代碼即可。其中AWS Lambda是目前最佳的FaaS實現(xiàn)之一。
AWS LambdaAWS Lambda 是一項計算服務(wù),使用時無需預(yù)配置或管理服務(wù)器即可運行代碼。AWS Lambda 只在需要時執(zhí)行代碼并自動縮放。借助 AWS Lambda,幾乎可以為任何類型的應(yīng)用程序或后端服務(wù)運行代碼,而且無需執(zhí)行任何管理?,F(xiàn)在 AWS Lambda 支持 Node.js、Java、C# 和 Python。
使用場景Lambda 常見的應(yīng)用場景有以下幾種:
將Lambda 作為事件源用于 AWS 服務(wù)(比如音頻上傳到 s3后,觸發(fā) Lambda 音頻轉(zhuǎn)碼服務(wù),轉(zhuǎn)碼音頻文件
通過 HTTPS (Amazon API Gateway) 實現(xiàn)的按需 Lambda 函數(shù)調(diào)用(配合 API Gateway創(chuàng)建簡單的微服務(wù)
按需 Lambda 函數(shù)調(diào)用(使用自定義應(yīng)用程序構(gòu)建您自己的事件源)
計劃的事件(比如每天晚上12點生成報表發(fā)送到指定郵箱
下圖是將Lambda 作為事件源用于 AWS 服務(wù)案例的一個執(zhí)行流程圖:
詳細(xì)信息可以參考 官方文檔(https://docs.aws.amazon.com/z...)
通過上面的步驟,我們了解了如何使用一個 Lambda 函數(shù),現(xiàn)在我們看下如何構(gòu)建 Lambda 函數(shù)。
如何構(gòu)建Lambda 創(chuàng)建 Lambda 函數(shù)在創(chuàng)建 Lambda 函數(shù)時,需要指定一個處理程序(此處理程序是代碼中的函數(shù)),AWS Lambda 可在服務(wù)執(zhí)行代碼時調(diào)用它。在 Python 中創(chuàng)建處理程序函數(shù)時,使用以下一般語法結(jié)構(gòu)。
def handler_name(event, context): ... return some_value
在該語法中,需要注意以下方面:
event - AWS Lambda 使用此參數(shù)將事件數(shù)據(jù)傳遞到處理程序。此參數(shù)通常是 Python dict 類型。它也可以是 list、str、int、float 或 NoneType 類型。
context - AWS Lambda 使用此參數(shù)向處理程序提供運行時信息。此參數(shù)為 LambdaContext 類型。
(可選)處理程序可返回值。返回的值所發(fā)生的狀況取決于調(diào)用 Lambda 函數(shù)時使用的調(diào)用類型:
如果使用 RequestResponse 調(diào)用類型(同步執(zhí)行),AWS Lambda 會將 Python 函數(shù)調(diào)用的結(jié)果返回到調(diào)用 Lambda 函數(shù)的客戶端(在對調(diào)用請求的 HTTP 響應(yīng)中,序列化為 JSON)。例如,AWS Lambda 控制臺使用 RequestResponse 調(diào)用類型,因此當(dāng)您使用控制臺調(diào)用函數(shù)時,控制臺將顯示返回的值。
如果處理程序返回 NONE,AWS Lambda 將返回 null。
如果使用 Event 調(diào)用類型(異步執(zhí)行),則丟棄該值。
context對象在執(zhí)行 Lambda 函數(shù)時,它可以與 AWS Lambda 服務(wù)進行交互以獲取有用的運行時信息,例如:
AWS Lambda 終止您的 Lambda 函數(shù)之前的剩余時間量(超時是 Lambda 函數(shù)配置屬性之一)。
與正在執(zhí)行的 Lambda 函數(shù)關(guān)聯(lián)的 CloudWatch 日志組和日志流。
返回到調(diào)用了 Lambda 函數(shù)的客戶端的 AWS 請求 ID??梢允褂么苏埱?ID 向 AWS Support 進行任何跟進查詢。
如果通過 AWS 移動軟件開發(fā)工具包調(diào)用 Lambda 函數(shù),則可了解有關(guān)調(diào)用 Lambda 函數(shù)的移動應(yīng)用程序的更多信息。
context 對象提供了以下方法:
返回在 AWS Lambda 終止函數(shù)前剩余的執(zhí)行時間(以毫秒為單位)。
context 對象提供了以下屬性:
正在執(zhí)行的 Lambda 函數(shù)的名稱。
正在執(zhí)行的 Lambda 函數(shù)版本。如果別名用于調(diào)用函數(shù),function_version 將為別名指向的版本。
ARN 用于調(diào)用此函數(shù)。它可以是函數(shù) ARN 或別名 ARN。非限定的 ARN 執(zhí)行 $LATEST 版本,別名執(zhí)行它指向的函數(shù)版本。
為 Lambda 函數(shù)配置的內(nèi)存限制(以 MB 為單位)。您在創(chuàng)建 Lambda 函數(shù)時設(shè)置內(nèi)存限制,并且隨后可更改此限制。
與請求關(guān)聯(lián)的 AWS 請求 ID。這是返回到調(diào)用了 invoke 方法的客戶端的 ID。 注意如果 AWS Lambda 重試調(diào)用(例如,在處理 Kinesis 記錄的 Lambda 函數(shù)引發(fā)異常的情況下)時,請求 ID 保持不變。
CloudWatch 日志組的名稱,可從該日志組中查找由 Lambda 函數(shù)寫入的日志。
CloudWatch 日志流的名稱,可從該日志流中查找由 Lambda 函數(shù)寫入的日志。每次調(diào)用 Lambda 函數(shù)時,日志流可能會更改,也可能不更改。如果 Lambda 函數(shù)無法創(chuàng)建日志流,則該值為空。當(dāng)向 Lambda 函數(shù)授予必要權(quán)限的執(zhí)行角色未包括針對 CloudWatch Logs 操作的權(quán)限時,可能會發(fā)生這種情況。
通過 AWS 移動軟件開發(fā)工具包進行調(diào)用時的 Amazon Cognito 身份提供商的相關(guān)信息。它可以為空。identity.cognito_identity_ididentity.cognito_identity_pool_id
通過 AWS 移動軟件開發(fā)工具包進行調(diào)用時的客戶端應(yīng)用程序和設(shè)備的相關(guān)信息。它可以為空。client_context.client.installation_idclient_context.client.app_titleclient_context.client.app_version_nameclient_context.client.app_version_codeclient_context.client.app_package_nameclient_context.custom由移動客戶端應(yīng)用程序設(shè)置的自定義值的 dict。client_context.env由 AWS 移動軟件開發(fā)工具包提供的環(huán)境信息的 dict。
查看以下 Python 示例。它有一個函數(shù),此函數(shù)也是處理程序。處理程序通過作為參數(shù)傳遞的 context 對象接收運行時信息。
from __future__ import print_function import time def get_my_log_stream(event, context): print("Log stream name:", context.log_stream_name) print("Log group name:", context.log_group_name) print("Request ID:",context.aws_request_id) print("Mem. limits(MB):", context.memory_limit_in_mb) # Code will execute quickly, so we add a 1 second intentional delay so you can see that in time remaining value. time.sleep(1) print("Time remaining (MS):", context.get_remaining_time_in_millis())
此示例中的處理程序代碼只打印部分運行時信息。每個打印語句均在 CloudWatch 中創(chuàng)建一個日志條目。如果您使用 Lambda 控制臺調(diào)用函數(shù),則控制臺會顯示日志。
日志記錄您的 Lambda 函數(shù)可包含日志記錄語句。AWS Lambda 將這些日志寫入 CloudWatch。如果您使用 Lambda 控制臺調(diào)用 Lambda 函數(shù),控制臺將顯示相同的日志。
以下 Python 語句生成日志條目:
print 語句。
logging 模塊中的 Logger 函數(shù)(例如,logging.Logger.info 和 logging.Logger.error)。
print 和 logging.* 函數(shù)將日志寫入 CloudWatch Logs 中,而 logging.* 函數(shù)將額外信息寫入每個日志條目中,例如時間戳和日志級別。
可查找 Lambda 函數(shù)寫入的日志,如下所示:
在 AWS Lambda 控制臺中 - AWS Lambda 控制臺中的 Log output 部分顯示這些日志。
在響應(yīng)標(biāo)頭中,當(dāng)您以編程方式調(diào)用 Lambda 函數(shù)時 - 如果您以編程方式調(diào)用 Lambda 函數(shù),則可添加 LogType參數(shù)以檢索已寫入 CloudWatch 日志的最后 4 KB 的日志數(shù)據(jù)。AWS Lambda 在響應(yīng)的 x-amz-log-results 標(biāo)頭中返回該日志信息。有關(guān)更多信息,請參閱Invoke。
如果您使用 AWS CLI 調(diào)用該函數(shù),則可指定帶有值 Tail 的 --log-type parameter 來檢索相同信息。
在 CloudWatch 日志中 - 要在 CloudWatch 中查找您的日志,您需要知道日志組名稱和日志流名稱。可以使用代碼中的 context.logGroupName 和 context.logStreamName 屬性來獲取此信息。在運行 Lambda 函數(shù)時,控制臺或 CLI 中生成的日志將會向您顯示日志組名稱和日志流名稱。
函數(shù)錯誤如果 Lambda 函數(shù)引發(fā)異常,AWS Lambda 會識別失敗,將異常信息序列化為 JSON 并將其返回??紤]以下示例:
def always_failed_handler(event, context): raise Exception("I failed!")
在調(diào)用此 Lambda 函數(shù)時,它將引發(fā)異常,并且 AWS Lambda 返回以下錯誤消息:
{ "errorMessage": "I failed!", "stackTrace": [ [ "/var/task/lambda_function.py", 3, "my_always_fails_handler", "raise Exception("I failed!")" ] ], "errorType": "Exception" }
詳細(xì)信息參考官方文檔:https://docs.aws.amazon.com/z...
注意事項 AWS Lambda 限制AWS Lambda 在使用中會強加一些限制,例如,程序包的大小或 Lambda 函數(shù)在每次調(diào)用中分得的內(nèi)存量。
每個調(diào)用的 AWS Lambda 資源限制
資源 | 限制 |
---|---|
內(nèi)存分配范圍 | 最小值 = 128 MB/最大值 = 1536 MB (增量為 64 MB). 如果超過最大內(nèi)存使用量,則函數(shù)調(diào)用將會終止。 |
臨時磁盤容量(“/tmp”空間) | 512MB |
文件描述符數(shù) | 1024 |
過程和線程數(shù)(合并總數(shù)量) | 1024 |
每個請求的最大執(zhí)行時長 | 300 秒 |
Invoke 請求正文有效負(fù)載大小 (RequestResponse/同步調(diào)用) | 6MB |
Invoke 請求正文有效負(fù)載大小 (Event/異步調(diào)用) | 128 K |
每個區(qū)域的 AWS Lambda 賬戶限制
資源 | 默認(rèn)限制 |
---|---|
并發(fā)執(zhí)行數(shù) | 1000 |
并發(fā)執(zhí)行是指在任意指定時間對您的函數(shù)代碼的執(zhí)行數(shù)量。您可以估計并發(fā)執(zhí)行計數(shù),但是,根據(jù) Lambda 函數(shù)是否處理來自基于流的事件源的事件,并發(fā)執(zhí)行計數(shù)會有所不同。
基于流的事件源 - 如果您創(chuàng)建 Lambda 函數(shù)處理來自基于流的服務(wù)(Amazon Kinesis Data Streams 或 DynamoDB 流)的事件,則每個流的分區(qū)數(shù)量是并發(fā)度單元。如果您的流有 100 個活動分區(qū),則最多會有 100 個 Lambda 函數(shù)調(diào)用并發(fā)運行。然后,每個 Lambda 函數(shù)按照分區(qū)到達的順序處理事件。
并非基于流的事件源 - 如果您創(chuàng)建 Lambda 函數(shù)處理來自并非基于流的事件源(例如,Amazon S3 或 API 網(wǎng)關(guān))的事件,則每個發(fā)布的事件是一個工作單元。因此,這些事件源發(fā)布的事件數(shù)(或請求數(shù))影響并發(fā)度。
您可以使用以下公式來估算并發(fā) Lambda 函數(shù)調(diào)用數(shù)。
events (or requests) per second * function duration
例如,考慮一個處理 API Gateway 的 Lambda 函數(shù)。假定 Lambda 函數(shù)平均用時 0.3 秒,API Gateway 每秒請求 1000 次。因此,Lambda 函數(shù)有 300 個并發(fā)執(zhí)行。
?
具體信息參考Lambda 函數(shù)并行執(zhí)行
AWS Lambda 部署限制
項目 | 默認(rèn)限制 |
---|---|
Lambda 函數(shù)部署程序包大小 (壓縮的 .zip/.jar 文件) | 50 MB |
每個區(qū)域可以上傳的所有部署程序包的總大小 | 75GB |
可壓縮到部署程序包中的代碼/依賴項的大小 (未壓縮的 .zip/.jar 大小).注意每個 Lambda 函數(shù)都會在其的 /tmp 目錄中接收到額外的 500 MB 的非持久性磁盤空間。該 /tmp 目錄可用于在函數(shù)初始化期間加載額外的資源,如依賴關(guān)系庫或數(shù)據(jù)集。 | 250MB |
環(huán)境變量集的總大小 | 4 KB |
本文內(nèi)容主要參考 AWS Lambda 官方文檔,詳細(xì)信息請訪問 https://docs.aws.amazon.com/z...參考鏈接
AWS Lambda 開發(fā)入門
創(chuàng)建部署程序包 (Python)
Lambda 函數(shù)并行執(zhí)行
高并發(fā)解決方案
如何優(yōu)化網(wǎng)站高并發(fā)訪問?
高并發(fā)的解決方案
Serverless開發(fā)編程思想
一個簡單的 Serverless 架構(gòu)例子
使用lambda帶來的架構(gòu)優(yōu)勢
最后,感謝女朋友支持。
歡迎關(guān)注(April_Louisa) | 請我喝芬達 |
---|---|
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/41258.html
摘要:注意,此標(biāo)志不反映數(shù)據(jù)庫本身的健康狀況。每一個匹配給定路線的請求都將被提交給它的相關(guān)服務(wù)。字段解釋是否必填協(xié)議列表,。 部署好kong之后,則需要將我們自己的接口加入到kong中管理,kong提供了比較全面的restful api,每個版本會有所不同,下面的記錄基于kong v0.14.x kong的8001端口是resful admin api,服務(wù)、路由、配置都是通過這個端口進行管...
摘要:菜鳥教程框架中文手冊入門目標(biāo)使用搭建通過對數(shù)據(jù)增刪查改沒了純粹占行用的拜 后端API入門學(xué)習(xí)指北 了解一下一下概念. RESTful API標(biāo)準(zhǔn)] 所有的API都遵循[RESTful API標(biāo)準(zhǔn)]. 建議大家都簡單了解一下HTTP協(xié)議和RESTful API相關(guān)資料. 阮一峰:理解RESTful架構(gòu) 阮一峰:RESTful API 設(shè)計指南 RESTful API指南 依賴注入 D...
摘要:菜鳥教程框架中文手冊入門目標(biāo)使用搭建通過對數(shù)據(jù)增刪查改沒了純粹占行用的拜 后端API入門學(xué)習(xí)指北 了解一下一下概念. RESTful API標(biāo)準(zhǔn)] 所有的API都遵循[RESTful API標(biāo)準(zhǔn)]. 建議大家都簡單了解一下HTTP協(xié)議和RESTful API相關(guān)資料. 阮一峰:理解RESTful架構(gòu) 阮一峰:RESTful API 設(shè)計指南 RESTful API指南 依賴注入 D...
摘要:菜鳥教程框架中文手冊入門目標(biāo)使用搭建通過對數(shù)據(jù)增刪查改沒了純粹占行用的拜 后端API入門學(xué)習(xí)指北 了解一下一下概念. RESTful API標(biāo)準(zhǔn)] 所有的API都遵循[RESTful API標(biāo)準(zhǔn)]. 建議大家都簡單了解一下HTTP協(xié)議和RESTful API相關(guān)資料. 阮一峰:理解RESTful架構(gòu) 阮一峰:RESTful API 設(shè)計指南 RESTful API指南 依賴注入 D...
閱讀 3924·2021-11-24 09:38
閱讀 3106·2021-11-17 09:33
閱讀 3878·2021-11-10 11:48
閱讀 1244·2021-10-14 09:48
閱讀 3137·2019-08-30 13:14
閱讀 2554·2019-08-29 18:37
閱讀 3400·2019-08-29 12:38
閱讀 1422·2019-08-29 12:30