成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

AWS-Lambda 使用入門

RobinQu / 1142人閱讀

摘要:例如,控制臺使用調(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 Lambda

AWS 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、floatNoneType 類型。

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 對象方法 (Python)

context 對象提供了以下方法:

get_remaining_time_in_millis()

返回在 AWS Lambda 終止函數(shù)前剩余的執(zhí)行時間(以毫秒為單位)。

Context 對象屬性 (Python)

context 對象提供了以下屬性:

function_name

正在執(zhí)行的 Lambda 函數(shù)的名稱。

function_version

正在執(zhí)行的 Lambda 函數(shù)版本。如果別名用于調(diào)用函數(shù),function_version 將為別名指向的版本。

invoked_function_arn

ARN 用于調(diào)用此函數(shù)。它可以是函數(shù) ARN 或別名 ARN。非限定的 ARN 執(zhí)行 $LATEST 版本,別名執(zhí)行它指向的函數(shù)版本。

memory_limit_in_mb

為 Lambda 函數(shù)配置的內(nèi)存限制(以 MB 為單位)。您在創(chuàng)建 Lambda 函數(shù)時設(shè)置內(nèi)存限制,并且隨后可更改此限制。

aws_request_id

與請求關(guān)聯(lián)的 AWS 請求 ID。這是返回到調(diào)用了 invoke 方法的客戶端的 ID。 注意如果 AWS Lambda 重試調(diào)用(例如,在處理 Kinesis 記錄的 Lambda 函數(shù)引發(fā)異常的情況下)時,請求 ID 保持不變。

log_group_name

CloudWatch 日志組的名稱,可從該日志組中查找由 Lambda 函數(shù)寫入的日志。

log_stream_name

CloudWatch 日志流的名稱,可從該日志流中查找由 Lambda 函數(shù)寫入的日志。每次調(diào)用 Lambda 函數(shù)時,日志流可能會更改,也可能不更改。如果 Lambda 函數(shù)無法創(chuàng)建日志流,則該值為空。當(dāng)向 Lambda 函數(shù)授予必要權(quán)限的執(zhí)行角色未包括針對 CloudWatch Logs 操作的權(quán)限時,可能會發(fā)生這種情況。

identity

通過 AWS 移動軟件開發(fā)工具包進行調(diào)用時的 Amazon Cognito 身份提供商的相關(guān)信息。它可以為空。identity.cognito_identity_ididentity.cognito_identity_pool_id

client_context

通過 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.infologging.Logger.error)。

printlogging.* 函數(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.logGroupNamecontext.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

相關(guān)文章

  • kong系列:admin-api使用

    摘要:注意,此標(biāo)志不反映數(shù)據(jù)庫本身的健康狀況。每一個匹配給定路線的請求都將被提交給它的相關(guān)服務(wù)。字段解釋是否必填協(xié)議列表,。 部署好kong之后,則需要將我們自己的接口加入到kong中管理,kong提供了比較全面的restful api,每個版本會有所不同,下面的記錄基于kong v0.14.x kong的8001端口是resful admin api,服務(wù)、路由、配置都是通過這個端口進行管...

    Dionysus_go 評論0 收藏0
  • 后端API從入門到放棄指北

    摘要:菜鳥教程框架中文手冊入門目標(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...

    Jeffrrey 評論0 收藏0
  • 后端API從入門到放棄指北

    摘要:菜鳥教程框架中文手冊入門目標(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...

    sf190404 評論0 收藏0
  • 后端API從入門到放棄指北

    摘要:菜鳥教程框架中文手冊入門目標(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...

    Airmusic 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<