【问题标题】:Avoid timeout in Elasticsearch re-indexing in Java在 Java 中避免 Elasticsearch 重新索引超时
【发布时间】:2021-04-05 19:05:21
【问题描述】:

当记录数较高时,以下代码在客户端(Elasticsearch 客户端)中返回超时。

CompletableFuture<BulkByScrollResponse> future = new CompletableFuture<>();
client.reindexAsync(request, RequestOptions.DEFAULT, new ActionListener<BulkByScrollResponse>() {
@Override
public void onResponse(BulkByScrollResponse bulkByScrollResponse) {
    future.complete(bulkByScrollResponse);
}

@Override
public void onFailure(Exception e) {
    future.completeExceptionally(e);
}
});
BulkByScrollResponse response = future.get(10, TimeUnit.MINUTES); // client timeout occured before this timeout

下面是客户端配置。

connectTimeout: 60000
socketTimeout: 600000
maxRetryTimeoutMillis: 600000

有没有办法无限期地等待重新索引完成?

【问题讨论】:

  • 超时的 HTTP 代码是什么? 504?
  • 没有。 Caused by: java.net.SocketTimeoutException: 600000 milliseconds timeout on connection http-outgoing-2 [ACTIVE] ... 11 common frames omitted

标签: java elasticsearch timeout reindex resthighlevelclient


【解决方案1】:

我认为无限期地等待完成重新索引过程并为超时设置很高的值并不是一个更好的选择,因为这不是一个适当的解决方法,而且弊大于利。

您应该检查响应,添加更多调试日志以找出根本原因并解决它们。另外请查看my tips to improve re-indexing speed,它应该可以解决您的一些潜在问题。

【讨论】:

  • 感谢您的回答。已经根据重新索引 API 进行了改进(增加超时添加切片)。现在超时是唯一的问题。当记录数非常高时,重新索引会引发超时异常。不时更改超时不是一个好的选择。这就是为什么我需要wait for re-indexing completionretry by increasing timeout on the fly。但我找不到在超时时重试的好参考。
  • @RuchiraGayanRanaweera 是有道理的,但除了重新索引 API 之外,您还可以做很多改进来提高性能,请阅读我的简短提示,让我知道您实现了什么。
  • @RuchiraGayanRanaweera 已经有一段时间了,如果您能发布您的后续问题,或者如果有帮助,请点赞并接受答案,在此先感谢 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多