将高性能Web服务从AWS EC2上的Nginx转换为AWS Lambda

Jup*_*ese 3 nginx amazon-ec2 amazon-web-services aws-lambda

在我正在开发的项目上,AWS上实现了许多Web服务.相对简单的服务(DynamoDB插入或查找)并且相对不频繁使用的服务已经实现为Lambdas,这对于任务来说是完美的.还有一个更复杂的Web服务,它执行大量字符串处理和正则表达式匹配,需要高性能,已经在C++(大约5K LOC)中实现为Nginx模块,并且可以处理20K请求/在EC2实例上运行(该服务只接受一个小的JSON有效负载,对S3中的静态数据文件中的某些参考数据执行大量字符串处理和正则表达式匹配,并返回大小不超过1KB的JSON响应)

管理层推动统一我们对AWS服务的使用,并将所有Web服务实现为Lambdas.

我的问题是:一个高性能的Web服务,例如在EC2上运行的C/C++ nginx编译模块,可以连续运行并处理20K到100K req/s,实际上可以转换为AWS Lambda(在Python中)并且预计会有相同的性能还是更好地保留在EC2上?如果转换为Lambda,需要注意哪些性能注意事项?

Jac*_*ert 7

兰布达能做到吗?是.Lambda应该这样做吗?没有.

为什么?成本.

首先,假设您确实处理20k Requests / Second了一整天的每一秒.那将在那一天相当于1.728亿请求.在免费套餐中,您可以免费获得100万个请求,因此将可计费请求降至1.727亿.Lambda收费$0.20 / Million Requests,所以:

1.728 Billion requests * $0.20 / Million requests = $345.40
Run Code Online (Sandbox Code Playgroud)

我很确定您的EC2成本低于每天.以m4.16xlarge实例为例,通过按需定价,我们得到:

$3.20 / Hour * 24 Hours = $76.80
Run Code Online (Sandbox Code Playgroud)

看到不同?但是,Lambda还计算了计算时间!

假设您c++在Lambda函数中包含可执行文件(从Python或调用Node,因此我们不会考虑从c++解释语言开始的性能100 Millisecond损失.由于Lambda以块为单位收费,因此对于此估计,我们将假设所有请求在内完成100 Milliseconds.

假设您使用最小的内存大小128 MB.这将使你3.2 Million Seconds在免费等级内,或者32 Million Requests给予他们全部100 Milliseconds免费.但这仍然让你1.696 Billion Requests无法收费.128 MB尺寸的成本是$0.000000208 / 100 Milliseconds.鉴于每个请求都完成100 Milliseconds,执行时间的成本将是:

$0.000000208 / 100 Milliseconds * 1.696 Billion 100 Millisecond Units = $352.77
Run Code Online (Sandbox Code Playgroud)

将该成本添加到请求的成本中,您将获得:

 $345.40 + $352.77 = $707.17
Run Code Online (Sandbox Code Playgroud)

EC2: $76.80
Lambda:$707.17

请注意,这只是使用您提供的20k请求/秒数,而且是一天.如果请求的实际数量不同,请求的时间超过100毫秒,或者您需要的内存超过128 MB,则成本估算会相应地上升或下降.

Lambda有它的位置,但EC2也有.仅仅因为你可以把它放在Lambda上并不意味着你应该这样做.