2015-06-12 56 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谢谢,汤姆 –