2013-01-17 89 views
5

我已經搜查,發現是否cursor.observe減慢服務器性能?

_suppress_initial: true 

但它不與0.54

我想觀察一些收集像一個訂單採集工作。

如果我有巨大的訂單,並添加新的訂單,我想使用觀察來更新另一個集合。

我沒有把觀察到Meteor.publish如果我不停止觀察,這會減慢服務器如果我在服務器運行過程中始終保持觀察狀態,該怎麼辦?

if Meteor.isServer 

    obOrders = Orders.find({}).observe # when server restart does this slow down performance ? 

     _suppress_initial: true # doesnt work 

     added: (order) -> 

      console.log order # still add exist documents 

      if Date.now() - order.timestamp < 500 
       console.log order # update another one 

或者我應該限制Orders.find {},限制:50並按時間戳排序以觀察最新文檔?

把observeon服務器Meteor.startup或Meteor.publish這兩個條件之間有什麼不同?

如果我把它放入Meteor.startup是否意味着我做單身觀察?

+0

同樣的事情在這裏,不能讓_suppress_initial爲我工作 – matb33

回答

6

現在,observe必須將查詢的全部結果永久保存在內存中。因此,如果你打電話給Orders.observe({}),那麼服務器會在記錄運行的時候保存整個Orders集合的副本。這是因爲在幕後,observe的工作原理是在檢測到潛在更改時將舊查詢結果與新查詢結果進行比較。這是爲了確保observe的結果始終100%正確,即使由於多個進程同時寫入數據庫而導致競爭條件存在。

因此,如果您查詢有限數量的文檔(如最近的五份訂單或最近5分鐘內發出的訂單),它將顯着降低RAM使用率(可能還會佔用CPU)。但是,如果您這你必須小心確保你不會錯過任何文件。例如,如果您觀察的是最近5分鐘內插入的文檔,但服務器關閉了10分鐘,則可能無法爲某些訂單添加消息。或者,如果您觀察5個最新文檔,然後另一個節點一次插入1000個文檔,則您可能只會收到最近5條消息的添加消息(因爲observe不保證您會觀察到每個中間狀態,只是你的添加/刪除/更改消息最終會使你瞭解當前狀態。)

至於你會在哪裏開始這樣一個觀察:如果你從服務器上的Meteor.startup開始,它會一直正在運行,但只會運行一個副本(現在 - 將來,Meteor將啓動多個服務器進程,並且您將需要更新代碼)。如果您從發佈處理程序執行此操作,則它只會運行(並且僅消耗資源),同時至少有一個訂閱。最近的流星發佈版本將刪除在完全相同的查詢上調用的observe,因此如果您有1000個訂閱到調用Orders.find({})。observe({...})的發佈處理程序,它不應該'與僅有一個相比,消耗更多的資源。 (請記得在客戶退訂時停止每次觀察。)

根據您正在做的事情,創建每個訂單時安排任務可能更容易,而不是使用added。例如,您可以使用插入訂單的方法createOrder,並將一個項目添加到ordersToProcess集合,然後單獨擁有從ordersToProcess集合中抽取項目並逐個處理它們的代碼,然後將其刪除。或者,如果不需要太長時間,您可以直接從createOrder方法中直接進行處理。

+1

我認爲自從你寫了你的答案後,很多已經改變。 https://github.com/meteor/meteor/wiki/Oplog-Observe-Driver – HaNdTriX