16

node.jsを介していくつかのsyslogデータをMeteorコレクションにストリーミングしようとしています。正常に動作していますが、Meteorクライアントのポーリングサイクルが約10秒では、私の好みには長すぎます。約1秒にしたいと思います。

コンソールを介したクライアント側のコレクションの挿入は高速で、DDPを使用しているため、すべてのクライアントが即座に更新されます。ただし、サーバー側からの直接のMongoDB挿入は、クライアントのポーリングサイクルの影響を受けます。

したがって、今のところ、ノードデーモンからの更新を挿入するためにDDPを使用することに追いやられているようです。

ddp-clientパッケージの例では、サブスクライブしたメッセージを表示できますが、DDPとnode.jsを介してMeteorコレクションに新しいメッセージを実際に送信してすべてのクライアントを更新する方法がわかりません。一度に...

例やガイダンスはありますか?私はそれを大いに感謝します-ノードとメテオの新参者として、私はすぐに限界に達しています。

4

2 に答える 2

32

さて、私はいくつかのコードを注意深く見て、私が物事を完全に考えすぎていることに気づいた後、それを機能させました。プロトコルは実際には非常に単純で、RPCは非常に単純です。

サーバー側の挿入遅延を完全に回避したことを報告できてうれしいです(手動のMongo挿入はクライアントのポーリング/更新に数秒かかりました)。

DDPを実行すると、Meteorで知り、愛するようになったすべてのリアルタイム(っぽい)の良さが得られます:)

後世のために、そしてうまくいけば他の人々を興味深いユースケースに駆り立てるのを助けるために、ここにセットアップがあります。

使用事例

いくつかのカスタムsyslogデータをnode.jsデーモンにスプールしています。次に、このデーモンはデータを解析してMongoに挿入します。アイデアは、私の最初のMeteor実験のために、リアルタイムのブラウザベースのレポートプロジェクトを考え出すことでした。

すべてうまくいきましたが、Meteorの外部でMongoに挿入していたため、クライアントは約10秒ごとにポーリングする必要がありました。別のSO投稿で、 @ TimDogは、これについてDDPを検討することを提案しましたが、彼の提案は完全に機能したようです。

システムでテストしたところ、node.js非同期アプリケーションを介してすべてのMeteorクライアントを即座に更新できるようになりました。

セットアップ ここでの基本的な考え方は、DDPの「呼び出し」メソッドを使用することです。パラメータのリストを取ります。Meteorサーバー側では、Meteorメソッドをエクスポートしてこれらを使用し、MongoDB挿入を実行します。それは実際には本当に簡単です:

ステップ1:npm install ddp

ステップ2:Meteorサーバーコードに移動し、Meteor.methods内で次のような操作を行います。

Meteor.methods({

'push': function(k,v) { // k,v will be passed in from the DDP client.
    console.log("got a push request")
    var d = {};
    d[k] = parseInt(v);
    Counts.insert(d, function(err,result){ // Now, simply use your Collection object to insert.
        if(!err){ 
            return result
            }else{
            return(err)
            }
        });
     }
  });

これで、クライアントライブラリを使用して、node.jsサーバーからこのリモートメソッドを呼び出すだけで済みます。これは、基本的にexample.js呼び出しからの直接コピーである呼び出し例であり、エクスポートしたばかりの新しい「push」メソッドをフックするために少し調整されています。

ddpclient.call('push', ['hits', '1111'], function(err, result) {
console.log('called function, result: ' + result);
})

このコードを実行すると、Meteorサーバーを介して挿入され、Meteorサーバーが接続されているクライアントを即座に更新します:)

上記の私のコードは完璧ではないと確信しているので、提案をしてください。私はこのエコシステム全体にかなり慣れていないので、ここで学ぶ機会はたくさんあります。しかし、これが一部の人々の時間を少し節約するのに役立つことを願っています。さて、私のテンプレートをこのすべてのリアルタイムデータで輝かせることに焦点を当てることに戻りましょう:)

于 2013-02-01T20:46:29.617 に答える
7

このスクリーンキャストによると、コレクションによって宣言されたmeteor-methodsを呼び出すことが可能です。あなたの場合、コードは次のようになります。

ddpclient.call('/counts/insert', [{hits: 1111}], function(err, result) {
    console.log('called function, result: ' + result);
})
于 2013-09-14T11:00:32.373 に答える