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