

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

# 管理容器化环境中的连接池和生命周期
<a name="best-practices-ecs-eks-connections"></a>

在容器（Kubernetes 中的 pod）频繁启动、停止和扩展的容器化环境中，有效管理与 Neptune 的连接至关重要。Neptune 强制执行多个 WebSocket 连接限制：
+ 每种实例类型都有最大并发[WebSocket 连接](https://docs.aws.amazon.com/neptune/latest/userguide/limits.html#limits-websockets)数
+ 闲置连接将在闲置 20—25 分钟后关闭
+ 使用 IAM 身份验证，无论活动如何，连接都会在 10 天后强制关闭（参见[WebSocket 连接](https://docs.aws.amazon.com/neptune/latest/userguide/limits.html#limits-websockets)限制）

某些驱动程序支持定期保持活动状态的心跳，以防止空闲断开连接。例如，Gremlin Java 驱动程序会定期`keepAliveInterval`向服务器发送 ping 命令。请查阅特定驱动程序的配置选项，以确定哪些保持活动状态设置可用，以及它们如何与 Neptune 的空闲超时交互。

了解这些限制可以帮助你设计出适用于滚动部署、自动扩展和容器回收等容器编排模式的连接处理。有关使用 Java Gremlin 驱动程序进行连接管理的一般指南，请参阅[关闭客户端以避免连接限制](best-practices-gremlin-java-close-connections.md)和。[在失效转移后创建新连接](best-practices-gremlin-java-new-connection.md)

**容器关闭时关闭连接**

通过添加一个`SIGTERM`处理程序来实现优雅的关闭，该处理程序可在容器退出之前关闭您的图形客户端。例如，调用 Gremlin Java `cluster.close()`、G `driverRemoteConnection.close()` o 或 Python 中的 Gremlin，或者为 Neo4j 驱动程序调用 Bolt' `driver.close()` s。在 Kubernetes 中，在发送连接之前`SIGTERM`，尤其是在滚动更新期间，使用`preStop`钩子来耗尽连接。

**注意**  
Docker 和 Amazon ECS 只能`SIGTERM`向集装箱中的 PID 1 配送。使用 Dockerfile 中的 exec 表单（例如，`ENTRYPOINT ["java", "-jar", "app.jar"]`不是`ENTRYPOINT java -jar app.jar`）或诸如此类的初始化进程，`tini`以确保您的应用程序收到信号。

**每个容器使用一个客户端实例**

在同一个容器中创建多个 Gremlin `DriverRemoteConnection` 或 Bolt `neo4j.Driver` 实例会使连接使用量成倍增加。在容器中的所有线程之间共享一个客户端实例。客户端对象是线程安全的。

**相对于您的队列调整连接池的大小**

设置`maxConnectionPoolSize`为所有容器之间的总连接数不超过 Neptune 实例的连接限制。例如，如果您运行 20 个容器，每个容器有 8 个线程，请计算每个容器的池大小，使 20 倍的池大小保持在[您的实例类型的实例限制](https://docs.aws.amazon.com/neptune/latest/userguide/limits.html#limits-websockets)范围内。有关配置连接池大小的更多信息，请参阅[将 `maxInProcessPerConnection` 和 `maxSimultaneousUsagePerConnection` 设置为相同值](best-practices-gremlin-java-maxes.md)。

**设置连接等待超时**

在 Java Gremlin 驱动程序中，`maxWaitForConnection`将配置为合理的值，例如 5—10 秒。默认值通常是无限或很长，这会导致线程在池耗尽时挂起，而不是因为明显的错误而快速失败。并非所有语言驱动程序都支持此设置，请查看驱动程序文档以了解等效的配置选项。