Elasticsearch: ожидание долгосрочных запросов для завершения - PullRequest
0 голосов
/ 14 февраля 2019

Как лучше всего знать, когда длительный запрос Elasticsearch завершен?

Сегодня у меня есть процесс, который периодически удаляет ~ 100K документов из размещенной в AWS ES, содержащейвсего ~ 60 млн. документов.

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?

ОБНОВЛЕНИЕ

На основании ответа Саймона Ланга я обновил свой код, чтобы использовать задачи ES.Окончательное решение выглядит примерно так ...

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);
    }
  }
}

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Я согласен с @LeBigCat, что время ожидания исходит от AWS и это не проблема NEST.

Но для решения вашего вопроса: запрос _delete_by_query поддерживает параметр wait_for_completion.Если вы установите значение true, запрос сразу же возвращается с идентификатором задачи.Затем вы можете запросить статус задачи по API-адресу задачи.

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

0 голосов
/ 14 февраля 2019

Это не эластичная проблема с гнездом, время ожидания по умолчанию в запросе на гнездо равно 0 (нет времени ожидания).

Вы получили время ожидания от сервера Amazon (по умолчанию 60 с)

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

Эта ссылка объясняет все, что вам нужно знать:)

...