我搜索并找到了
_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这是否意味着我做单身观察?
答案 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
方法进行处理。