まず、「古い」メッセージシステム(MQ)は実装が古いですが、エンジニアリングの考え方は新しいものです。つまり、トランザクション永続キューです。Scala ActorsとAkkaは新しい実装かもしれませんが、Actorの古い同時実行モデルに基づいて構築されています。
ただし、2つのモデルはどちらもイベントメッセージベースであるため、実際には非常に似ています。RabbitMQとAkkaに対する私の回答を参照してください。
JVM専用のコードを作成する場合は、おそらくAkkaが適切な選択です。それ以外の場合は、RabbitMQを使用します。
また、Scala開発者であれば、Akkaは非常に簡単です。ただし、AkkaのJavaバインディングはあまりJava風ではなく、Scalaの型システムによりキャストが必要です。
また、Javaでは通常、不変オブジェクトを作成しないため、メッセージングに推奨します。その結果、Javaでは、拡張できないAkkaを使用して誤って何かを実行するのが非常に簡単です(メッセージに可変オブジェクトを使用し、奇妙なクロージャーコールバック状態に依存しています)。MQでは、速度を犠牲にしてメッセージが常にシリアライズされるため、これは問題になりません。Akkaでは一般的にそうではありません。
また、Akkaは、大部分のMQよりも大量のコンシューマーに適しています。これは、ほとんどのMQ(JMS、AMQP)クライアントでは、すべてのキュー接続にスレッドが必要であるためです...したがって、多数のキュー==永続的に実行される多数のスレッド。これは主にクライアントの問題です。ActiveMQ Apolloには非ブロッキングディスパッチャーがあり、AMQPの問題を修正するとされています。RabbitMQクライアントには複数のコンシューマを組み合わせることができるチャネルがありますが、多数のコンシューマがデッドロックまたは接続の停止を引き起こす可能性があるという問題が依然としてあるため、通常、この問題を回避するためにスレッドを追加します。
そうは言っても、Akkaのリモート処理はかなり新しいものであり、おそらく従来のメッセージキューが提供する信頼できるメッセージ保証とQoSをまだすべて提供しているわけではありません(ただし、それは毎日変わります)。また、一般的にピアツーピアですが、ほとんどのMQシステムが行うサーバーツーピア(つまり、単一障害点)をサポートしていると思いますが、ピアツーピアのMQシステムがあります(RabbitMQはサーバーじっと見ます)。
最後に、RabbitMQとAkkaは実際に良いペアを作ります。特にRabbitMQはメッセージの消費の処理とローカルでのメッセージのルーティング(単一のJVM)を支援しないため、AkkaをRabbitMQのラッパーとして使用できます。
Akkaを選択するタイミング
- たくさんの消費者がいる(数百万人と思う)。
- 低レイテンシが必要
- Actor同時実行モデルにオープン
システム例:インタラクティブなリアルタイムチャットシステム
MQを選択するタイミング
- 多くの異なるシステム(つまり、JVM以外)と統合する必要がある
- メッセージの信頼性は待ち時間よりも重要です
- より多くのツールと管理UIが欲しい
- 長期実行タスクには以前のポイントが優れているため
- アクターとは異なる並行処理モデルを使用したい
システム例:スケジュールされたトランザクションバッチ処理システム
関連するコメントに基づいて編集
OPは、AkkaとMessage Queueの両方が処理できる分散処理に関係していると想定しました。それは私が彼が分散したアッカについて話していたと思います。ローカルの同時実行性にAkkaを使用することは、ほとんどのメッセージキューと比べるとかなり簡単です。あなたは両方の同時実行モデル(すなわち、トピック、キュー、取引所)としてローカルメッセージキューモデルを適用することができますので、私はほとんどの言う原子炉のライブラリとシンプルが反応しません。
適切な同時実行モデル/ライブラリを選択することは、低レイテンシアプリケーションにとって非常に重要です。メッセージキューなどの分散処理ソリューションは一般に理想的ではありません。ルーティングはほとんどの場合ネットワーク上で行われるため、アプリケーション内よりも明らかに低速であり、したがってAkkaが優れた選択肢となるからです。ただし、一部のプロプライエタリMQテクノロジではローカルルーティングが可能だと思います。また、前述したように、ほとんどのMQクライアントはスレッド化についてかなり愚かで、非ブロッキングIOに依存せず、接続/キュー/チャネルごとにスレッドを持っています...皮肉なことに、非ブロッキングIOは常に低遅延ではありませんが、一般により多くのリソースです効率的です。
ご覧のとおり、分散プログラミングと並行プログラミングのトピックはかなり大きく、毎日変化しているので、私の当初の意図は混乱せず、OPが関係していた分散メッセージ処理の特定の領域に焦点を当てていました。並行性の観点から、「新しい」が、アクターモデルやメッセージキューモデルと同様の「リアクティブ」プログラミング(RFP /ストリーム)に検索を集中したい場合があります。イベントベースです。