Elasticsearch:等待长时间运行的请求完成

问题描述 投票:0回答:2

知道何时完成长期运行的Elasticsearch请求的最佳方法是什么?

今天,我有一个流程,定期从AWS托管的ES中清除~100K文档,其中包含总计约60M的文档。

var settings = new ConnectionSettings(new Uri("https://mycompany.es.aws.com"));
settings.RequestTimeout(TimeSpan.FromMinutes(3)); // not sure this helps

var client = new ElasticClient(settings);

var request = new DeleteByQueryRequest("MyIndex") { ... };

// this call will return an IsValid = true, httpstatus = 504 after ~60s,
var response = await client.DeleteByQueryAsync(request);

即使超时设置为3分钟,呼叫始终在〜60秒内返回,响应为空,状态代码为504。虽然通过Kibana,我可以看到删除操作在接下来的几分钟内继续(并正确完成)。

是否有更好的方法来请求和监视(等待完成)长时间运行的ES请求?

UPDATE

根据Simon Lang的回复,我更新了我的代码以使用ES Tasks。最终解决方案看起来像这样......

var settings = new ConnectionSettings(new Uri("https://mycompany.es.aws.com"));
settings.RequestTimeout(TimeSpan.FromMinutes(3)); // not sure this helps

var client = new ElasticClient(settings);

var request = new DeleteByQueryRequest("MyIndex") 
{
  Query = ...,
  WaitForCompletion = false
};

var response = await client.DeleteByQueryAsync(request);

if (response.IsValid)
{
  var taskCompleted = false;
  while (!taskCompleted)
  {
    var taskResponse = await client.GetTaskAsync(response.Task);
    taskCompleted = taskResponse.Completed;

    if (!taskCompleted)
    {
      await Task.Delay(5000);
    }
  }
}
c# amazon-web-services elasticsearch nest
2个回答
0
投票

我同意@LeBigCat的说法,即超时来自AWS并且它不是NEST问题。

但是要解决你的问题:_delete_by_query请求支持wait_for_completion参数。如果将其设置为true,请求将立即返回任务ID。然后,您可以通过任务api请求任务状态。

https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete-by-query.html


0
投票

这不是嵌套弹性问题,嵌套查询中的默认超时为0(无超时)。

你从亚马逊服务器超时(60s默认)

https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/ts-elb-error-message.html

这个链接解释了你需要知道的一切:)

© www.soinside.com 2019 - 2024. All rights reserved.