无服务器:速度降低15%,价格提高8倍

我最近决定在我们的CardGames.io网站上试用API,并尝试无服务器框架。 在过去的几年中,它已成为技术领域的热门话题,我拖延了自己的工作,想保持自己的技术水平与时俱进,并尝试一些新的东西。 因此,我决定花几个小时研究Serverless,看看这种API放置是否有意义。

当前配置


CardGames.io在AWS上运行。 所有的html页面,CSS,JavaScript和图像都存储在S3中。 我们有一个C#API托管在Elastic Beanstalk上,它在运行带有Docker的.NET Core的Linux服务器上运行。 最后,我们在使用S3和API的静态函数之前先使用CloudFront CDN。 以下是2019年8月的EC2分数。 我们还有其他几个实例,但是这些API在具有经典负载平衡的m1.small(是的,t2.small可能工作得更好)上工作。 如果用红色突出显示突出显示的内容,那么每月$ 164.21就算不错了。 我什至包括EBS,因为我不确定如何减少这些费用,因此我们在EC2上有多个项目。


适用于Elastic Beanstalk的AWS账户

我们有两个分别具有1-3个实例的环境:活动和非活动,因为在AWS上的Docker中.NET Core部署需要花费几分钟,因此我们在非活动环境中进行操作,然后将CNAME记录切换到最近部署的环境。 部署缓慢是我想尝试新事物的原因之一。 我们在Beanstalk上有几台带有node.js应用程序的服务器-它们在几秒钟内即可部署。 我希望它与API相同。

切换到无服务器


我使用Serverless框架研究了一个非常好的 ASP.NET Web API托管教程 ,发现您只需要向现有的API项目中添加一个简单的配置文件,一个依赖关系和一个小的启动类。 部署花费了大约20秒的时间-比Beanstalk中要好得多。 我认为这要归功于Lambda(但是只有2.2)对.NET Core的内置支持,而在Beanstalk中,仅当您使用独立的docker时才支持。 无论如何,我很高兴没有考虑自动扩展组,最大实例数之类的问题。

性能测试


在AWS上无服务器的是Lambda,它真正承载您的功能;以及Front Gateway API,它使您可以添加速度限制,API密钥等内容。 我在Beanstalk服务器所在的us-west-2地区托管了Lambda功能。 然后,我配置了CloudFront实例,以将请求从我们的一个游戏路由到新的无服务器配置,将另一个路由到旧的Beanstalk配置。 然后,他对两个URL进行了简单测试:一个URL无服务器,另一个Beanstalk。 两个URL调用相同的API,并将相同的事件存储在数据库中。 我为每个查询运行了100个查询,结果如下:


性能比较

在多次运行中,无服务器配置的速度要慢15% (如果有的话,我是从冰岛运行的,因此非常成功)。 速度令人失望,但仍然很高-我意识到API前面的API网关有一些开销:即使我们不使用它们,功能也太多了。 所以,难过,但不重要!

价钱


老实说,起初我没有考虑价格。 我刚刚决定,为实际使用付费可能比为24/7实例付费更便宜。 因此,它允许新的无服务器安装工作几天,然后开始检查帐户。 糟糕! Lambda + API Gateway的账单已超过一百美元! 最初,我开始修改Lambda设置,为它分配更少的内存以进行保存,但是当我查看正在发生的事情时,很明显问题出在网关上。 以下是API网关费率:


网关API费率

我们的API每天接受大约1000万个请求。 仅每天每个网关大约$ 35。 此外,Lambda每天的费用约为10美元,尽管可以通过分配较少的内存来减少。 两者合计每天约为45美元,或每月1350美元 ,而Elastic Beanstalk则为每月164美元贵八倍 ! 我喜欢新技术和快速部署,但我不会为此每月额外支付1200美元。 回到豆茎!

结论


可能我应该提前熟悉一下价格并进行一些数学计算! 但是,当然,那我将不得不做真正的工作,而不是学习宝贵的技术技能! 我确信在某些情况下,Gateway和Lambda API比Elastic Beanstalk更好。 这不是我们的情况。 也许如果您使用API​​密钥,速度限制和其他API网关功能,则有必要为每百万个请求支付3.50美元。 我们最好在Lambda前面放一个普通的负载平衡器。 据我所知,这是不可能的;通过HTTP访问Lambda需要网关API。

但是,即使我们只是为Lambda付费,如果以每天10美元的价格付款,则每月也只能得到300美元,而不是164美元。 我们有很多查询,但是每个查询做的很少:基本上,每个查询一个数据库调用。 使用更多计算时间的较重查询可能更适合Lambda,在Lambda中,您要花100毫秒的计算时间。 以下是一个请求的报告。 如您所见,我们使用3.50毫秒的计算时间,但是将发票设置为100毫秒,这并不是一个很弱的舍入。


一个请求的Lambda报告

最后,我完全不批评网关,Lambda或无服务器API。 仅表明对于某些工作负载,它们比无聊的旧EC2和Elastic Beanstalk昂贵得多。 关于我们将继续存在。 还有可能是一种更好或更有效的方式来配置系统,我绝不是AWS专家,因此,如果您看到任何明显的错误,请确保在注释中注明。

Source: https://habr.com/ru/post/zh-CN468625/


All Articles