_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 {},限制:50并按时间戳排序以观察最新文档?
把观察服务器Meteor.startup或Meteor.publish放到那两个条件之间有什么不同?
如果我把它放入Meteor.startup这是否意味着我做一个单身观察?
现在,observe必须将查询的整个结果永久保存在内存中.因此,如果您调用Orders.observe({}),那么只要观察正在运行,服务器就会将Orders集合的完整副本保留在内存中.这是因为,在幕后,通过在检测到潜在变化时将旧查询结果区分为新查询结果来观察工作.这是为了确保观察结果总是100%正确,即使由于多个进程同时写入数据库而存在竞争条件.因此,如果您查询有限数量的文档,例如最近的五个订单,或者最近5分钟内的订单,它将大大减少RAM的使用(以及可能的CPU使用率.)但是,如果您这样做,您将拥有要小心确保不要错过任何文件.例如,如果您正在观察在过去5分钟内插入的文档,但服务器停机了10分钟,那么您可能无法为某些订单添加消息.或者,如果您正在观察5个最新文档,然后另一个节点一次插入1000个文档,您可能只会收到最近5条消息的添加消息(因为observe不保证您将观察每个中间状态,只是您的添加/删除/更改消息最终将使您了解当前状态.)
至于你在哪里开始这样观察:如果你从服务器上的Meteor.startup进行,它将一直在运行,但只有一个副本正在运行(现在 – 将来Meteor将开始多个服务器进程,您将需要更新您的代码.)如果您从发布处理程序执行它,那么它只会运行(并且只消耗资源),而至少有一个订阅.最近的Meteor版本将重复删除在完全相同的查询上调用的观察,因此如果您对调用Orders.find({}).观察({…})的发布处理程序有1000个订阅,则它不应该比只有一个消耗更多的资源. (记得在客户取消订阅时停止每次观察.)
根据您正在执行的操作,可能更容易在创建每个订单时安排任务,而不是使用添加.例如,您可以使用方法createOrder来插入订单,还可以将一个项添加到ordersToProcess集合中,然后单独使用代码从ordersToProcess集合中提取项目并逐个处理它们然后将其删除.或者你可以直接从createOrder方法进行处理,如果它不需要太长时间.