2016-08-04 66 views
0

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

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

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

回答

0

你试过吗?

  1. db.currentOp()
  2. db.killOp(IDRETURNEDHE)

这是一个很好的example

0

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

如果您的服务器处于流式处理结果的中间(例如仍未发送或排队的所有内容),则当服务器收到某种其他消息时应取消先前的结果,则可以进行通信与其他流,并告诉它停止发送。如何完全取决于您的代码,您将不得不向我们展示您的代码以供我们了解。

很可能数据库查询很长时间以来就已经完成,发生了什么事是服务器正在将结果流式传输到客户端。所以,如果是这样的话,那么它不是你正在寻找的数据库,它是将响应传递给客户端的代码。由于node.js JS是单线程的,只有当另一个请求实际上在服务器上运行时,流媒体代码才会进行一些异步写操作,等待完成。您可能必须设置一些与特定用户唯一关联的标志,然后在发送每个数据块之前,您的流代码必须检查该标志。如果看到取消标志,它可能会放弃发送其他结果。

通过显式分块处理结果(每次500个)并检查发送每个块之间的取消标志,可以使事情更容易取消。

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

+0

已经有代码取消通过websocket向客户端发送结果(与您的建议非常相似)。我的问题特别针对在MongoDB层取消查询执行(以及后续的客户端流式传输)。 – herbrandson

+0

@herbrandson - 然后向我们展示您正在讨论的特定数据库代码以及控制何时运行的排序代码。有关代码的问题需要包含相关的代码。 – jfriend00