3

我们正在使用弹性 java rest high 客户端 6.1,但 rest 客户端经常随机返回超时。

我们已经通过这种方式自定义超时:

        client.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback {
        override def customizeRequestConfig(requestConfigBuilder: RequestConfig.Builder): RequestConfig.Builder = {
            requestConfigBuilder
                .setConnectionRequestTimeout(0)
                .setConnectTimeout(parameters.getInt(s"$propertyGroup.timeout.connection"))
                .setSocketTimeout(parameters.getInt(s"$propertyGroup.timeout.socket"))
        }
    }).setMaxRetryTimeoutMillis(parameters.getInt(s"$propertyGroup.timeout.socket"))
        .setFailureListener(new RestClient.FailureListener {
            override def onFailure(host: HttpHost): Unit = {
                val a = 0
            }
        })

在我们的测试中,我们将超时阈值设置为 60000ms、100000ms、180000ms;并且仍然随机获得超时异常。

只有当我们运行 FLINK JOB 以尽可能快地运行许多并行查询时,或者当我们将弹性查询到具有数十亿次迭代的 ForEach 时,才会出现此问题。

有一个策略、想法、代码片段、配置、最佳实践等来: 等待几秒钟(或几毫秒)并再次尝试执行失败的查询?

4

1 回答 1

2

对于谁有同样的问题...

通过我的测试,似乎只需添加更多内存就可以避免超时。

当然这取决于超时的原因;在解决问题时,我发现了三个潜在原因:

  1. 请求超时:存在关于 java http 客户端的报告错误,建议将请求连接超时设置为 0(查看我上面的代码)
  2. 许多并发请求:如果您的应用程序正在执行许多并发请求,那么弹性节点可能会开始对查询进行排队,从而产生不必要的超时。这是我的问题,为了解决我将堆内存从 8gb 更改为 20gb 并将数据节点的大小从 32gb 调整为 64gb 的 JVM 配置,我还获得了性能提升,添加了一个客户端节点并在两个客户端节点之间配置了一个负载均衡器,然后再次从 10k 磁盘到 ssd 读取密集型,我获得了更多性能。
  3. 查询超时:有时只是查询效率低下并且可能发生超时,我的建议是简化查询,添加一个包含值的字段来表示更复杂的过滤条件的组合,因此您可以查询而不是进行复杂的查询只有一个索引字段
于 2018-01-27T20:39:25.917 回答