2016-08-04 36 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