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

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

故障排除 java.util.concurrent.TimeoutException

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

注意

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

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

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

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

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

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

    maxParallelQueries = maxConnectionPoolSize * Max( maxSimultaneousUsagePerConnection, maxInProcessPerConnection )

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

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

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

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