面对现实吧。 调试性能问题很困难,但更难解决。

假设您发现了令人反感的代码,这些代码正在拖慢您的应用的运行速度。 最终会有一段时间,您发现该代码减速是同步的或线性执行的。 解决这些有问题的代码段的最有效方法之一是将最重的工作负载委派给以后的时间和地点。

尽管有无数种工作负载委派解决方案,但近年来在第三方服务器上执行代码(也称为无服务器功能)的想法变得越来越流行。

无服务器功能非常有用,因为我们可以配置处理这些工作负载的执行时间和频率。 此外,我们只为使用的时间和计算能力付费。 无需使用永远运行的服务器,即使不使用它也要消耗主机成本。

Amazon Web Services中的无服务器功能

在Amazon Web Services(或AWS)中,无数功能被称为Lambda。 尽管Lambdas和其他无服务器功能使我们在其他计算机上执行代码有很多好处,但在执行方式上却有一些限制。

由于我们从技术上是从AWS租用硬件和软件,因此他们可以确定运行代码的硬件规格和环境。

对于Amazon,这意味着在Ubuntu(Linux)环境中运行和执行代码。 我们需要考虑有关AWS Lambda部署和执行环境的特定限制 。

尽管它们都很重要,但我想谈谈一些限制,这些限制将决定我们如何设计和实现功能。

内存和时间限制

当我们最终尝试将工作委派给AWS Lambda时,我们需要以不超过128MB内存使用限制和执行限制的方式进行操作。 每个功能还必须花费不到300秒(五分钟)的时间来执行。

尽管您可以在五分钟内完成很多工作,但是我发现围绕模块化的重点设计Lambda函数很有用。 这意味着将功能设计为通过Lambda多次处理较小的工作单元,而不是一次发送大量要执行的数据。

使用模块化的Lambda实现,我们应该能够在这些限制下处理我们需要的任何东西。

临时存储

AWS Lambdas中的存储也有点有趣。 我们还只能在Lambda的文件系统的一部分中/tmp最多写入512MB。

尽管我们当然可以在Lambda中对数据建模,但我们依赖于外部资源来检索和永久存储执行结果数据。 我们最终关心的是创建一段代码,该代码可以计算事物的结果并将其发送到另一个要存储的地方。

部署包大小

另一点值得注意的是部署程序包限制。 虽然我们编写的带有代码的文件应该很容易就在该限制之内,但是我们不能忘记依赖关系。

AWS Lambdas要求我们在部署程序包中提取每个依赖项。 因此,我们需要确保我们的代码和依赖项之和不超过此限制!

语言限制

最后,最大的限制之一是在Lambda中只允许执行某些语言。 对于AWS Lambda,这些语言是(在撰写本文时)Python,Go,JavaScript和Java。

如果应用程序是用其中一种语言编写的,那么您很幸运! 您所要做的就是导入代码,一切顺利。

但是,我想逐步说明为什么即使您的应用程序不是用其中一种语言编写的,使用Lambda仍然有意义。

Ruby和Python的示例

我最近的许多工作都是基于Python Lambda的,该Lambda被基于Ruby的应用程序调用。 因此,我将演示使用这两种语言的示例。

Python和Ruby都是动态语言 。 尽管AWS不为Lambda提供Ruby支持,但它们确实支持Python。 为Ruby代码库编写Python Lambda很有道理,因为它们的样式和结构相似。 亚马逊还有一个很棒的Ruby SDK ,我们将使用它来调用和管理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的教程来学习如何将这段代码作为Lambda进行部署。 设置完成后,我们将需要一些有关Lambda的信息:

  • 部署Lambda的AWS区域
  • 您的AWS访问密钥和访问密钥
  • Lambda的名称

掌握了这些信息之后,我们就可以开始编写Ruby应用程序了。 在开始之前,请记住将AWS Ruby SDK添加到项目的Gemfile

app.rb

require ‘aws-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

考虑到这一点,我们现在可以运行app.rb并从Lambda获得实时响应!

包起来

通过此基本示例,我们现在可以使用AWS支持的任何语言将更复杂的基于Ruby的代码委托给Lambda函数。

尽管我们的示例相对于Python更为偏爱,但AWS和其他无服务器功能提供商所提供的自由是能够为当前工作选择最佳语言。

是否需要使用线程来构建性能更高的东西? 也许尝试使用Java或Go这样的语言来实现您的功能。 想留在类似于Ruby的地方吗? 坚持使用此Python模板或尝试JavaScript!

选择AWS堆栈之外的语言并运行自己的解决方案在许多方面绝对具有吸引力,但使用AWS Lambda的稳定性,成本和效率是该服务的最大卖点。 对我而言,仅凭这些原因,就可以提供一种有效且具有成本效益的方法,以帮助您更好地平衡应用程序中的同步执行瓶颈。

在使用AWS Lambdas时,我发现有趣的另一件事是,每个人都有自己独特的解决方案和使用它们的实现。

但是,每种体系结构都需要时间,试验和错误才能开发。 如果做对了,在解决应用程序速度和执行时间问题上,投资和挫败感将得到巨大回报。

