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 に監視を配置するには、その 2 つの条件の違いは何ですか?

それを Meteor.startup に入れた場合、それはシングルトン観察を行うということですか?

4

1 に答える 1

6

現在、observeクエリの結果全体をメモリに永続的に保持する必要があります。したがって、 を呼び出すとOrders.observe({})、監視が実行されている限り、サーバーは Orders コレクションのコピー全体をメモリに保持します。これはobserve、潜在的な変更が検出されたときに、バックグラウンドで古いクエリ結果を新しいクエリ結果と比較することによって機能するためです。これはobserve、複数のプロセスが同時にデータベースに書き込みを行ったために競合状態が発生した場合でも、 からの結果が常に 100% 正しいことを保証するためです。

したがって、最近の 5 件の注文や過去 5 分間の注文など、限られた数のドキュメントをクエリすると、RAM の使用量 (およびおそらく CPU の使用量) が大幅に削減されます。書類を見逃さないように気をつけてください。たとえば、過去 5 分間に挿入されたドキュメントを監視しているが、サーバーが 10 分間ダウンしている場合、一部の注文について追加メッセージを受信できない可能性があります。または、最新の 5 つのドキュメントを監視していて、別のノードが一度に 1000 個のドキュメントを挿入した場合、最新の 5 つのメッセージの追加メッセージしか受信しない可能性があります (observeすべての中間状態を監視するとは限らないため、追加/削除/変更メッセージにより、最終的に現在の状態が最新になります。

そのような観察を開始する場所については、サーバー上のMeteor.startupから実行すると、常に実行されますが、実行中のコピーは1つだけです(今のところ-将来、Meteorは複数起動しますサーバー プロセスとコードを更新する必要があります。) パブリッシュ ハンドラーから実行する場合は、少なくとも 1 つのサブスクリプションが存在する間のみ実行 (およびリソースの消費のみ) します。最近の Meteor リリースobserveでは、まったく同じクエリで呼び出される s の重複が排除されるため、Orders.find({}).observe({ ... }) を呼び出すパブリッシュ ハンドラーへのサブスクリプションが 1000 ある場合は、そうすべきではありません。 1 つしかない場合よりもはるかに多くのリソースを消費します。(クライアントがサブスクライブを解除するときは、各監視を停止することを忘れないでください。)

作業内容によっては、 を使用するよりも各 Order の作成時にタスクをスケジュールする方が簡単な場合がありますadded。たとえばcreateOrder、注文を挿入し、アイテムをコレクションに追加するメソッドを作成し、コレクションからアイテムを取り出して一度に 1 つずつ処理してから削除するordersToProcessコードを個別に作成することができます。または、時間がかかりすぎない場合はordersToProcess、メソッドから直接処理を行うこともできます。createOrder

于 2013-02-02T01:04:02.223 に答える