3

boost.asioとは異なり、nettyには読み取りのような方法はありません。次の状況では不便です。管理ノードが一部のノードを管理し、クライアントが管理ノードに接続して、ノードに存在する情報を取得します。管理ノードはクライアントの要求を受信すると、対応するノードに要求を送信し、ノードの応答を待ちます。ノード応答および管理ノードが「messageReceived」関数で情報を取得するとき、クライアントに属するチャネルに情報を送信するにはどうすればよいですか?クライアントリクエストのハンドラーにイベントを送信する必要があります。

1.クライアントリクエストを取得する

2.ノードにリクエストを送信します

3.そのノードの応答を読み取る

4.クライアントに応答を送信します

これらの4つのステップはすべて、boost.asioの1つの関数で実行できます。ただし、nettyはstep3をサポートしていません。読み取り関数は独立しており、ユーザーは直接呼び出すことはできません。唯一の方法は、管理ノードとノードの間のハンドラーで応答を受信した後、それを管理ノードとクライアントの間のハンドラーに再送信することです。これを行うための典型的な方法は何ですか?

4

1 に答える 1

3

Nettyは非同期i/o操作を使用するため、ステップ2は非同期であり、はい、ステップ3を取得するまでブロックできません。

このようなほとんどの場合(Nettyに固有ではありません)、実行できることは次のとおりです
。1)リクエストに一意のIDを提供し、ノードは応答で一意のIDをエコーバックすることになっています。
2)キーをリクエストの一意のIDとして、チャネル(管理ノードとクライアント間)を値としてハッシュマップに保存します
。3)管理ノードのノードから応答を受信すると、一意のIDを使用してハッシュマップからチャネルを検索できます。次に、応答をクライアントに送信します。

ブルーノ・デ・カルバーリョのNettyロードバランサーもご覧ください。同じ問題について別の見方ができます。彼は同じ効果を達成するためにトンネリングを使用しています。

于 2011-11-23T15:41:23.020 に答える