スレッドがどのように処理されるかを調べるために、Netty 4.0.0.Alpha5 コードを調べています。また、 http://netty.io/wiki/new-and-noteworthy-in-4.0.html#wiki-h2-34にある Netty 4 の新しいスレッド モデルの紹介も読みました。
私が理解しているように、目標は次のとおりです。
- スレッド アフィニティ、チャネルを単一のスレッド (EventLoop) に貼り付けます。このアプローチは、キャッシュ ミスを減らし、NUMA ハードウェアの状況を改善するために採用されたものだと思います。
それで、私の解釈が正しいかどうか疑問に思っています。もし私が正しければ、次の疑問が生じます。
- ChannelPipeline に長時間実行されている可能性のある ChannelHandler (データベース操作など) があると、EventLoop (スレッド) がブロックされる可能性があるため、同じ EventLoop (スレッド) に割り当てられた他のすべてのチャネルがブロックされます。この解釈は本当ですか?
- その問題を回避しようとして、長時間実行されている ChannelHandler に EventExecutor を使用できますが、ドキュメント (上記のリンクを参照) によると、チャネルは EventExecutor 内の単一のスレッドに再びスタックしているため、同じ割り当てられている他のチャネルを再びブロックする可能性があります。スレッド (EventExecutor 内)。私は何かを見逃しましたか、それともこれは本当ですか?
私は、物事がそのようになっている理由を理解し、Netty 4 の設計意図に関する情報を得ようとしています。