2012-11-29 10 views
8

私は現在、練習として単純なP2Pネットワークを開発中です。ネットワーク内の各ノードは、ハートビートを他のノードのサブセットに送信して、ネットワークを離れたノードを検出できるようにします。ハートビートパケットの横に、新しいノードがネットワークに参加/離脱したとき、リソース(小さなテキストファイル)などを探したいときにパケットを送信します。すべてのパケットはUDPパケットです。多くの受信パケットを処理する最良の方法

パケットを受信するたびに、その特定のパケットを処理する新しいスレッドを開始します。しかし、私は1つのアプリケーションライフタイムの間に(特にハートビートのために)非常に多くなるスレッドの量に関係しています。 (私が避けたいデッドロックなどのリスクもあります)。

私はすべての着信パケットを入れ、そのキューから一度に1つのパケットを処理する単一のスレッド(プロデューサ - コンシューマパターンのようなもの)を持つことを考えました。パケットをすばやく処理して、送信者がパケットが失われたとは思わないようにしたいと思います。

それぞれの新しいスレッドを開始することなく、多くの異なる着信パケットを処理する最善の方法は何ですか?私が持っているものと一緒に行くべきか、プロデューサーを消費するのか、それとも何か違うの?

+1

LinkedListとともにプロデューサ - コンシューマを使用します。私が考えることができる最も簡単な方法。 – DankMemes

+0

自分自身について言及したような昔ながらのものから始めて、ベンチマークを行い、 "Disruptor"(http://lmax-exchange.github.com/disruptor/)のような最新のものを試してから、もう少しやってみてくださいベンチマーク。 –

+1

"多くの異なる着信パケット"を定量化するのに役立つかもしれません...相対的に言えば、現代のシステムでは通常、NICの数と種類に応じて毎秒数百から数千のパケットを処理することができます。私はハートビートが1分あたり数十の範囲にあるかもしれないと思っています... – twalberg

答えて

0

1つのパケットを処理するのにどれくらいの時間がかかりますか?

pingの場合は、受信時に処理するほうが処理が速いかもしれません。特定のブロッキングキューなどの共有データ構造に他のものを入れることができるため、キューが空の場合、ワーカースレッドは新しい新しいジョブが追加されると、スレッドが呼び起こされ、ジョブが実行されます。

パケットごとに1つのスレッドを開始すると、実際にジョブを実行するよりもスレッドの開始と停止に時間がかかることがあります。

パケットの応答がすべてのタイプのパケットで時間がかかりすぎない場合は、キューのロックとスレッドのスケジューリングに費やされる余分な時間がプログラムの処理速度を低下させる場合がありますより高速ではなくむしろ。

いずれにしても、スレッドプールを使用して、開始時にワーカーを開始します。必要に応じて、過去数分の負荷に応じて動的に作業スレッドの数を増減することができます。

+0

時間はわずかに異なります。ほとんどのパケットはすばやく処理されますが、一部のアクションでは新しいパケットが送信され、応答が必要になります。しかし、私はスレッドプールとキューと一緒に行くと思う。ありがとう。 – Wondering

0

私はevent driven architectureを使用します。すべてのパケットに対して新しいスレッドを作成することはスケーラブルではないため、一定量の作業負荷で動作しますが、それ以上動作しないという点があります。あなたはそれを例えばと比較することができます。メッセージがパケットであるFacebookのチャットのようなチャットプログラム。 イベント駆動型アーキテクチャはスケーラビリティがあり、まさにあなたが探しているものです。グーグル、多くのプログラミング言語のライブラリがありますので、適切なものを選んでください(私はErlang、Scala、CまたはPythonでそうしたいと思います)。

編集:ok、javaタグは表示されませんでした。しかし、言語は重要ではありません。

は、例えば、このリンクを見てみましょう: http://www.nightmare.com/medusa/async_sockets.html

私はそれがイベント駆動型プログラミングのアイデアを得るためにかなり良いものを見つけます。

+0

しかし、彼はUDPを使用しているので、おそらくファイル記述子は1つしかありません。 – LtWorf

+0

これは非同期にする可能性を排除しません。ノンブロッキングソケット、非同期入出力、またはイベント駆動型ソケット(基本的に同じ考え方をすべて説明しています)を探します。 – Cravid

+0

私はそれがまだ可能であることを知っていますが、私はそれがこの特定の状況で面倒な価値があるとは確信していません。 – LtWorf

関連する問題