Node.js 从AWS Lambda连接到MongoDB

Node.js 从AWS Lambda连接到MongoDB,node.js,mongodb,aws-lambda,mlab,Node.js,Mongodb,Aws Lambda,Mlab,我正在从事一个NodeJS项目,并且似乎使用了非常常见的AWS设置。我的ApiGateway接收调用,触发lambda,然后这个lambda触发其他lambda,比如B或C,这取决于从ApiGateway传递的参数 Lambda A需要访问MongoDB,为了避免自己运行MongoDB的麻烦,我决定使用mLab。ATM Lambda A正在使用NodeJS驱动程序访问MongoDB。 现在,为了避免每次Lambda执行都启动连接,我使用连接池,同样,在Lambda代码内部,在处理程序外部,我保留

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

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

  • 是否有可能以某种方式通过连接池,或者Lambda B必须保留自己的连接池
  • 我正在考虑使用它来公开MongoDB驱动程序的大部分操作,因此我可以使用HTTP调用(例如GET和POST)来对数据库运行命令。它看起来和它看起来很像
  • 我倾向于选项2,但其中明确指出,除非无法直接使用MongoDB驱动程序连接,否则应避免使用REST api:


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



    考虑到所有这些情况,最好的做法是什么?1或2,或者我还有其他的选择吗? 不幸的是,您将无法跨lambdas“共享”mongo连接,因为该连接最终会有一个特定于该实例的“物理”套接字

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

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

    但是,如果您得到了尖峰或不均匀的负载,那么您可能会使用RESTFul数据API。这是因为您将集中管理到单个点的实例的已打开连接数的责任,这意味着您不太可能打开不必要的连接,或者使用所有当前容量并等待建立新连接


    最终,这是一个概率负载平衡的游戏——要么将所有连接“集中”在一个中心位置(数据API),要么减少单个函数使用的影响,而牺牲单个操作的更大延迟,或者您在功能级别共享,但更容易在非均匀并发情况下冷启动打开连接。

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

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

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

    但是,如果您得到了尖峰或不均匀的负载,那么您可能会使用RESTFul数据API。这是因为您将集中管理到单个点的实例的已打开连接数的责任,这意味着您不太可能打开不必要的连接,或者使用所有当前容量并等待建立新连接

    最终,这是一个概率负载平衡的游戏——要么将所有连接“集中”在一个中心位置(数据API),要么减少单个函数使用的影响,而牺牲单个操作的更大延迟,或者您在功能级别共享,但更容易在非均匀并发下打开连接