cursor.observe会降低服务器性能吗?

时间:2013-01-17 10:02:29

标签: meteor

我搜索并找到了

_suppress_initial: true

但它不适用于0.54

我想观察一些像Orders Collection这样的集合。

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

我没有把观察放到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 {},限制:50并按时间戳排序以观察最新文档?

把观察服务器Meteor.startup或Meteor.publish放到那两个条件之间有什么不同?

如果我把它放入Meteor.startup这是否意味着我做单身观察?

1 个答案:

答案 0 :(得分:6)

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

因此,如果您查询有限数量的文档,例如最近的五个订单或最近5分钟内的订单,它将大大减少RAM使用量(以及可能的CPU使用率。)但是如果这样做你必须要小心,确保你不会错过任何文件。例如,如果您正在观察在过去5分钟内插入的文档,但服务器停机了10分钟,那么您可能无法为某些订单添加消息。或者,如果您正在观察最近的5个文档,然后另一个节点一次插入1000个文档,您可能只会收到最近5条消息的添加消息(因为observe并不保证您会观察到每个中间状态,只是你的添加/删除/更改消息最终会使你及时了解当前状态。)

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

根据您正在做的事情,在创建每个订单时安排任务可能更容易,而不是使用added。例如,您可以使用方法createOrder插入订单,并将项目添加到ordersToProcess集合,然后单独使用代码从ordersToProcess集合和流程中提取项目他们一次一个,然后删除它们。或者,如果不需要太长时间,您可以直接从createOrder方法进行处理。