0

我与我的经理就 AWS Lambda 的使用进行了永无休止的讨论。我想从你们中的一个人那里得到一些帮助。

我有点犹豫是否将无服务器架构用于生产级项目。首先,测试我在本地设置中构建的内容有点耗时。即使我们可以通过单元测试来测试代码,我们也无法消除模拟请求和响应对象失败的可能性。当我在开发过程中测试我的 Lambda 编写的 API 时,我无法在本地设置中调用 lambda 的事实让我非常无聊。其次,据我所知,AWS Lambda 的可用性和可靠性没有任何承诺的 SLA。这让我有点犹豫采用 Lambda 来构建 RESTful API。

所以现在我要做的是仅在捕获从 AWS 触发的事件时使用 Lambda。例如,在用户将他的个人资料图片上传到 S3 存储桶后执行某项操作,或者在用户通过 Cognito 注册后执行某项操作。

但是,我的经理期望将我的 Node.js API 与 AWS Lambda 混合用于一个项目。从我的角度来看,这完全没有意义。一旦我们在 EC2 实例上设置了 Node API,我认为考虑设置自动扩展或如何利用当前 EC2 上运行的所有资源会更有效率。但是我的经理坚持要我同时设置 Node API 和 Lambda API。例如,服务 A 和 B 将由 Node API 提供服务,服务 C、D 和 E 将由 AWS Lambdas 提供服务。

我之前尝试过,但它给我带来了很多困惑。我觉得在构建 API 时最好选择 Node API 或 AWS Lambda API,而不是将它们混合在一起。

我不想说我的经理完全是假的,我是对的。在这种情况下,我只想有一个明确的答案。对于这种情况,我真的很感激任何评论和答案。

4

3 回答 3

2

只是对以前的答案添加一些想法:

首先,测试我在本地设置中构建的内容有点耗时。即使我们可以通过单元测试来测试代码,我们也无法消除模拟请求和响应对象失败的可能性。当我在开发过程中测试我的 Lambda 编写的 API 时,我无法在本地设置中调用 lambda 的事实让我非常无聊

当然,您可以在本地环境中构建、测试和模拟 Lambda 调用,这只是一种新的范例,并且有一些工具可以帮助您。

其次,据我所知,AWS Lambda 的可用性和可靠性没有任何承诺的 SLA。这让我有点犹豫采用 Lambda 来构建 RESTful API。

AWS Lambda 在 AWS“计算层”基础设施上运行,所以我相信如果他们在计算层遇到问题,你的 EC2 实例肯定也会面临中断。

一旦我们在 EC2 实例上设置了 Node API,我认为考虑设置自动扩展或如何利用当前 EC2 上运行的所有资源会更有效率

我不这么认为。无服务器堆栈可轻松扩展,您无需管理基础架构。

我之前尝试过,但它给我带来了很多困惑。我觉得在构建 API 时最好选择 Node API 或 AWS Lambda API,而不是将它们混合在一起。

欢迎使用微解耦服务!开发服务很容易,但管理整个基础设施却很难。

与经理谈论架构时要记住的另一件事:成本

当他们看到以低成本经营业务的可能性时,很难争论并且让每个经理眼睛都亮了。使用无服务器堆栈运行您的服务真的很便宜。

底线:

不,按照经理的要求混合资源并不是一个坏主意。

是的,获取一个框架来编写 API、设置 EC2 实例和自动扩展组更容易。

是的,在解耦服务时有很大的提升,但在生产中运行时会付出代价。

于 2017-09-14T15:34:14.387 回答
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。

于 2017-09-14T12:54:43.430 回答
1

在某些情况下,您确实需要同时运行 Lambda 和 EC2 实例(例如,Monolith 到微服务的迁移项目,NodeJS 与 Express 作为 WebServer),这是有意义的。

有多种方法可以实现这一目标。使用两种常见的方法(对于请求-响应)。

  1. 如果您计划仅从 Lambda 和 NodeJS EC2 实例提供 RESTful API,您可以使用 API Gateway 作为它们的代理。
  2. 如果 NodeJS EC2 实例用作 WebServer 来提供动态页面等,那么您可以使用 AWS CloudFront 作为代理,您仍然需要 API Gateway 来连接 Lambda。

在此处输入图像描述

注意:对于异步工作流程,您可以根据工作流程的性质将 Lambda 与其他 AWS 服务(例如 AWS Step Functions、SQS、SNS)一起使用。

于 2017-09-14T07:37:01.177 回答