本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
如果您使用 Gremlin 语言变体来查询 Neptune,则驱动程序将使用连接连接到数据库。 WebSocket WebSockets 旨在支持长期存在的客户机-服务器连接方案。 AWS Lambda另一方面,它旨在支持相对短期和无国籍的处决。在使用 Lambda 查询 Neptune 时,这种设计理念的不匹配可能会导致一些意想不到的问题。
AWS Lambda 函数在执行环境中运行,该环境将该函数与其他函数隔离开来。执行上下文是在第一次调用该函数时创建的,并且可以重用于后续调用同一函数。
但是,任何一个执行上下文都不会用于处理函数的多个并发调用。如果您的函数由多个客户端同时调用,Lambda 会为该函数的每个实例启动一个额外的执行上下文。反过来,所有这些新的执行上下文可重用于该函数的后续调用。
在某个时候,Lambda 会回收执行上下文,尤其是在它们已经处于非活动状态一段时间的情况下。 AWS Lambda 通过 Lambda 扩展公开执行上下文生命周期,包括Invoke
和Shutdown
阶段。Init
使用这些扩展,您可以编写在回收执行上下文时清理外部资源(例如数据库连接)的代码。
常见的最佳实践是在 Lambda 处理程序函数之外打开数据库连接,以便每次调用处理程序时都可重用该连接。如果数据库连接在某个时候断开,则可以从处理程序内部重新连接。但是,这种方法存在连接泄露的危险。如果空闲连接在执行上下文被破坏后很长一段时间仍处于打开状态,则间歇性或突发性 Lambda 调用场景可能会逐渐泄漏连接并耗尽数据库资源。
随着更高的引擎版本推出,Neptune 连接限制和连接超时已发生变化。以前,每个实例最多支持 60,000 个 WebSocket连接。现在,每个 Neptune 实例的最大并发 WebSocket 连接数因实例类型而异。
此外,从引擎版本 1.0.3.0 开始,Neptune 将连接的空闲超时从一小时缩短到大约 20 分钟。如果客户端没有关闭连接,则在空闲超时 20 到 25 分钟后,连接会自动关闭。 AWS Lambda 没有记录执行上下文的生命周期,但实验表明,新的 Neptune 连接超时与非活动的 Lambda 执行上下文超时非常吻合。当不活跃的执行上下文被回收时,Neptune 很有可能已经关闭了它的连接,或者很快就会关闭。