2014-12-23 30 views
2

當客戶訂閱發佈時,我知道2個選項:{reactive:true(默認)}和{reactive:false}。是否有可能控制流星的反應?

如果我們使用Meteor,很可能我們想要使用反應性,但有時我不需要更新實時但接近它。我如何設置pub/sub的間隔刷新率?

另一種場景:我假設有300個客戶端訂閱了一個發佈,數據發生了變化,所有的客戶端都同時獲得了DDP更改消息。我可以在每次客戶端更新之間創建某種延遲嗎?我不希望CPU負載過重,用戶注意到應用程序沒有像往常那樣快速響應。

你可能會問自己:爲什麼這個人想要這樣做?當您開始獲得大量客戶端時,由於所有實時更新,應用程序可能會很快變慢。在我的情況下,我不需要實時更新,但有些更接近它。例如:10秒刷新率。

+0

我敢打賭,可以使用觀察者和低級別發佈添加/更改/刪除的消息來排隊幾條消息,並以定期間隔將它們以塊的形式發送。我不知道這是否真的有助於應用程序的可伸縮性,儘管...您仍然最終發送相同數量的消息。 – sbking

+0

就我所知,沒有辦法減慢DDP消息,Meteor使用sock.js作爲DDP。 如果您想減慢UI更新,您可以創建本地集合,並使用計時器將本地集合與服務器集合同步。 –

回答

0

這是一個基本的想法(未經測試,錯誤很抱歉,但你的想法):

var CatsProxy = new Meteor.Collection('CatsProxy') 
 

 
if (Meteor.isServer) { 
 

 
    var Cats = new Meteor.Collection('Cats') // private, on server only 
 

 
    /* ... something causes Cats objects to be updated every half second ... */ 
 

 
    // outside of a reactive context: 
 
    setInterval(function() { 
 
     var cat = Cats.find({_id: 123}) 
 
     CatsProxy.update({_id: cat._id}, cat); 
 
    }, 60000) // once a minute 
 

 
    Meteor.publish("cats", function() { 
 
     return CatsProxy.find({_id: 123}); 
 
    }); 
 
} 
 

 
if (Meteor.isClient) { 
 
    Meteor.subscribe("cats"); 
 

 
    Template.cats.helpers({ 
 
     cat: function() { 
 
      // this is reactive 
 
      return CatsProxy.find({_id: 123}) 
 
     } 
 
    }) 
 
}

而且現在cats模板只更新每分鐘而不是兩次每秒一次。

+0

該解決方案效率非常低。問題是關於以客戶爲基礎而不是以收集爲基礎來推遲更新。每分鐘更新一次mongodb數據庫足以肯定,在您的示例中,CatsProxy不是匿名集合。這是一種自身的DDoS攻擊,你會用無用的DDP呼叫來氾濫服務器。 –

+0

@Mário我同意,但是做起來非常簡單。另請注意,setInterval應該在服務器上運行(更新的答案),並且只有發佈給客戶端的CatsProxy,因此不會有DDP氾濫。最後,如果你能提供更好的答案,那對每個人都會很好,對你有所幫助! – trusktr

+0

至少,我*認爲*不應該有DDP氾濫,因爲在我更新的答案中,我們只發布一隻貓,而客戶端只訪問CatsProxy。如果有* DDP氾濫,那麼這是Meteor的一個安全問題,我認爲他們已經處理了。 – trusktr