2015-06-12 91 views
2

我有一個關於流星服務器的發佈,我想知道當前有多少客戶訂閱了該發佈。原因是,我想向「出版物所有者」顯示訂閱次數。如何計算流星發佈訂閱的當前數量

下面是一個簡單的代碼剪斷的我如何努力實現這一目標(當然,而不是做一個console.log我會遞增/遞減的共享文檔)

Meteor.publish('sessionForId', function (sessionId) { 
    console.log('increment subscription count for ' + sessionId); 

    this.onStop(function(){ 
    console.log('decrement subscription count for ' + sessionId); 
    }); 

    return Sessions.find({_id: sessionId}); 
}); 

一般來說這個工作,但也有一些問題:

  • 如果我重新啓動服務器,訂閱數是同步的(沒有的onStop事件被觸發停止/殺人/重新啓動服務器時)
  • 可能有一些其他電子DGE情況下,可以得到的認購數不同步

我大概可以解決其中的一些被IE啓動時的計數設置爲0,但也許有更好的方式來查詢當前的量的服務器訂閱出版物?

回答

2

我沒有看到文檔中的任何內容如何做得比您的想法更好。

有它迭代這些認購對象的下面所示的另一個可能的方法: https://github.com/meteor/meteor/blob/devel/packages/ddp-server/livedata_server.js#L241

您可以通過將下面的代碼在你的服務器的流星代碼嘗試。

Meteor.setInterval(function(){ 
     var output = {}; 

     var connections = Meteor.server.stream_server.open_sockets; 
     _.each(connections,function(connection){ 
      // named subscriptions 
      var subs = connection._meteorSession._namedSubs; 
      for(var sub in subs){ 
      var mySubName = subs[sub]._name; 

      if(subs[sub]._params.length>0){ 
       mySubName += subs[sub]._params[0]; // assume one id parameter for now 
      } 

      if(!output[mySubName]){ 
       output[mySubName] = 1; 
      }else{ 
       output[mySubName] += 1; 
      } 
      } 
      // there are also these 'universal subscriptions' 
      //not sure what these are, i count none in my tests 
      var usubs = connection._meteorSession._universalSubs; 


     }); 

     console.log(output); 

     },2000); 

這將輸出到控制檯每每2秒「獨特的」發佈預訂的數量。 「唯一」出版物看起來像「Sessions1234」,其中「會話」是集合的名稱,「1234」是用戶傳入的ID。不管你想要什麼,你都可以構造這個結構,我只是將每個'唯一'的發佈名稱制作成字符串。

FWIW這是一個流星墊。但是每個應用程序會話中流星墊運行一個單獨的服務器,因此如果打開更多選項卡,則不會看到多個訂閱者。但你至少可以瞭解它是如何工作的: http://meteorpad.com/pad/tYr4SE73QJA8ciw6p/Count%20Subscribers

我想如果你只是想跟蹤那一個出版物,你的想法是相當不錯的。如果你有大量的收藏並想要關於連接的客戶端和事物的一些分析,也許上述方法是有用的。因爲它不是官方流星API的一部分,可能很容易打破流星版本的變化。該示例使用setInterval僅僅是爲了更容易地說明輸出,只應在需要時才運行。

+0

這是一個有趣的想法,很好地工作。正如你所說,因爲它只有一個訂閱我現在堅持我的解決方案(迄今沒有發現任何更多的邊緣情況,除了在啓動時將計數器設置爲0)。我想這將是很好,直到縮放到多個服務器成爲一個問題... – laberning

+0

嗨@looshi我現在使用您的提示發佈數據到所有活動訂戶 - 閱讀更多在:http://stackoverflow.com/questions/31180799/meteor-get-all-subscriber-session-handles-a-publisher-method/31221575#31221575謝謝,湯姆 –