Elasticsearch:等待长 运行 请求完成
Elasticsearch: Waiting for Long Running requests to complete
了解 长 运行 Elasticsearch 请求何时完成的最佳方法是什么?
今天,我有一个过程定期从 AWS 托管的 ES 中清除约 100K 个文档,该 ES 总共包含约 6000 万个文档。
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 分钟,调用也总是 returns 在 ~60 秒内返回空响应和 504 状态代码。通过 Kibana,我可以看到删除操作在接下来的几分钟内继续(并正确完成)。
是否有更好的方法来请求和监控(等待完成)一个长 运行 ES 请求?
更新
根据 Simon Lang 的回复,我更新了我的代码以使用 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);
}
}
}
这不是nest-elastic问题,nest查询默认超时为0(无超时)。
亚马逊服务器超时(默认 60 秒)
https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/ts-elb-error-message.html
这篇link解释了你需要知道的一切:)
我同意@LeBigCat 的观点,超时来自 AWS,这不是 NEST 问题。
但是要解决你的问题:
_delete_by_query
请求支持wait_for_completion
参数。如果将它设置为false
,则请求returns 立即带有一个任务ID。然后您可以通过任务 api.
请求任务状态
https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete-by-query.html
关于@Simon Lang 的回答,_update_by_query api 也是如此。对于那些不熟悉 _tasks api 的人,您可以在 Kibana 中查询您的任务。通过查询更新或删除返回的字符串将采用以下形式:
{
"tasks" : "nodeId:taskId"
}
并且您可以在 Kibana 中使用此命令查看任务的状态:
GET _tasks/nodeId:taskId
了解 长 运行 Elasticsearch 请求何时完成的最佳方法是什么?
今天,我有一个过程定期从 AWS 托管的 ES 中清除约 100K 个文档,该 ES 总共包含约 6000 万个文档。
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 分钟,调用也总是 returns 在 ~60 秒内返回空响应和 504 状态代码。通过 Kibana,我可以看到删除操作在接下来的几分钟内继续(并正确完成)。
是否有更好的方法来请求和监控(等待完成)一个长 运行 ES 请求?
更新
根据 Simon Lang 的回复,我更新了我的代码以使用 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);
}
}
}
这不是nest-elastic问题,nest查询默认超时为0(无超时)。
亚马逊服务器超时(默认 60 秒)
https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/ts-elb-error-message.html
这篇link解释了你需要知道的一切:)
我同意@LeBigCat 的观点,超时来自 AWS,这不是 NEST 问题。
但是要解决你的问题:
_delete_by_query
请求支持wait_for_completion
参数。如果将它设置为false
,则请求returns 立即带有一个任务ID。然后您可以通过任务 api.
https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete-by-query.html
关于@Simon Lang 的回答,_update_by_query api 也是如此。对于那些不熟悉 _tasks api 的人,您可以在 Kibana 中查询您的任务。通过查询更新或删除返回的字符串将采用以下形式:
{
"tasks" : "nodeId:taskId"
}
并且您可以在 Kibana 中使用此命令查看任务的状态:
GET _tasks/nodeId:taskId