排查 java.util.concurrent.TimeoutException 问题 - Amazon Neptune
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

排查 java.util.concurrent.TimeoutException 问题

如果 Gremlin 请求在等待其中一个 WebSocket 连接中的插槽变为可用时在客户端本身上发生超时,Gremlin Java 客户端会引发 java.util.concurrent.TimeoutException。此超时持续时间由 maxWaitForConnection 客户端可配置参数控制。

注意

由于在客户端上超时的请求从不会发送到服务器,因此它们不会反映在服务器上捕获的任何指标中,例如 GremlinRequestsPerSec

这种超时通常通过以下两种方式之一引起:

  • 服务器实际上已达到最大容量。如果是这样的话,服务器上的队列就会填满,您可以通过监控 CloudWatch 指标 MainRequestQueuePendingRequests 来检测到这一点。服务器可以处理的并行查询数量取决于其实例大小。

    如果 MainRequestQueuePendingRequests 指标未显示服务器上积累了待处理的请求,则服务器可以处理更多请求,而超时是由客户端节流造成的。

  • 客户端节流请求。通常可以通过更改客户端配置设置来解决这个问题。

    可通过以下方式粗略估计客户端可以发送的最大并行请求数:

    maxParallelQueries = maxConnectionPoolSize * Max( maxSimultaneousUsagePerConnection, maxInProcessPerConnection )

    向客户端发送的查询超过 maxParallelQueries 会导致 java.util.concurrent.TimeoutException 异常。您可以通过多种方式解决这个问题:

    • 增加连接超时时间。如果延迟对您的应用程序不重要,请增加客户端的 maxWaitForConnection 设置。然后,客户端会等待更长的时间才会超时,这反过来又会增加延迟。

    • 增加每个连接的最大请求数。这允许使用相同的 WebSocket 连接发送更多请求。通过增加客户端的 maxSimultaneousUsagePerConnectionmaxInProcessPerConnection 设置来实现此目的。这些设置通常应具有相同的值。

    • 增加连接池中的连接数。通过增加客户端的 maxConnectionPoolSize 设置来实现此目的。代价是资源消耗增加,因为每个连接都使用内存和操作系统文件描述符,并且在初始化期间需要 SSL 和 WebSocket 握手。