JMSの代わりにScala Actorsを使用する違いは何ですか?JMSの代わりにScalaのアクターを好む設計上の決定は何ですか?
たとえば、パフォーマンスとスケーラビリティの観点から見ると、Scala ActorモデルはJMSと比べて何を追加しますか?どの場合には、JMSではなくActorsを使用する方が理にかなっていますか?つまり、ActorsがJMSでカバーできない問題は何ですか?
JMSの代わりにScala Actorsを使用する違いは何ですか?JMSの代わりにScalaのアクターを好む設計上の決定は何ですか?
たとえば、パフォーマンスとスケーラビリティの観点から見ると、Scala ActorモデルはJMSと比べて何を追加しますか?どの場合には、JMSではなくActorsを使用する方が理にかなっていますか?つまり、ActorsがJMSでカバーできない問題は何ですか?
JMSとScalaの俳優は理論的な類似点を共有していますが、構造的に同じ問題を必ず解決するとは考えていません。アクターは、共有メモリーの並行処理の代わりに、競合やデッドロックが発生するのが一般的ではない軽量の代替手段です。 JMSは、ダイレクト・メッセージング、パブリッシュ/サブスクライブ、トランザクション、EJB統合などにまたがる高度なAPIです。
アクターに最も近いJMSは、非永続的-transactional、non-pub/subキュー。私はそれを「シンプルなJMS Bean」と呼んでいます。
今、あなたの質問に。
JMSは実装ではなく仕様なので、パフォーマンスは話題になります。シンプルなJMS Beanを使用すると、パフォーマンスがほぼ似ていると思います。 pub/sub、トランザクションなどのJMSに機能を追加すると、パフォーマンスは自然に低下しますが、次にリンゴとオレンジを比較しようとしています。
スケーラビリティに関しては、単純なJMS Beanは、アクタとほぼ同じように拡張する必要があります。 JMSミックスにトランザクションを追加すると、トランザクションの範囲に応じてスケーラビリティが自然に損なわれます。
JMSが行うことができないことは、アクターが何をするのかというより広い問題です。まあ、組み込みのパブ・サブやトランザクションがなければ、アクターはJMSから引き離されているように見えるでしょう - そして広くそれは本当です。しかし、ここには事があります:アクターは非常にきめ細かい並行処理のために喜んで使うことができるほどのコードを必要としません。通常のJavaコードでは、「JMSとそれに依存するものやコードに縛られているような気がしないので、スレッドを生成し、ロックを使用し、データ構造を共有します」と言うかもしれません。 Scalaの俳優たちは、「私はただ俳優を起用して上にいく」と言います。
デザインにも哲学的な違いがあります。アクターには、監督者階層の概念が組み込まれています。アクターは、通常、「クラッシュさせる」設計で使用されます。俳優が何らかの理由で死亡した場合、別の俳優は、その俳優を再開したり、複数の俳優を殺したり、それらのすべてを再開したり、俳優やその犠牲者を殺したりするなど、何をすべきかを決める責任があります。問題に対処する。そのようなことはJMSに追加することができますが、APIの中核ではなく、何とか外部的に管理する必要があります。
ところで、Scalaのアクターライブラリでは、JMSがカバーする領域にもっと移動するため、Akkaを参照してください。 Akkaはまた、多くの一般的なアクター階層戦略に宣言的なアプローチをもたらします。
私はそれをカバーしていると思います。私はそれを明確にするために最後のいくつかの段落を更新しました。また、俳優の階層について少し説明しました。 –
クリスチャン。 Akkaのアクタは一般的にScalaのアクタよりも軽量です。ただし、APIと設定の設定はやや複雑です。レイアウム/スループットが問題ではない場合(例えば、ワーカータスクの作成など)、Akkaのアクターがいる場合、または監督が必要な場合はScalaのアクターを使用します。 –
一般的に、JMS実装では、外部ブローカが必要です.Akka/Actorsが外部ブローカなしで実行できる外部ブローカが必要です。もちろん、プロセス間/ホストのメッセージングが必要な場合は、適切に選択します。 – jasonk