私はそれを調べて、あなたはそれにメッセージを送ります。しかし、なぜ?なぜデータベースを使用しないのですか? ActiveMQにはデータベースにはない機能があるはずです。
2つの分散プロセス間で確実に通信するために使用されます。はい、データベースにメッセージを保存して2つのプロセス間で通信できますが、メッセージを受信したらすぐにメッセージを削除する必要があります。つまり、各メッセージの行の挿入と削除を意味します。 1秒間に数千のメッセージを通信するようにスケールアップしようとすると、データベースが倒れる傾向があります。
一方、ActiveMQのようなメッセージ指向ミドルウェアは、これらのユースケースを処理するために構築されています。健全なシステム内のメッセージは非常に迅速に削除され、オーバーヘッドを回避するための最適化を実行できると想定しています。また、コンシューマがSQLクエリを実行して新しいメッセージをポーリングする代わりに、コンシューマにメッセージをプッシュすることもできます。これにより、システムに送信される新しいメッセージの処理に伴う待ち時間がさらに短縮されます。
ActiveMQ、または一般的にすべてのメッセージ指向ミドルウェア(MOM)実装は、2つのアプリケーション間、または1つのアプリケーション内の2つのコンポーネント間でメッセージを送信するために設計されています。
基本的に、MOMとデータベースは、読み取りおよび書き込みが可能なトランザクションおよび永続的なデータストレージを提供するという共通の基盤を共有しています。大きな違いは使用パターンです。データベースは非常に汎用的であり、複数のテーブルにわたる複雑な検索用に最適化されていますが、MOMはFIFOのような方法でメッセージを1つずつ読み取るように最適化されています。
ActiveMQが実装するAPIであるJMSは、Javaエンタープライズアプリケーションの重要な礎石です。これにより、メッセージはかなり一般的な形式とセマンティクスを共有し、異なるアプリケーション間の統合が容易になります。
もちろん、ActiveMQ、OpenWire、STOMP、MQTTなどのワイヤプロトコル、JMS、Apache Camelを使用したEIP、「リクエスト/リプライ」や「パブリッシュ/サブスクライブ」などのメッセージパターン、JMSブリッジング、クラスタリング(「ブローカーのネットワーク」)。これにより、スケーリングや配布などが可能になります。これらのトピックはかなり大きいので、興味がある場合は少し読んでください。
Active MQは優れたスケジューラーサポートを備えているため、特定の時間にメッセージが配信されるようにスケジュールできます。この機能を使用して、医療シナリオで薬の詳細をアップロードする患者に薬のリマインダーを送信しました。
RDBMSでは、データの行を処理するときに、通常、処理が繰り返されないように行が処理されたことを示すフラグを更新します。
ただし、Message Queueを使用すると、メッセージを確認するだけで、次のコンシューマが次のコンシューマを処理します。
違いは、RDBMSのUPDATE
文は、activmeqのacknowlege
と比較して非常に遅い操作です。
以下を強調したいと思います。
分離:システムは接続せずに通信できます。キューはシステム間にあり、1つのシステム障害がキューを介して行われるため、他のシステム障害が他のシステムに影響を与えることはありません。システムは、稼働中も引き続き機能します。
リカバリサポート:キュー自体のメッセージは持続しました。キューが失敗した場合、メッセージは後で復元できます。
信頼できる通信:クライアント要求を処理するシステムを検討します。通常、システムは1分あたり100件のリクエストを受け取ります。このシステムは、リクエストの数が平均を超えると信頼できません。このような場合、キューはリクエストを管理でき、システムスループットに基づいて定期的にメッセージをプッシュすることができます。
非同期:クライアントサーバー通信は非ブロッキングです。クライアントがサーバーに要求を送信すると、応答を待たずに他の操作を実行できます。受信した応答は、クライアントがいつでも処理できます。
から ウィキペディア
Apache ActiveMQは、完全なJava Message Service(JMS)クライアントとともにJavaで記述されたオープンソースのメッセージブローカーです。この場合、複数のクライアントまたはサーバーからの通信を促進することを意味する「エンタープライズ機能」を提供します
クエリについて:
なぜデータベースを使用しないのですか?
一時データではなく、永続データにデータベースを使用する必要があります。送信者から受信者にメッセージを送信する必要があると仮定します。メッセージを受信すると、Receiverは1つの操作(receive、processおよびforget)を実行します。そのメッセージを処理した後、そのメッセージはまったく必要ありません。この場合、メッセージを永続的なデータベースに保存するのは適切な解決策ではありません。
メッセージングシステムの代わりにデータベースを使用する場合、データベースでのメッセージの挿入と削除に関する@ Hiram Chirinoの回答に完全に同意します。
ActiveMQがそのデータベースに持っていない機能が必要ですか?
沢山あります。詳細については、 documentation ページをご覧ください。 se-cases もご覧ください。
ActiveMQの内部を理解するには、この プレゼンテーション をご覧ください。
複数の場所で同時に使用されているアプリケーションがあるとします。また、アプリケーションが1分あたり数千のリクエストなどを処理する必要があるため、通常のdb操作ではそのような操作を処理できない場合、Activemqはすべてのメッセージをキューに入れるメッセージ処理として機能するため、アプリケーションの1つが1つの場所でクラッシュしても他の場所は影響を受けません。