如何计算meteor出版物的当前订阅数
我在meteor服务器上有一份出版物,我想知道目前有多少客户端订阅了该出版物。原因是,我想向“发布所有者”显示订阅计数 下面是我如何尝试实现这一点的简化代码(当然,我不会使用如何计算meteor出版物的当前订阅数,meteor,Meteor,我在meteor服务器上有一份出版物,我想知道目前有多少客户端订阅了该出版物。原因是,我想向“发布所有者”显示订阅计数 下面是我如何尝试实现这一点的简化代码(当然,我不会使用console.log来增加/减少共享文档) 一般来说,这是可行的,但也存在一些问题: 如果我重新启动服务器,则订阅计数不同步(停止/终止/重新启动服务器时不会触发任何onStop事件) 可能还有其他一些边缘情况会导致订阅计数不同步 我可能可以通过在启动时将计数设置为0来解决其中的一些问题,但也许有更好的方法来查询服务器
console.log
来增加/减少共享文档)
一般来说,这是可行的,但也存在一些问题:
- 如果我重新启动服务器,则订阅计数不同步(停止/终止/重新启动服务器时不会触发任何onStop事件)
- 可能还有其他一些边缘情况会导致订阅计数不同步
我可能可以通过在启动时将计数设置为0来解决其中的一些问题,但也许有更好的方法来查询服务器当前的出版物订阅量?我在文档中没有看到比您的想法更好的方法 下面显示了另一种可能的方法,它迭代这些订阅对象: 你可以把下面的代码放在你的服务器meteor代码中试试
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秒向控制台输出每个“唯一”发布的订阅数。“唯一”发布类似于“Session1234”,其中“Sessions”是集合的名称,“1234”是订阅者传入的id。你可以按照你想要的方式构造它,我只是把每个“唯一”的出版物名称做成一个字符串
这是一个流星垫。但是meteor pad在每个应用程序会话中运行一个单独的服务器,所以如果打开更多选项卡,您将不会看到多个订阅者。但你至少可以了解它的工作原理:
我想如果你只想追踪那本书,你的想法很好。如果您有大量的收藏,并且希望对连接的客户机和事物进行分析,那么上述方法可能很有用。因为它不是官方MeteorAPI的一部分,所以很可能会因meteor版本的更改而中断。该示例使用setInterval只是为了更容易地演示输出,如果使用它,应该只在需要时运行它。这是一个有趣的想法,效果很好。正如您所说,由于它只有一个订阅,我现在将坚持使用我的解决方案(到目前为止,除了在启动时将计数器设置为0之外,没有发现任何其他边缘情况)。我想在扩展到多个服务器成为一个问题之前一切都会好起来…嗨@looshi我现在用你的提示向所有活动订阅者发布数据-阅读更多信息:谢谢,Tom
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);