我正在研究NodeJS项目,并且似乎使用了非常常见的AWS设置。我的ApiGateway收到呼叫,触发lambda A,然后根据从ApiGateway传递的参数,此lambda A触发其他lambda,例如B或C。
Lambda A需要访问MongoDB,为避免自己亲自运行MongoDB带来麻烦,我决定使用mLab。 ATM Lambda A正在使用NodeJS驱动程序访问MongoDB。 现在,不再开始与每个Lambda A执行连接,我还是在Lambda A代码内部使用连接池,在处理程序之外,我保留了连接池,允许我多次调用Lambda A时重用连接。 这似乎很好。 但是,当Lambda A调用Lambda B并且Lambda B需要访问mLab的MongoDB数据库时,我不确定如何处理连接。
我倾向于选择2,但是在mLab's Data API上明确指出要避免使用REST api,除非无法直接使用MongoDB驱动程序进行连接:
第一种方法-我们强烈建议在可能的情况下使用 增强的性能和功能-使用以下一种方式进行连接 可用的MongoDB驱动程序。如果您使用,则无需使用我们的API 司机。本文记录的第二种方法是 通过mLab的RESTful Data API连接。仅在以下情况下使用此方法 无法使用MongoDB驱动程序进行连接。
鉴于所有这些,如何最好地解决呢? 1或2,还是我应该考虑的其他选择?
答案 0 :(得分:1)
不幸的是,您将无法在Lambda上“共享” mongo连接,因为最终将有一个“物理”套接字连接到该实例。
我认为您的两种解决方案都取决于使用情况。
如果您倾向于在一小时内在Lambda A和Lambda B上保持稳定的平均并发性(这是AWS保持Lambda实例存活多长时间的经验法则),那么请让他们两个都拥有自己的静态连接是一个很好的解决方案。这是因为请求很可能到达已启动并已连接的lambda。我还猜想,“香草”蒙哥的节点驱动程序比RESTFul Data API的成熟。
但是,如果负载过大或负载不均匀,则可以使用RESTFul Data API。这是因为您将把管理实例的打开连接数的责任集中到一个点上,这在这种情况下意味着您不太可能打开不需要的连接,或者使用所有当前容量并拥有等待建立新的连接。
最终,这是一个概率负载平衡的游戏-您可以将所有连接“合并”到一个中央位置(数据API),并且不受单个功能的使用的影响较小,但会增加单个操作的延迟,或您在功能级别上合并,但是在并发不均的情况下更容易冷启动连接。