如何模拟多个同时播放的慢速Meteor出版物?

时间:2015-06-25 13:49:53

标签: javascript meteor publish-subscribe

我想模拟多个慢速订阅。客户同时订阅两个或两个以上的出版物,结果稍后到达 目标是能够看到网络延迟和随机性如何影响我的应用程序(它是错误的,因为我希望出版物在另一个之前准备就绪,......)。

对出版物使用以下简短设置:

// server/foo.js
Meteor.publish('foo', function() {
  console.log('publishing foo');
  Meteor._sleepForMs(2000);
  console.log('waking up foo');
  this.ready();
});

// server/bar.js is the same with a different name
Meteor.publish('bar', function() {
  console.log('publishing bar');
  Meteor._sleepForMs(2000);
  console.log('waking up bar');
  this.ready();
});

由于this amazing answer中显示的Meteor._sleepForMs,这两种出版物都放慢了速度。

然后客户订阅每个出版物:

Meteor.subscribe('bar'); // /client/bar.js
Meteor.subscribe('foo'); // /client/foo.js

从那里我希望首先看到'publishing'个日志,然后看到两个'waking up'

但是,这会出现在控制台中:

  

15时37分45秒?出版栏
  15时37分47秒?醒来吧   15时37分47秒?出版foo
  15时37分49秒?醒来foo

(我删除了一些无关紧要的绒毛)

所以显然它以同步的方式运行。我认为有两件事可能导致:服务器waitForMs完全阻止服务器(相当奇怪)或客户端订阅设计。

为了确保它不是服务器,我添加了一个简单的心跳:
Meteor.setInterval(function() { console.log('beep'); }, 500);

并没有停止发出哔哔声,因此服务器未被完全阻止。

因此我怀疑问题出在客户端订阅模型中,它可能在调用另一个之前等待订阅准备好了吗?

因此,有两个问题:

  • 为什么我的实验不按照我想要的方式运行?
  • 我应该如何修改它以达到我想要的目标(多个慢速发布)?

3 个答案:

答案 0 :(得分:1)

Meteor按顺序处理DDP消息(包括订阅)。这可以确保您可以执行某些操作,例如删除对象,然后以正确的顺序插回对象,而不会遇到任何错误。

支持使用Meteor.methodsthis.unblock()中解决此问题,以允许处理下一个可用的DDP消息,而无需等待前一个消息完成执行。不幸的是,这不适用于Meteor核心中的Meteor.publish。您可以在此处查看有关此问题的讨论(以及一些解决方法):https://github.com/meteor/meteor/issues/853

还有一个软件包可以将此功能添加到出版物中:

https://github.com/meteorhacks/unblock/

答案 1 :(得分:1)

  

为什么我的实验没有按照我想要的方式运行?

Meteor._sleepForMs阻挡implemented

Meteor._sleepForMs = function (ms) {
  var fiber = Fiber.current;
  setTimeout(function() {
    fiber.run();
  }, ms);
  Fiber.yield();
};

调用它可防止下一行在光纤内执行,直到持续时间过去。但是,由于光纤的工作方式,这不会阻止节点服务器处理其他事件(即执行另一个发布)。

以下是关于流星纤维的讨论:https://www.youtube.com/watch?v=AWJ8LIzQMHY

  

我应该如何修改它以达到我想要的目标(多个慢速出版物)?

尝试使用Meteor.setTimeout异步模拟延迟。

Meteor.publish('foo', function() {
  console.log('publishing foo');

  var self = this;

  Meteor.setTimeout(function () {
    console.log('waking up foo');
    self.ready();
  }, 2000);
});

答案 2 :(得分:0)

我相信这是因为这些出版物正在封锁。

您可以使用meteorhacks:取消阻止以取消阻止发布: https://atmospherejs.com/meteorhacks/unblock

在每个出版物的开头使用this.unblock()可能是个好主意(一旦你添加了meteorhacks:unblock)。