javascript - 我如何模拟多个同步的慢 meteor 发布?

标签 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();
});

由于 Meteor._sleepForMs,两个发布都变慢了,如 this amazing answer 中所示.

然后客户端订阅每个发布:

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

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

然而,这出现在控制台中:

15:37:45? publishing bar
15:37:47? waking up bar
15:37:47? publishing foo
15:37:49? waking up foo

(我像那天一样去掉了一些无关紧要的绒毛)

很明显它以同步方式运行。我认为有两件事可能导致这种情况:服务器 waitForMs 会完全阻塞服务器(相当奇怪),或者客户端订阅设计。

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

而且它没有停止发出哔哔声,所以服务器没有完全阻塞。

因此我怀疑问题出在客户端订阅模型中,该模型可能会等待订阅准备就绪,然后再调用另一个......?

因此,两个问题:

  • 为什么我的实验没有按照我希望的方式运行?
  • 我应该如何修改它以实现我想要的目标(多个缓慢的发布)?

最佳答案

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

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

还有一个包可以将此功能添加到发布中:

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

关于javascript - 我如何模拟多个同步的慢 meteor 发布?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31052295/

相关文章:

javascript - 获取 css 文件的控制台错误

javascript - meteor react : Render Image from Array Buffer

javascript - Meteor:为模板选择自定义 javascript 和自定义 css

java - N 层发布/订阅者设计问题

javascript - 为什么 $.browser 被弃用 - 什么是更好的替代方案?

javascript - 可拖动到网格的 3D 立方体

publish-subscribe - 带有 MassTransit 的 Localstack 没有收到消息

javascript - Sails.js 简单的私有(private)消息传递(发布/订阅和模型)

Javascript:如何复制对象并保留其原型(prototype)链?

javascript - 流路由器重定向数据插入 Meteor js