【问题标题】:Is possible to control Meteor's Reactivity?可以控制 Meteor 的反应吗?
【发布时间】:2015-02-21 03:38:48
【问题描述】:

当客户端订阅发布时,我知道 2 个选项:{reactive:true (default)} 和 {reactive:false}。

如果我们使用 Meteor,我们很可能想要使用反应性,但有时我不需要实时更新而是接近它。如何为发布/订阅设置间隔刷新率?

另一种情况:假设有 300 个客户端订阅了一个发布,数据发生更改,所有客户端同时收到 DDP 更改消息。我可以在每次客户端更新之间创建某种延迟吗?我不希望 CPU 负载过重,用户注意到应用程序没有像往常一样快速响应。

您可能会问自己:为什么这个人要这样做?当您开始获得大量客户端时,由于所有实时更新,应用程序可能会很快变慢。在我的场景中,我不需要实时更新,但需要一些接近它。示例:10 秒刷新率。

【问题讨论】:

  • 我敢打赌,可以使用观察者和低级发布添加/更改/删除消息来排队多条消息并定期以块的形式发送它们。我不知道这是否真的有助于提高应用程序的可扩展性……您最终仍会发送相同数量的消息。
  • 据我所知,没有办法减慢 DDP 消息的速度,Meteor 使用 sock.js 进行 DDP。如果您想减慢 UI 更新速度,可以创建一个本地集合,并使用计时器将本地集合与服务器集合同步。

标签: meteor publish-subscribe reactive-programming


【解决方案1】:

这是一个基本的想法(未经测试,对错误深表歉意,但你明白了):

var CatsProxy = new Meteor.Collection('CatsProxy')

if (Meteor.isServer) {

    var Cats = new Meteor.Collection('Cats') // private, on server only

    /* ... something causes Cats objects to be updated every half second ... */

    // outside of a reactive context:
    setInterval(function() {
        var cat = Cats.find({_id: 123})
        CatsProxy.update({_id: cat._id}, cat);
    }, 60000) // once a minute

    Meteor.publish("cats", function () {
        return CatsProxy.find({_id: 123});
    });
}

if (Meteor.isClient) {
    Meteor.subscribe("cats");

    Template.cats.helpers({
        cat: function() {
            // this is reactive
            return CatsProxy.find({_id: 123})
        }
    })
}

现在cats 模板每分钟只更新一次,而不是每秒更新两次。

【讨论】:

  • 此解决方案效率极低。问题是基于客户端而不是基于集合延迟更新。每分钟更新一次 mongodb 数据库是肯定的,CatsProxy 在您的示例中不是匿名集合。这是一个自我 DDoS 攻击,你会用无用的 DDP 调用淹没服务器。
  • @Mário 我同意,但它仍然非常简单。另外,请注意 setInterval 应该在服务器上运行(更新答案)并且只有 CatsProxy 发布到客户端,因此不会有 DDP 泛滥。最后,如果你能提供一个更好的答案,那对每个人都有好处!
  • 至少,我认为不应该有 DDP 泛滥,因为在我更新的答案中,我们只发布了一只猫,而客户端只访问 CatsProxy。如果有 DDP 泛滥,那么这是 Meteor 中的一个安全问题,我认为他们已经处理了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-10
  • 1970-01-01
  • 1970-01-01
  • 2022-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多