

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在函数中管理 Gremlin WebSocket 连接 Amazon Lambda
<a name="lambda-functions-websocket-connections"></a>

如果您使用 Gremlin 语言变体来查询 Neptune，则驱动程序将使用连接连接到数据库。 WebSocket WebSockets 旨在支持长期存在的客户机-服务器连接方案。 Amazon Lambda另一方面，它旨在支持相对短期和无国籍的处决。在使用 Lambda 查询 Neptune 时，这种设计理念的不匹配可能会导致一些意想不到的问题。

 Amazon Lambda 函数在[执行环境中运行，该环境](https://docs.amazonaws.cn/lambda/latest/dg/runtimes-context.html)将该函数与其他函数隔离开来。执行上下文是在第一次调用该函数时创建的，并且可以重用于后续调用同一函数。

但是，任何一个执行上下文都不会用于处理函数的多个并发调用。如果您的函数由多个客户端同时调用，Lambda 会为该函数的每个实例[启动一个额外的执行上下文](https://docs.amazonaws.cn/lambda/latest/dg/configuration-concurrency.html)。反过来，所有这些新的执行上下文可重用于该函数的后续调用。

在某个时候，Lambda 会回收执行上下文，尤其是在它们已经处于非活动状态一段时间的情况下。 Amazon Lambda 通过 [Lambda](https://docs.amazonaws.cn/lambda/latest/dg/using-extensions.html) 扩展公开执行上下文生命周期，包括`Invoke`和`Shutdown`阶段。`Init`使用这些扩展，您可以编写在回收执行上下文时清理外部资源（例如数据库连接）的代码。

常见的最佳实践是[在 Lambda 处理程序函数之外打开数据库连接](https://docs.amazonaws.cn/lambda/latest/dg/best-practices.html)，以便每次调用处理程序时都可重用该连接。如果数据库连接在某个时候断开，则可以从处理程序内部重新连接。但是，这种方法存在连接泄露的危险。如果空闲连接在执行上下文被破坏后很长一段时间仍处于打开状态，则间歇性或突发性 Lambda 调用场景可能会逐渐泄漏连接并耗尽数据库资源。

随着更高的引擎版本推出，Neptune 连接限制和连接超时已发生变化。以前，每个实例最多支持 60,000 个 WebSocket连接。现在，每个 Neptune 实例的最大并发 WebSocket 连接数[因实例类型而异](https://docs.amazonaws.cn/neptune/latest/userguide/limits.html)。

此外，从引擎版本 1.0.3.0 开始，Neptune 将连接的空闲超时从一小时缩短到大约 20 分钟。如果客户端没有关闭连接，则在空闲超时 20 到 25 分钟后，连接会自动关闭。 Amazon Lambda 没有记录执行上下文的生命周期，但实验表明，新的 Neptune 连接超时与非活动的 Lambda 执行上下文超时非常吻合。当不活跃的执行上下文被回收时，Neptune 很有可能已经关闭了它的连接，或者很快就会关闭。