Sprayのリクエストごとのアクターが、リクエストごとのスレッド(Tomcatなど)よりも優れているか悪いのはなぜですか?どんな戦略がより良いパフォーマンスを提供しますか?Sprayでのリクエストごとのアクターが、Tomcatのようなリクエストごとのスレッドよりも良い/悪いのはなぜですか?
答えて
HTTPを使用する場合は、ステートレスプロトコルが使用されます。したがって、それは俳優に最適です。
各面を書き留める前に思います。私はよりよい一般的なレベルに私の声明を取っているこの良い答えにあなたをリダイレクトします。 How does Actors work compared to threads?
EDIT:
俳優は基本的に状態を共有しないと、メッセージ内のデータは不変です。あなたがスレッドを使用している場合、それらの間で簡単にデータを交換することができます。また、開始されたスレッドの寿命や量などの処理も必要です。共有状態(不変でない場合)がDeadLocksやその他の同時発生状況を引き起こす可能性があるという基本的な事実です。 ExecutionContextを含む多くのことを処理する事前実装されたThreadPoolsを使用することができるという事実は除外しません。多くの人が自分自身を含めスレッドを間違って使用しています。スレッドのトピックではプロではなく、並行性のすべての問題があります。 https://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html
俳優は、「1つ」のもの/トピック/使用例が非常に良好でなければなりません。彼らは、あなたがActorSystem、異なるタイプの子を多く持つことができるRootActorなどを持っていることを意味する、ヒラキカルな方法で構築されています。これは非同期メッセージを送信することによる通信です(ブロッキングスタイルで作業することもできます)。 1つのアクターを起動すると、1つのスレッドで実行されます。つまり、1秒間に処理する必要がある10個のメッセージを送信すると、すべてのメッセージは〜10秒後に処理されます。これはあまり並行ではないので、より多くのアクターを生成することができますが、正しく使用していれば、共有スレッドの量xで実行されます。これにより、スレッドが強制終了され、新しいスレッドが生成されることを防ぎます。これはすべてフードの下で処理され、TypesafeConfigで設定することができます。非現実的な例として、20人のアクターが出現するかもしれませんが、20人ではなく4人のスレッドで実行されています。これらのすべてはアクターによって処理され、あなたの目的に使用しているDispatcher、Router、Mailboxについて考える必要があります。そしてそれはスプレーのことです。
HTTPに戻る:これはステートレスです。つまり、TCP-Conが確立された後、HTTP-Requestを送信すると、HTTP応答が返されます。その後、この会話は時代遅れであり、HTTPには関係しません。セッションはHTTPヘッダーを介して識別されますが、プロトコル自体は何もしません。セッションの内容はアプリケーションの仕事です。したがって、要求を処理するために、repsonseスプレーには少数のアクターを持つスレッドプールがあり、要求を処理してルートにリダイレクトします。
あなたがレーダーに持っているべきもの:スプレーはREST/HTTPフレームワークです。 RESTは、非常に厳密でわかりやすい場合、各メッセージに対応するために必要なすべての情報が含まれている必要があることを意味します。
これは少し上をクリアすることを願っています。スプレーで使用されるActorModelをより深く知りたい場合は、自分のサイトを見る必要があります(申し訳ありませんが、リンクはありません)。私はそれが非常に基本的なものであることを知っていますが、これらのトピックのすべてについてかなり良いブログエントリがあり、これは小説全体を書くのが正しいコンテキストではないと思います。
また、私はスレッドがTomcatでどのように使われているかわかりませんが、これは非常に重要な質問です。しかし、私はThreadPoolはそれほど費用がかからないと考えるでしょう。 – sascha10000
私はこれが質問の答えとなるとは言いません。私はこれをコメント*として投稿します。 –
なぜActorsはHTTPのようなステートレスなプロトコルに適していると主張していますか? – pacman
- 1. セッションごとまたはリクエストごとのTomcatセキュリティレルム?
- 2. リクエストごとにJUSTトークンを更新するのはなぜ悪い考えですか?
- 3. 角度ごとにリクエストごとにヘッダーを送信しない
- 4. アクターごとのアクセルソケット
- 5. リクエストごとのcsrfトークンはどのように動作するのですか
- 6. リクエスト・モデルごとのスレッドは、ノンブロッキングI/Oより高速である可能性がありますか?
- 7. WebリクエストごとのEF DbContext +カスタムRoleProvider = WebリクエストまたはシングルトンごとのRoleProvider?
- 8. リクエスト・コンテキストごとのJsonSerializer
- 9. Azure Webjob - リクエストごとのライフタイム?
- 10. リクエストごとにヘルパークラスインスタンスのようなUrlHelperを作成しますか?
- 11. なぜPython 3のhttp.clientはPythonリクエストよりもずっと高速ですか?
- 12. リクエスト:リクエストごとにユーザエージェントを設定するにはどうすればよいですか?
- 13. 再帰はいつ、なぜ反復よりもパフォーマンスが悪いのですか?
- 14. ICallbackEventHandlerリクエストは1秒ごとです。
- 15. リクエストごとにスレッドを割り当てます。
- 16. リクエストごとに悪夢を実行する方法は?
- 17. スカラーバージョンごとのクラシファイアではなく、スカラバージョンごとにスカラーバージョンのアーティファクトがあるのはなぜですか?
- 18. データソースループ内のリクエストごとにヘッダの値を変更するにはどうすればよいですか?
- 19. SignalRのリクエストごとの静的データ
- 20. クライアントごとのスレッドではないコードを作成する
- 21. NSURLSessionでソケットごとに複数のリクエストを無効にするにはどうすればよいですか?
- 22. httpリクエストごとのダイレクトdb接続と接続プーリング - 違いは
- 23. なぜconnect-mongoはリクエストごとに新しいセッションを作成するのですか?
- 24. Grailsがhttpリクエストごとに1つのセッションを作成するのはなぜですか?
- 25. サーブレットコンテナTomcatよりも良い
- 26. PassportJSでリクエストごとにユーザーを逆シリアル化する必要があるのはなぜですか?
- 27. 私のPOSTリクエストがエクスプレストリガーとなるのはなぜですか
- 28. スリック接続プールのリクエストごと
- 29. WebリクエストごとのStructureMap注入
- 30. httpリクエストごとに角2のローダー
野生の推測:スレッドは限定されたシステムリソースであり、アクターは非同期応答を待っています。 DBはありません(スレッドは別のアクタのために解放されます)。したがって、アプリケーションが非同期の場合、1スレッド= 1の接続モデル(Tomcatなど)より多くの接続をオープンに保つことができ、システムを停止させることはありません。 –
私はそれが「誰が良いのか」ではないと思います。アクターのアプローチではアクターごとにスレッドを必要としないため、要求数が増えるにつれて*規模を拡大することができます。スレッドの量が基礎となるOSに密接に結合している要求ごとの専用スレッドと異なります。あなたのサービスがあなたのマシンにストレスを与えることがないなら、私は大きな違いはないと思っています。 –
基本的に、要求ごとのスレッドでは、システムリソースが制限されているスレッド数に制限されています。ほとんどのスレッドがIOを待っていて、実際にユーザーにサービスを提供しているスレッドはほとんどありません。一方、アクターは、同じ数の脅威を持つより多くのユーザーにサービスを提供できるように、スレッドをブロックせずに待機することができます。 –