取消正在运行的查询

时间:2016-08-04 21:51:05

标签: node.js mongodb

我有一个应用程序,用户正在对mongo数据库运行地理空间查询。查询可以返回数千个结果(~50k)。然后通过websocket将这些结果流式传输到客户端。但是,用户可以中止结果集中的请求并执行新查询。用户将经常以每分钟几次的顺序启动,中止和重新启动请求。有时他们甚至每隔几秒就取消/重启一次。

问题是,当用户中止请求时,如何取消服务器上的查询,以便它不会继续占用数据流回数千个不需要的结果?我目前正在光标上调用destroy(),但不清楚这实际上是否阻止查询在服务器上执行。

这种情况下的最佳做法是什么?

2 个答案:

答案 0 :(得分:0)

你试过这个吗?

  1. db.currentOp()
  2. db.killOp(IDRETURNEDHE)
  3. 这是一个很好的example

答案 1 :(得分:0)

答案是它取决于你的很多实施细节。

如果您的服务器处于流式传输结果的中间(例如仍然没有发送或排队等待所有内容),当服务器收到某种其他消息时,应该取消之前的结果,那么您可以与其他流进行通信并告诉它停止发送。您将如何做到这完全取决于您的代码,您必须向我们展示您的代码以供我们了解。

有可能数据库查询很久以来就完成了,而且正在发生的事情是服务器正在将结果传输到客户端。因此,如果是这种情况,那么它不是您正在寻找的数据库,它是将响应流式传输到客户端的代码。由于node.js JS是单线程的,因此在服务器上实际运行另一个请求的唯一时间就是当流代码处于某些异步写操作时,等待它完成。您可能必须设置一些与特定用户唯一关联的标志,然后您的流代码必须在每个数据块发送之前检查该标志。如果它看到取消标志,它可以放弃发送剩余的结果。

你可以通过明确地分析你的结果(比如一次500个)并在发送每个块之间检查取消标记来使事情更加可取消。

另一方面,如果所有数据都已被服务器上的TCP层缓冲,那么阻止发送该数据的唯一方法是拆除webSocket并强制客户端重新连接。 / p>