5

我已经搜索并找到了

_suppress_initial: true

但它不适用于 0.54

我想观察一些集合,比如 Orders Collection。

如果我有大量订单并且当添加新订单时,我想使用观察来更新另一个集合。

我没有将观察放入 Meteor.publish 如果我不停止观察会怎样,如果我在服务器运行期间一直观察它会减慢服务器吗?

if Meteor.isServer

    obOrders = Orders.find({}).observe # when server restart does this slow down performance ?

        _suppress_initial: true # doesnt work

        added: (order) ->

            console.log order # still add exist documents

            if Date.now() - order.timestamp < 500
                console.log order # update another one

还是我应该限制 Orders.find {}, limit: 50 并按时间戳排序以观察最新文档?

将观察服务器 Meteor.startup 或 Meteor.publish 这两个条件有什么不同?

如果我把它放到 Meteor.startup 中,这是否意味着我会进行单例观察?

4

1 回答 1

6

现在,observe必须将查询的整个结果永久保存在内存中。因此,如果您调用Orders.observe({}),那么只要观察运行,服务器就会将 Orders 集合的完整副本保存在内存中。这是因为在幕后,observe当检测到潜在变化时,通过将旧查询结果与新查询结果进行比较来工作。这是为了确保结果observe始终 100% 正确,即使由于多个进程同时写入数据库而存在竞争条件。

因此,如果您查询有限数量的文档,例如最近的五个订单,或最近 5 分钟内下的订单,它将显着减少 RAM 使用率(可能还有 CPU 使用率)。但如果您这样做,您将拥有小心确保您不会遗漏任何文件。例如,如果您正在观察最近 5 分钟内插入的文档,但您的服务器关闭了 10 分钟,那么您可能不会收到某些订单的添加消息。或者,如果您正在观察最近的 5 个文档,然后另一个节点一次插入 1000 个文档,您可能只会收到最近 5 个消息的添加消息(因为observe不能保证您会观察每个中间状态,只是您的添加/删除/更改消息最终将使您了解当前状态。

至于你将在哪里开始这样的观察:如果你从服务器上的 Meteor.startup 执行它,它将始终运行,但只会运行一个副本(目前 - 未来 Meteor 将启动多个服务器进程,您将需要更新您的代码。)如果您从发布处理程序执行此操作,那么它将仅在至少有一个订阅时运行(并且仅消耗资源)。最近的 Meteor 版本将删除observe在完全相同的查询上调用的 s,因此如果您有 1000 个对调用 Orders.find({}).observe({ ... }) 的发布处理程序的订阅,它不应该比只有一个时消耗更多的资源。(记住在客户端退订时停止每个观察。)

根据您正在执行的操作,在创建每个订单时安排任务可能比使用added. 例如,您可以有一个createOrder插入订单的方法,并将项目添加到ordersToProcess集合中,然后分别有代码将项目从ordersToProcess集合中拉出并一次处理一个,然后将其删除。createOrder或者,如果不需要太长时间,您可以直接从方法中进行处理。

于 2013-02-02T01:04:02.223 回答