【问题标题】:How to count the current number of subscriptions to a meteor publication如何计算当前订阅流星出版物的数量
【发布时间】:2015-06-13 08:56:04
【问题描述】:

我在流星服务器上有一个出版物,我想知道目前有多少客户订阅了该出版物。这样做的原因是,我想向“出版物所有者”显示订阅计数。

这是我如何尝试实现这一目标的简化代码片段(当然,我不会执行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-Events)
  • 可能还有其他一些边缘情况会导致订阅计数不同步

我可能可以通过在启动时将计数设置为 0 来解决其中的一些问题,但也许有更好的方法来查询服务器以获取当前对出版物的订阅量?

【问题讨论】:

    标签: meteor


    【解决方案1】:

    我在文档中没有看到任何比你的想法更好的方法。

    下面显示了另一种可能的方法,它遍历这些订阅对象: 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”,其中“Sessions”是集合的名称,“1234”是订阅者传入的 id。你可以根据自己的喜好来组织它,我只是将每个“唯一”的出版物名称都变成了一个字符串。

    FWIW 这是一个流星垫。但是流星垫每个应用程序会话运行一个单独的服务器,因此如果您打开更多选项卡,您将不会看到多个订阅者。但你至少可以了解它是如何工作的: http://meteorpad.com/pad/tYr4SE73QJA8ciw6p/Count%20Subscribers

    我认为,如果您只想跟踪该出版物,那么您的想法非常好。如果您有大量的集合,并且想要对连接的客户端和事物进行一些分析,那么上述方法可能很有用。因为它不是官方流星 API 的一部分,可能容易在流星版本更改时中断。该示例使用 setInterval 只是为了更容易地说明输出,如果使用,则应仅在需要时运行。

    【讨论】:

    • 这是一个有趣的想法,效果很好。正如您所说,因为它只有一个订阅,所以我现在将坚持我的解决方案(除了在启动时将计数器设置为 0 之外,到目前为止没有发现任何其他边缘情况)。我想在扩展到多个服务器成为问题之前会很好......
    • 嗨 @looshi 我现在使用你的提示向所有活跃订阅者发布数据 - 阅读更多内容:stackoverflow.com/questions/31180799/… 谢谢,汤姆
    猜你喜欢
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 2017-01-01
    • 2023-01-26
    • 2019-08-19
    • 2013-08-21
    相关资源
    最近更新 更多