【问题标题】:Mixing Node.js API with AWS Lambda将 Node.js API 与 AWS Lambda 混合使用
【发布时间】:2018-02-23 01:27:55
【问题描述】:

我与我的经理就 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,而不是将它们混合在一起。

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

【问题讨论】:

  • “在开发过程中测试我的 Lambda 编写的 API 时,我无法在本地设置中调用 lambda,这让我非常无聊。” 为什么不能你呢?有 lambda-local 或真正的 lambda,可以使用 aws-cli 和/或控制台轻松测试。我使用了一个小脚本,它使用 cli 进行压缩/上传/调用,以便在开发期间对实际 Lambda 进行测试。不知道你在说什么,在这里。
  • 完全同意。甚至在我使用lambda-local 之前,这种情况下的 lambda 函数最终仍然是一个 Javascript 函数,可以通过示例事件调用(您可以从示例 lambda 函数中提取)和模拟回调(如果您愿意)。有很多方法可以在本地“调用”一个 lambda,即使没有任何额外的工具。
  • @Michael-sqlbot 我不知道这个工具。谢谢你告诉我!
  • @purdoo 我很清楚 lambda 函数可以在任何环境中进行测试。通常我通过单元测试过程在本地设置中测试我的 lambda。我没有说这是不可能的。

标签: javascript node.js aws-lambda serverless-framework serverless-architecture


【解决方案1】:

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

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

当然,您可以在本地环境中构建、测试和模拟 Lambda 调用,这只是一种新的范例,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】:

好的,让我们一一进行。先说第一件事。您的第一个问题是在本地测试 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。

【讨论】:

  • 感谢您的回答!很高兴知道混合模式不是反模式。我认为问题的出现是因为我们的服务规模目前并没有那么大,但是我们尝试构建微服务以具有可扩展的可维护性以供未来使用。无论如何,我真的很感谢你的回答!
【解决方案3】:

在某些情况下,您确实需要同时运行 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)一起使用。

【讨论】:

    猜你喜欢
    • 2018-02-16
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    相关资源
    最近更新 更多