使用AWS Lambdas扩展技术堆栈
面對(duì)現(xiàn)實(shí)吧。 調(diào)試性能問(wèn)題很困難,但更難解決。
假設(shè)您發(fā)現(xiàn)了令人反感的代碼,這些代碼正在拖慢您的應(yīng)用的運(yùn)行速度。 最終會(huì)有一段時(shí)間,您發(fā)現(xiàn)該代碼減速是同步的或線性執(zhí)行的。 解決這些有問(wèn)題的代碼段的最有效方法之一是將最重的工作負(fù)載委派給以后的時(shí)間和地點(diǎn)。
盡管有無(wú)數(shù)種工作負(fù)載委派解決方案,但近年來(lái)在第三方服務(wù)器上執(zhí)行代碼(也稱為無(wú)服務(wù)器功能)的想法變得越來(lái)越流行。
無(wú)服務(wù)器功能非常有用,因?yàn)槲覀兛梢耘渲锰幚磉@些工作負(fù)載的執(zhí)行時(shí)間和頻率。 此外,我們只為使用的時(shí)間和計(jì)算能力付費(fèi)。 無(wú)需使用永遠(yuǎn)運(yùn)行的服務(wù)器,即使不使用它也要消耗主機(jī)成本。
Amazon Web Services中的無(wú)服務(wù)器功能
在Amazon Web Services(或AWS)中,無(wú)數(shù)功能被稱為L(zhǎng)ambda。 盡管Lambdas和其他無(wú)服務(wù)器功能使我們?cè)谄渌?jì)算機(jī)上執(zhí)行代碼有很多好處,但在執(zhí)行方式上卻有一些限制。
由于我們從技術(shù)上是從AWS租用硬件和軟件,因此他們可以確定運(yùn)行代碼的硬件規(guī)格和環(huán)境。
對(duì)于Amazon,這意味著在Ubuntu(Linux)環(huán)境中運(yùn)行和執(zhí)行代碼。 我們需要考慮有關(guān)AWS Lambda部署和執(zhí)行環(huán)境的特定限制 。
盡管它們都很重要,但我想談?wù)勔恍┫拗?#xff0c;這些限制將決定我們?nèi)绾卧O(shè)計(jì)和實(shí)現(xiàn)功能。
內(nèi)存和時(shí)間限制
當(dāng)我們最終嘗試將工作委派給AWS Lambda時(shí),我們需要以不超過(guò)128MB內(nèi)存使用限制和執(zhí)行限制的方式進(jìn)行操作。 每個(gè)功能還必須花費(fèi)不到300秒(五分鐘)的時(shí)間來(lái)執(zhí)行。
盡管您可以在五分鐘內(nèi)完成很多工作,但是我發(fā)現(xiàn)圍繞模塊化的重點(diǎn)設(shè)計(jì)Lambda函數(shù)很有用。 這意味著將功能設(shè)計(jì)為通過(guò)Lambda多次處理較小的工作單元,而不是一次發(fā)送大量要執(zhí)行的數(shù)據(jù)。
使用模塊化的Lambda實(shí)現(xiàn),我們應(yīng)該能夠在這些限制下處理我們需要的任何東西。
臨時(shí)存儲(chǔ)
AWS Lambdas中的存儲(chǔ)也有點(diǎn)有趣。 我們還只能在Lambda的文件系統(tǒng)的一部分中/tmp最多寫入512MB。
盡管我們當(dāng)然可以在Lambda中對(duì)數(shù)據(jù)建模,但我們依賴于外部資源來(lái)檢索和永久存儲(chǔ)執(zhí)行結(jié)果數(shù)據(jù)。 我們最終關(guān)心的是創(chuàng)建一段代碼,該代碼可以計(jì)算事物的結(jié)果并將其發(fā)送到另一個(gè)要存儲(chǔ)的地方。
部署包大小
另一點(diǎn)值得注意的是部署程序包限制。 雖然我們編寫的帶有代碼的文件應(yīng)該很容易就在該限制之內(nèi),但是我們不能忘記依賴關(guān)系。
AWS Lambdas要求我們?cè)诓渴鸪绦虬刑崛∶總€(gè)依賴項(xiàng)。 因此,我們需要確保我們的代碼和依賴項(xiàng)之和不超過(guò)此限制!
語(yǔ)言限制
最后,最大的限制之一是在Lambda中只允許執(zhí)行某些語(yǔ)言。 對(duì)于AWS Lambda,這些語(yǔ)言是(在撰寫本文時(shí))Python,Go,JavaScript和Java。
如果應(yīng)用程序是用其中一種語(yǔ)言編寫的,那么您很幸運(yùn)! 您所要做的就是導(dǎo)入代碼,一切順利。
但是,我想逐步說(shuō)明為什么即使您的應(yīng)用程序不是用其中一種語(yǔ)言編寫的,使用Lambda仍然有意義。
Ruby和Python的示例
我最近的許多工作都是基于Python Lambda的,該Lambda被基于Ruby的應(yīng)用程序調(diào)用。 因此,我將演示使用這兩種語(yǔ)言的示例。
Python和Ruby都是動(dòng)態(tài)語(yǔ)言 。 盡管AWS不為L(zhǎng)ambda提供Ruby支持,但它們確實(shí)支持Python。 為Ruby代碼庫(kù)編寫Python Lambda很有道理,因?yàn)樗鼈兊臉邮胶徒Y(jié)構(gòu)相似。 亞馬遜還有一個(gè)很棒的Ruby SDK ,我們將使用它來(lái)調(diào)用和管理Lambda。
讓我們開始編寫Python Lambda:
index.py
def handler(event, context):input_message = event.get('message')print(input_message)return {'message': 'Well, hey there Ruby application!'}您可以按照Amazon的教程來(lái)學(xué)習(xí)如何將這段代碼作為L(zhǎng)ambda進(jìn)行部署。 設(shè)置完成后,我們將需要一些有關(guān)Lambda的信息:
- 部署Lambda的AWS區(qū)域
- 您的AWS訪問(wèn)密鑰和訪問(wèn)密鑰
- Lambda的名稱
掌握了這些信息之后,我們就可以開始編寫Ruby應(yīng)用程序了。 在開始之前,請(qǐng)記住將AWS Ruby SDK添加到項(xiàng)目的Gemfile 。
app.rb
require ‘a(chǎn)ws-sdk’ require 'json'credentials = Aws::Credentials.new('access-key', 'access-key-secret')lambda_client = Aws::Lambda::Client.new(region: 'lambda-aws-region',credentials: credentials )app_payload = { message: "Hello Python Lambda!" }response = lambda_client.invoke({function_name: "SampleAWSFunction",invocation_type: "RequestResponse",payload: app_payload })parsed_response = JSON.parse(resp.payload.string) puts parsed_response考慮到這一點(diǎn),我們現(xiàn)在可以運(yùn)行app.rb并從Lambda獲得實(shí)時(shí)響應(yīng)!
包起來(lái)
通過(guò)此基本示例,我們現(xiàn)在可以使用AWS支持的任何語(yǔ)言將更復(fù)雜的基于Ruby的代碼委托給Lambda函數(shù)。
盡管我們的示例相對(duì)于Python更為偏愛,但AWS和其他無(wú)服務(wù)器功能提供商所提供的自由是能夠?yàn)楫?dāng)前工作選擇最佳語(yǔ)言。
是否需要使用線程來(lái)構(gòu)建性能更高的東西? 也許嘗試使用Java或Go這樣的語(yǔ)言來(lái)實(shí)現(xiàn)您的功能。 想留在類似于Ruby的地方嗎? 堅(jiān)持使用此Python模板或嘗試JavaScript!
選擇AWS堆棧之外的語(yǔ)言并運(yùn)行自己的解決方案在許多方面絕對(duì)具有吸引力,但使用AWS Lambda的穩(wěn)定性,成本和效率是該服務(wù)的最大賣點(diǎn)。 對(duì)我而言,僅憑這些原因,就可以提供一種有效且具有成本效益的方法,以幫助您更好地平衡應(yīng)用程序中的同步執(zhí)行瓶頸。
在使用AWS Lambdas時(shí),我發(fā)現(xiàn)有趣的另一件事是,每個(gè)人都有自己獨(dú)特的解決方案和使用它們的實(shí)現(xiàn)。
但是,每種體系結(jié)構(gòu)都需要時(shí)間,試驗(yàn)和錯(cuò)誤才能開發(fā)。 如果做對(duì)了,在解決應(yīng)用程序速度和執(zhí)行時(shí)間問(wèn)題上,投資和挫敗感將得到巨大回報(bào)。
最終,我們需要權(quán)衡使用Lambda的成本以及它們?cè)谖覀兊闹鲬?yīng)用程序服務(wù)器上釋放的時(shí)間。 您最終也有一天會(huì)發(fā)現(xiàn)自己完全利用了無(wú)服務(wù)器架構(gòu)!
無(wú)論哪種方式,了解有關(guān)AWS的Lambda Functions之類的無(wú)服務(wù)器解決方案的更多信息都將為您提供另一種解決日益增長(zhǎng)的軟件應(yīng)用程序中的速度和性能問(wèn)題的方法。 這可能并不總是補(bǔ)救措施,但它是幫助事情在未來(lái)更快更強(qiáng)大的有效解決方案。
翻譯自: https://www.javacodegeeks.com/2018/06/expanding-tech-stack-aws-lambdas.html
總結(jié)
以上是生活随笔為你收集整理的使用AWS Lambdas扩展技术堆栈的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 电脑显卡分辨率怎么计算(显卡怎么看分辨率
- 下一篇: 电脑桌面锁定的快捷键(快速锁定Windo