我和我的经理讨论过AWS Lambda的使用问题。我想从你们其中一个人那里得到一些帮助。
我对生产级项目使用无服务器架构有点犹豫不决。首先,测试我在本地设置中构建的内容有点耗时。即使我们可以通过单元测试来测试代码,我们也无法消除模拟请求和响应对象的可能性。我在本地设置中无法调用lambda这一事实让我在开发过程中测试Lambda编写的API时感到非常无聊。其次,就目前为止我所知,AWS Lambda没有承诺的SLA可用性和可靠性。这让我有点犹豫,采用Lambda来构建RESTful API。
所以现在我所做的只是使用Lambda来捕获从AWS触发的事件。例如,在用户将其个人资料图片上传到S3存储桶之后执行某些操作,或者在用户通过Cognito注册后执行某些操作。
然而,我的经理期望将我的Node.js API与AWS Lambda混合用于单个项目。从我的角度来看,它完全没有意义。一旦我们在EC2实例上设置了Node API,我认为考虑设置自动扩展或如何利用当前EC2上运行的所有资源会更有效率。但我的经理坚持要我完全设置Node API和Lambda API。例如,服务A和B将由节点API以及AWS Lambdas提供的服务C,D和E提供。
我之前尝试过,但它给我带来了很多困惑。我觉得在构建API时选择Node API或AWS Lambda API会更好,而不是将它们混合在一起。
我不想说我的经理是完全错误的,我是对的。在这种情况下,我想要一个明确的答案。对于这种情况,我真的很感激任何评论和答案。
答案 0 :(得分:2)
好的,让我们一一去。首先是第一件事。您的第一个问题是在本地测试Lambda,完全可以使用SAM。
请查看 - http://docs.aws.amazon.com/lambda/latest/dg/test-sam-local.html
最重要的设计决策,如果您的应用程序是单片的,并且您不想将其重新设计为微服务,那么坚持使用EC2。
接下来介绍您的混合API设计(Lambda和EC2)。我不认为这是一种反模式或坏主意。它完全基于您的要求。假设您在EC2中有一套现有的API(可能是单片),并且您希望将其慢慢迁移到无服务器和微服务。您不需要将它们全部迁移到无服务器。你可以逐个开始。请记住,通过Http进行通信,如果您的服务在EC2和Lambda之间进行了分配,这并不重要。在微服务领域,服务在同一台服务器上或在许多服务器上进行分配并不重要。
通信速度在过去几年中发生了巨大变化,这是微服务出现的主要原因之一。
因此,在坚果壳中,拥有混合API并不完全是基于您的设计架构。如果是单片的,那么就不要去Lambda了。
答案 1 :(得分:2)
只是对以前的答案添加一些想法:
首先,测试我在本地设置中构建的内容有点耗时。即使我们可以通过单元测试来测试代码,我们也无法消除模拟请求和响应对象的可能性。我在本地设置中无法调用lambda这一事实让我在开发过程中测试Lambda编写的API时感到非常无聊
您肯定可以在本地环境中构建,测试和模拟Lambda Invoke,它只是一个新的范例,并且some tools可以帮助您。
其次,就目前为止我所知,AWS Lambda没有承诺的SLA可用性和可靠性。这让我有点犹豫,采用Lambda来构建RESTful API。
AWS Lambda在AWS"计算层"上运行基础设施,所以我相信如果他们在计算层面临问题,那么你的EC2实例肯定也会面临中断。
一旦我们在EC2实例上设置了Node API,我认为考虑设置自动扩展或如何利用当前EC2上运行的所有资源会更有效率
我不这么认为。无服务器堆栈可以轻松扩展,您无需管理基础架构。
我之前尝试过,但它给我带来了很多困惑。我觉得在构建API时选择Node API或AWS Lambda API会更好,而不是将它们混合在一起。
欢迎使用微型和分离式服务!开发服务很容易,但管理整个基础设施很困难。
与管理人员讨论架构时要记住的另一件事:成本
很难争辩,当他们看到以低成本经营业务的可能性时,每个经理的眼睛都会闪耀。使用无服务器堆栈运行服务非常便宜。
底线:
不,按照经理的意愿混合资源并不是一个坏主意。
是的,更容易获得编写api的框架,设置EC2实例和自动缩放组。
是的,在解耦服务时会有很大的提升,但是在生产中运行会付出代价。
答案 2 :(得分:1)
有些情况下,您确实需要同时运行Lambda和EC2实例(例如,Monolith到Microservices迁移项目,NodeJS和Express作为WebServer),这可能是有意义的。
有多种方法可以实现这一目标。使用两种常用方法(用于请求 - 响应)。