我将搜索查询的超时设置为 10 毫秒,因此我希望 elasticsearch 搜索查询应在 10 毫秒内超时。
在响应中,我确实得到了"timed_out":true
但查询似乎没有超时。它仍然运行几百毫秒。
示例响应:
{
"took": 460,
"timed_out": true,
....
这是预期的行为还是我在这里错过了什么?我的目标是在查询花费太长时间时终止查询,以免对群集造成负载。
查询timeout
会发生什么?
使用timeout
set 运行的 Elasticsearch 查询可能会返回部分或空结果(如果超时已过期),来自 Elasticsearch 指南:
超时参数告诉分片允许它们多长时间 在向协调节点返回响应之前处理数据。如果 没有足够的时间来处理所有数据,此分片的结果 将是部分的,甚至可能是空的。
请求正文搜索参数的文档也说明了这一点:
超时
搜索超时,限制要在其中执行的搜索请求 指定的时间值和保释金,累计命中数达到该值 过期时的点。默认为无超时。
有关更多详细信息,请参阅指南中的此页面。
如何终止运行时间过长的查询?
看起来Elasticsearch没有最终的答案,而是针对特定情况的几种解决方法。他们来了。
没有办法保护系统免受DoS攻击(截至2015年)。可以使用timeout
或terminate_after
查询参数来限制长时间运行的查询。terminate_after
就像timeout
,但它计算每个分片的文档数量。这两个参数更像是对 Elasticsearch 的建议,这意味着一些长时间运行的查询仍然可以通过所需的最大执行时间(例如script
查询)。
从那时起,引入了任务管理 API,并且可以监视和取消长时间运行的任务。这意味着您必须编写一些额外的代码来检查集群的运行状况并取消任务。