web-dev-qa-db-ja.com

JMSの代わりにScalaのアクターを支持する設計上の決定は何ですか?

JMSの代わりにScalaアクターを使用する場合の違いは何ですか?

たとえば、パフォーマンスとスケーラビリティの観点から、JMSと比較してScala Actorモデルは何を追加しますか?どちらの場合、JMSではなくActorを使用する方が理にかなっていますか。そのJMSはカバーできませんか?

81
Kristian

JMSとScala=アクターは理論的な類似性を共有しますが、それらは必ずしも同じ問題をアーキテクチャ的に解決するものとは見なしません。アクターは、競合とデッドロックが発生する共有メモリの同時実行に対する軽量の代替手段となることを意図していますJMSは、誤って作成するのが一般に困難です。JMSは、ダイレクトメッセージング、パブリッシュ/サブスクライブ、トランザクション、EJB統合などにまたがることを目的とした高度なAPIです。

アクターと同等の最も近いJMSは、非永続的、非トランザクション、非pub/subキューによってバッキングされるメッセージ駆動型Beanです。これを「単純なJMS Bean」と呼びます。

さて、あなたの質問に。

JMSは実装ではなく仕様であるため、パフォーマンスについて話すのは困難です。それにもかかわらず、単純なJMS Beanを使用する場合、時間とメモリのアクターにおそらく少しのエッジを使用すると、パフォーマンスはほぼ同じになると予想します。 pub/sub、トランザクションなどの機能をJMSに追加すると、パフォーマンスは当然さらに低下しますが、リンゴとオレンジを比較しようとしています。

スケーラビリティに関しては、単純なJMS Beanはアクターとほぼ同じ方法でスケーリングする必要があります。 JMSミックスにトランザクションを追加すると、トランザクションの範囲に応じた量だけスケーラビリティが低下します。

アクターが何をするのかというより広い質問は、JMSでは不可能です。まあ、組み込みのpub subやトランザクションがなければ、アクターがJMSから差し引くように見えるでしょう-広くそれは本当です。しかし、ここで重要なのは、アクターが必要とするコードが非常に少ないため、非常に細かい粒度の同時実行にそれらを喜んで使用できることです。通常のJavaコードでは、「JMSとその依存関係、またはそれに必要なコードなどをねじ込むのは嫌なので、スレッドを生成し、ロックを使用して共有します。データ構造です。 "Scala俳優の場合、"俳優を鞭で打って先に進む "と言う可能性が高くなります。

デザインにも哲学的な違いがあります。アクターには、スーパーバイザー階層の単純な組み込み概念があります。アクターは通常、「それをクラッシュさせる」設計で使用されます。アクターが何らかの理由で死亡した場合、別のアクターは、そのアクターを再始動する、アクターの束を殺してすべてを再始動する、または他のアクターができるようにアクターの束とそれ自体を殺すなど、それについて何をするかを決定する責任があります問題に対処します。この種のものはJMSに追加できますが、それはAPIの中核ではなく、何らかの方法で外部から管理する必要があります。

ちなみに、JMSがカバーするレルムにさらに移動するScalaアクターライブラリの場合 Akka を参照してください。Akkaは、多くの一般的なアクター階層戦略にも宣言型アプローチをもたらします。

112
James Iry