4

サーバーでは、新しい接続ごとに ChannelPipelineFactory#getPipeline() が呼び出されます。私のサーバーの ChannelHandlers には、スレッドセーフではないシリアライゼーション バッファやその他のオブジェクトが割り当てられています。接続ごとにそれらを割り当てないようにするにはどうすればよいですか? 私のアプリケーションには短時間の接続が大量にあり、これがパフォーマンスを低下させています。接続状態ごとにハンドラーに保存しません。ハンドラー内のオブジェクトはスレッドセーフではないため、パイプラインを使用するスレッドごとに 1 回割り当てるだけで済みます。

おそらく、単一のハンドラーでパイプラインを使用できます。イベントが受信されると、ThreadLocal から実際のハンドラーへの参照を取得します。このようにして、接続を処理するスレッドごとに 1 回だけ実際のハンドラーを割り当てます。ただし、すべてのイベントの ThreadLocal ルックアップを意味します。

より良いかもしれない他の解決策はありますか?

Netty パイプラインは、比較的単純なサンプル コードでは見栄えがよく、問題 (HTTP 処理など) にうまく適合する場合は非常にきれいですが、他の多くのシナリオではあまり柔軟ではないという印象があります。これは、それらの線に沿った他の人の考えです。単一のハンドラーを使用して独自の「パイプライン」をロールすることは完全に実行可能であるように見えるため、これは災害ではありませんが、間違っているのでしょうか?

4

1 に答える 1

3

それで十分な場合は、 ThreadLocal を使用することをお勧めします。ダウンストリーム イベントは任意のスレッドによって起動される可能性があり、ThreadLocal がうまく機能しない可能性があるため、これはアップストリーム イベントに対してのみうまく機能することに注意してください。

于 2012-05-21T06:46:29.080 に答える