2017-02-24 10 views
6

node.jsをtcpサーバーとして使用すると、比較的多数のGPSデバイス(〜3000デバイス)を管理し、受信データをデータベースに格納するための最初のステップとしてこのフェーズでも、私は気になるパフォーマンス上の問題を考えています。彼らが私を噛む前に、私はそれらをキャッチしたいと思います。Node.js GPSデバイスのトラッキングパフォーマンスの考慮点

1 - 私は、次のようないくつかのコードを参照してくださいのjavaまたはルビーのような言語を使って書かれた同様のサーバを見て:

javaの

Thread serverThread = new Thread(() -> { 
    System.out.println("Listening to server port 9000"); 
    while (true) { 
    try { 
     Socket socket = serverSocket.accept(); 
    ... 

ルビー

require 'socket' 
    server = TCPServer.new ("127.0.0.1",8080) 
    loop do 
    Thread.start(server.accept) do |client| 
    ... 

これは、TCPサーバに接続するすべてのデバイス(ソケット)に別のスレッドを与えるようですか? node.jsはシングルスレッドであり、非同期的に動作するため、次の単純なアプローチのような着信接続が多数の同時接続を満足するかどうか心配すべきですか?

net.createServer(function(device) { 
    device.on('data', function(data) { 
    // parse data 
    // store in database 
    }); 
}); 

2 - 接続プールを使用してデータベース接続を制限する必要がありますか?データベースとしてGISと監視のためのもう一方の側からの問い合わせとして、プールのサイズはどのくらいあるべきですか?

3 - このようなシステムでキャッシュを有効にするにはどうすればよいですか?

誰かがこの考えに少しの光を当てたらすばらしいはずです。私はまた、このようなシステムを実装する際に経験しているか、または認識しているかもしれない他のパフォーマンスの考えを聞きたいと思います。ありがとう。

+0

完全な質問ですが、なぜ定期的なhttp要求の代わりにソケットを使用するのですか? – Festo

+0

@Festo、私はちょうどこのレイヤーでは、デバイスと通信するためにソケットを使用する必要があります、私は定期的な要求を使用することができますが、データがリアルタイムで私はソケットと一緒に行くことができるTCP層でGPSデバイスと通信することができます。 – dNitro

答えて

3
  1. NodeJSは、他の2つのオプションと同じように接続ごとに1つのスレッドを使用しないため、実際にはNodeJSがユースケースにとってより良いオプションだと言います。スレッドは、通常、特定のマシン上の有限のリソースです。 JavaRubyには「イベントが発生しました」というサーバーがあります。これは、リンゴとリンゴの比較を行うかどうかを調べる価値があります。

  2. 接続プーリングに関するアドバイスが必要な場合は、使用するデータベースの詳細が必要です。ただし、セットアップにコストがかかる場合は接続を再利用するのが良いことです。プールの最小サイズと最大サイズを設定する機能を持たせることをお勧めします。最終的に使用する正しいサイズはテストの問題です。

  3. 私は、このシステムでのキャッシュの利点は、主にデータを書き込むにつれて最小限になると思います。データが貴重な場合は、メモリではなくディスクに書き込むことをお勧めします。一方で、収集されたデータを読んでいるクライアントがあれば、おそらくRedisのようなもので自分の読み込みをキャッシングするのが良い考えかもしれません。

+0

答えがありがとう、私は本当にこの選択肢にいくつかの自信が必要です、あなたの答えは私が最初の段階を完了することができるように私を与える。 JavaとRubyのイベントが発生したサーバーは素敵なリンゴですが、node.jsと一緒に行く予定です。経験が豊富だからです。実際に私はpostgresをデータベースとして使用しようとしています。次の段階でGISを扱う必要があります。私はRedisをキャッシュ層として使用することを意味していたので、クエリ・データベースをどのようにしたいのか、どのデータを手元に置くべきかを決めるときに、httpサーバーと一緒に実装すると思います。 – dNitro

3

私は確信していると思いますが、ここでアプリケーションを途中で最適化しようとしているようです。

1ノードはイベント駆動型で非ブロッキングであるため、多数のオープンソケット接続を保持するのに最適です。接続ごとに分岐する必要はありません。しかし、いつものように、アプリケーションが適切にクラスタ化されていることを確認してください。私は安価なラップトップに〜100kオープンTCPソケットを保持することができました。サポートする必要のあるデバイスの数がこれを超えて増えた場合は、それに応じて拡大縮小してください。

2私はあなたがポストグルを使用することを計画しているのを見ました。プールは常に良いものです。

3キャッシングは「ホット」データに役立ちます。多くのクエリを取得し、それをメモリまたは内部メモリ(内部メモリ)に格納すると、これらのデータ検索が高速になり、システムの負担が軽減されます。あなたのケースでは、解析やその他の因果的な使用のために特定のデータを取得するだけでよいのであれば、プレーンキャッシングレイヤーではなくsparkまたはsolrをお勧めします。また、維持するのがずっと安く簡単になるでしょう。

+0

ニートポイント。私はElasticSearchでいくつかのexprienceを持っているが、sparkやsolrのようなツールがこの分野ではるかに成熟しているようだ。それで彼らのことを見守ってくれるでしょう。 「時期尚早最適化」とは、私が最初の場所でそれを見つけられなかったという表現でした。私はあなたと私の経験を共有することに本当に感謝しています。どうもありがとう。 – dNitro

関連する問題