【问题标题】:Connecting from AWS Lambda to MongoDB从 AWS Lambda 连接到 MongoDB
【发布时间】:2019-03-14 21:47:05
【问题描述】:

我正在开发一个 NodeJS 项目,并且似乎使用了非常常见的 AWS 设置。我的 ApiGateway 收到调用,触发 lambda A,然后这个 lambda A 触发其他 lambda,比如 B 或 C,具体取决于从 ApiGateway 传递的参数。

Lambda A 需要访问 MongoDB,为了避免自己运行 MongoDB 的麻烦,我决定使用 mLab。 ATM Lambda A 正在使用 NodeJS 驱动程序访问 MongoDB。 现在,不要与我使用连接池的每个 Lambda A 执行开始连接,再次,在 Lambda A 代码内部,在处理程序之外,我保留连接池,允许我在多次调用 Lambda A 时重用连接。 这似乎工作正常。 但是,当 Lambda A 调用 Lambda B 并且 Lambda B 需要访问 mLab 的 MongoDB 数据库时,我不确定如何处理连接。

  1. 是否可以通过某种方式传递连接池,否则 Lambda B 必须保留自己的连接池?
  2. 我正在考虑使用mLab's Data API,它公开了 MongoDB 驱动程序的大部分操作,因此我可以使用 HTTP 调用,例如GET 和 POST 对数据库运行命令。它似乎类似于RESTHeart

我倾向于选项 2,但在 mLab's Data API 上,它明确指出要避免使用 REST api,除非无法直接使用 MongoDB 驱动程序连接:


第一种方法——我们尽可能强烈推荐 增加的性能和功能 - 是使用其中一种连接 可用的 MongoDB 驱动程序。如果您使用,则不需要使用我们的 API 司机。本文中记录的第二种方法是 通过 mLab 的 RESTful Data API 进行连接。仅当您使用此方法 无法使用 MongoDB 驱动程序连接。


考虑到这一切,最好的方法是什么? 1或2还是我应该考虑的其他选择?

【问题讨论】:

    标签: node.js mongodb aws-lambda mlab


    【解决方案1】:

    不幸的是,您将无法在 lambda 之间“共享”一个 mongo 连接,因为最终存在一个特定于该实例的连接的“物理”套接字。

    我认为您的两种解决方案都很好,具体取决于使用情况。

    如果您在一小时内倾向于在 lambda A 和 B 上保持稳定的平均并发(这是关于 AWS 保持 lambda 实例存活多长时间的经验法则),那么让它们都拥有自己的静态连接是一个很好的解决方案。这是因为请求有可能到达已经启动并连接的 lambda。我还猜想'vanilla' mongo 的节点驱动程序比 RESTFul Data API 的节点驱动程序更成熟。

    但是,如果您遇到峰值或不均匀的负载,则可以使用 RESTFul 数据 API。这是因为您将把管理与您的实例的打开连接数量的责任集中到一个点上,这意味着在这些情况下,您不太可能打开不需要的连接,或者使用所有当前容量并拥有等待建立新的连接。

    归根结底,这是一场概率负载平衡游戏 - 要么将所有连接“汇集”在一个中心位置(数据 API),要么减少使用单个函数的影响,但代价是单个操作的延迟更大,或者您在函数级别进行池化,但更容易在不均匀的并发下冷启动打开连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-14
      • 2019-03-08
      • 2020-02-27
      • 1970-01-01
      • 2018-07-23
      • 2019-08-01
      • 2021-06-10
      • 2019-11-08
      相关资源
      最近更新 更多