HawtdispatchはJavaの執行者とどう違うのですか? (そしてネットティ)
-
27-10-2019 - |
質問
イライラすることに、HawtdispatchのWebサイトでは、「スレッドプーリングおよびNIOイベント通知フレームワークAPI」と説明しています。
最初に「スレッドプーリング」部分を取りましょう。 Javaが提供するエグゼクティアのほとんどは、基本的にスレッドプールでもあります。 Hawtdispatchはどう違うのですか?
また、明らかに「NIOイベント通知フレームワークAPI」です。私はそれが上部のNIOの薄い層であり、着信データを取得し、「スレッドプール」の概念に渡し、スレッドプールスケジューラが時間を見つけたときに消費者に渡すと思います。正しい? (NIOに対する改善は歓迎されています)。 Netty Vs HDのパフォーマンス分析を行った人はいますか?
解決
Hawtdispatchは、単一のシステムワイド固定サイズスレッドプールになるように設計されています。 Java executorの2つのフレーバーを実装しています。
- グローバルディスパッチキュー:送信された実行可能オブジェクトは同時に実行されます(
Executors.newFixedThreadPool(n)
執行者) - シリアルディスパッチキュー:送信された実行可能オブジェクトはシリアルに実行されます(あなたは同じ効果を取得します
Executors.newSingleThreadExecutor()
執行者)
Java Executorモデルとは異なり、すべてのグローバルおよびシリアルディスパッチキューは、単一の固定サイズスレッドプールを共有します。スレッドカウントを増やすことなく、数千のシリアルディスパッチキューを使用できます。シリアルディスパッチキューは、Erlangメールボックスのように使用して、リアクティブな俳優スタイルのアプリケーションを駆動できます。
Hawtdispatchは、すべてのグローバルキューおよびシリアルキューの実行を処理するために固定サイズのスレッドプールを使用しているため、実行できるすべての実行可能なタスクは非ブロッキングである必要があります。ある意味では、これはNodeJSアーキテクチャに似ていますが、それは1つだけでなく複数のスレッドを使用しています。
Nettyと比較して、Hawtdispatchは実際にソケットデータを処理するためのフレームワークではありません。ソケットデータのエンコード/デコード、バッファ、処理方法のフレームワークは提供されません。それが行うのは、データを非ブロッキングソケットで読み取るか、書き込んだ場合に実行されたユーザー構成を実行することです。その場合、ソケットデータを実際に読み書きする/書き込むのはあなた次第です。