1

分散処理用のシステムを構築し、ネットワーク I/O スタックに netty (4.0) を使用したいと考えています。

次の状況: プロデューサー タスク A とコンシューマー タスク B があります。タスク A は 64K のチャンクでデータを生成し、それをタスク B に送信します。タスク B は特定の状況で計算集約的になり、タスク A によって生成されたよりも遅く 64K ブロックを消費する可能性があります。 . タスク A と B は tcp チャネルで接続されています。

このアプローチについて考えてみます。タスク A がチャンクを生成し、それをローカル キューに入れます。tcp チャネルが空いていて、次の 64K をチャネルに書き込むことができる場合、キューからチャンクが自動的に取得されます (netty はそのようなシグナル/イベントを提供しますか?)。タスク A のキューが格納されたチャンクの固定制限を超えた場合、タスク B がチャンクを消費するまでタスク A をブロックします。本質的には、タスク A の「受信者がトリガーする書き込み」で、TCP チャネルを輻輳させることなく完全に利用できるようにする必要があります。この設計の目標は、データ スループットを最大にすることです。

現在、いくつかの質問があります:)

それは最大のスループットを実現するための適切な設計ですか? TCP チャネルを十分に活用するためのより良い設計は何でしょうか?

netty はこれらのシナリオに適したフレームワークですか? (私は netty にはかなり慣れていませんが、フレームワークの明確な抽象化/設計が本当に好きです!)

そんなデザインがnettyで実現できるのか?=> (受信側サイトからそのような信号/イベントが得られますか?)

最大スループットを可能にする netty を使用した最適な設計はどれですか?

より適切な他のフレームワークはありますか?

どんなアイデアやメモでも大歓迎です!!!

よろしくお願いします!!! トビ

4

1 に答える 1

1

ここにいくつかの注意があります:

  • 一般的な設計:「分散」処理について言及していますが、タスク A とタスク B プロセッサの複数のインスタンスがあるかどうかは指定しません。タスク A プロセッサが 1 つとタスク B プロセッサが 1 つしかない場合、データ スループットは遅い方によって決まります。1 つの平均として、B の方が遅いことは理解していますが、より高速になる可能性があるため、A と B の間にバッファーを導入することは良い考えのようです。したがって、単一の A インスタンスと単一の B インスタンスに固執する必要がある場合は、設計は問題ないと思いますが、B が実際に遅い場合は複数のインスタンスを使用することを検討できます (その場合、A よりも多くの B インスタンスが必要になります)。

  • netty または他のフレームワーク: はい、Netty でそれを行うことができます。ただし、「TCP チャネルは空いています」というシグナルを記述する必要があると思います。私はあまり経験がありませんが、http://akka.io/のようなフレームワークで、メッセージ パッシングとアクター モデルを実装するのは面白いと思います。

于 2013-12-12T10:54:23.940 に答える