最终,我们需要权衡使用Lambda的成本以及它们在我们的主应用程序服务器上释放的时间。 您最终也有一天会发现自己完全利用了无服务器架构!

无论哪种方式,了解有关AWS的Lambda Functions之类的无服务器解决方案的更多信息都将为您提供另一种解决日益增长的软件应用程序中的速度和性能问题的方法。 这可能并不总是补救措施,但它是帮助事情在未来更快更强大的有效解决方案。

翻译自: https://www.javacodegeeks.com/2018/06/expanding-tech-stack-aws-lambdas.html

使用AWS Lambdas扩展技术堆栈相关推荐

  1. aws lambda使用_使用AWS Lambdas扩展技术堆栈

    aws lambda使用 面对现实吧. 调试性能问题很困难,但是更难解决. 假设您发现了有害的代码,这些代码正在拖慢您的应用的运行速度. 最终会有一段时间,您发现此代码减速是同步的或线性执行的. 解决 ...

  2. 系统在此应用程序堆栈溢出_Web应用程序:在开始之前选择正确的技术堆栈

    系统在此应用程序堆栈溢出 You have a great online business idea along with investors and a team ready to get behi ...

  3. AWS全球年度技术大会--上海站、广州站

    上海站: 时间:1月14日 9:30-16:40 地点:上海市黄浦区嵩山路88号 新天地安达仕酒店 您的专属邀请函 - AWS 2017年初重磅活动与您不见不散! AWS re:Invent Reca ...

  4. 构建移动Web应用程序的技术堆栈

    编写web应用程序时,有很多的技术决策.笔者最近回来编写现代Web应用程序,并希望总结一些曾经在开发周期过程中做了记录零散的想法.这篇文章是关于一套对笔者最近开发的项目有帮助的框架.笔者重温了一些最重 ...

  5. Android基于开源项目搭建自己的技术堆栈

    一.app的整体架构 从较高的层次讲,一个APP的整体架构可以分为两层,即应用层和基础框架层. 1.应用层专注于行业领域的实现,如金融.支付.地图.社交等,它直接面向用户,是用户对产品的第一层感知. ...

  6. 事务对性能影响_开启英特尔事务扩展技术(TSX),即可提升intel CPU 近40%性能

    在2019年5月份的时候,intel CPU在互联网上曝光了一个名为僵尸负载漏洞(ZombieLoad),而不法人员可利用该漏洞,恶意软件可以直接从CPU窃取敏感信息,而在最近,僵尸负载漏洞再一次被变 ...

  7. mysql报11004_使用mysqli扩展技术查看服务器连接错误报告的方法

    使用mysqli扩展技术查看服务器连接错误报告的方法 作为PHP的黄金搭档MySQL数据库,在PHP项目开发过程中有着举足轻重的作用,这不仅因为MySQL是完全免费的,而且和PHP一样都是完全跨平台的 ...

  8. 区块链笔记:技术栈、对等网络、密码技术、账户模型、网络共识、脚本系统、扩展技术

    技术栈 从比较技术化的一个角度来对区块链进行一个阐述 从技术站的组成来来阐述一下区块链,作为一种软件系统的开发人员或者说是技术爱好者,更希望从技术的角度来进行一个理解,到底它包含哪些技术模块?又分别产 ...

  9. Arm v9 “机密计算架构(CCA)” 中机密领域管理扩展技术(RME)是什么?

    机密领域管理扩展技术(RME)是什么? 1 Overview 2 Security states 2.1 Controlling the current Security state 2.2 Movi ...

最新文章

  1. mysql切换系统盘命令_mysql常用命令
  2. Python 从零学起(纯基础) 笔记 (二)
  3. 城市遥感动态监测管理系统
  4. 机器视觉--图像形态学
  5. Python json.dumps() 自动缩进
  6. 用C语言实现正则表达式匹配器
  7. MP3中设置播放顺序的软件《闪存式MP3伴侣》
  8. 淘宝天猫京东补流量主要采用的方式是什么呢
  9. 一个自己实现的js表单验证框架。
  10. fatal: ‘origin‘ does not appear to be a git repository
  11. 裁桨研纳铰撼蕉吞字吞汗屠闯汗芳
  12. 导师的SCI很少一作和通讯是怎么回事?
  13. linux 启用dhcp服务器,linux下DHCP服务器配置
  14. 关于彦阳APP 相关参数说明
  15. aircrack-ng破解wifi密码
  16. 刷新 windows 图标
  17. 微型计算机的三类接口,微型计算机及接口技术 微机原理与接口技术试题库(含答案)...
  18. StirMarkBenchmark——图像攻击软件简介资源
  19. WinForm和WPF中使用字体图标ICON
  20. androidx 换成 support

热门文章

  1. 节操大师 北方大学生程序设计竞赛 南开大学
  2. 7、mybatis中的sql映射文件详解(2)
  3. 2、异步HTTP编程
  4. Java IO: 并发IO
  5. JAVA面试常考系列十
  6. 命令模式的两种不同实现
  7. 《走遍中国》珍藏版(六)
  8. ssh(Spring+Spring mvc+hibernate)——Emp.hbm.xml
  9. java实现动态验证码源代码——绘制验证码的jsp
  10. 谁说表单只能发get和post请求了?