我们正在使用 elastic java rest high client 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 运行速度与许多并行查询一样快时,或者当我们将 elastic 查询到具有数十亿次迭代的 ForEach 时,才会发生此问题。
有策略、想法、代码片段、配置、最佳实践等:WAITING几秒(或几毫秒)并再次尝试执行失败的查询?
最佳答案
对于有同样问题的人......
根据我的测试,似乎只需添加更多 ram 就可以避免超时。
当然要看超时原因;当我弄清楚我的问题时,我发现了三个可能的原因:
- 请求超时:存在一个已报告的关于 java http 客户端的错误,建议将请求连接超时设置为 0(查看我上面的代码)
- 许多并发请求:如果您的应用程序正在执行许多并发请求,则弹性节点可能会开始对查询进行排队,从而产生不必要的超时。这是我的问题,为了解决我更改关于堆内存从 8gb 到 20gb 并将数据节点大小从 32gb 调整到 64gb 的 JVM 配置,我还获得了性能提升添加一个客户端节点并在两个客户端节点之间配置负载平衡器,然后再次从 10k 磁盘转移到 ssd 读取密集型,我获得了更多性能。
- 查询超时:有时只是查询效率低下,可能会发生超时,我的建议是简化查询添加一个包含值的字段来表示更复杂的过滤条件的组合,而不是进行复杂的查询您可以只查询一个索引字段
关于java - 如何正确管理 Elastic Java Rest Client 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48287062/