18

私は実際の運用環境でメッセージング システムの良い面と悪い面を経験してきました。よく整理されたテーブルまたはテーブルのスキーマは、他の形式のメッセージング キューよりも優れていることを認めなければなりません。その理由は次のとおりです。

  1. データはテーブルに永続的に保存されます。キャッチされない例外やその他のバグのために途中でメッセージが失われたり消えたりする、非常に多くの Java (jms) アプリケーションを見てきました。
  2. キューはいっぱいになる傾向があります。代わりに、DB ストレージは事実上無限です。
  3. テーブルには簡単にアクセスできますが、難解な手段を使用してキューから読み取る必要があります。

それぞれのアプローチについてどう思いますか?

4

5 に答える 5

35

フレーズは毎回完全にあなたの要件が何であったかによって異なります。確かに、誰にとっても毎回勝てるわけではありません。

すでにデータベースを使用している単一のシステムを構築している場合、非常に高いパフォーマンスのスループット要件がなく、他のチームやシステムと通信する必要がない場合は、おそらく正しいでしょう。

シンプルで低スループット、ほとんどがシングル スレッドの場合、データベースはメッセージ キューの完全に優れた代替手段です。

メッセージ キューが輝くのは、次の場合です。

  • 多くのサーバー/プロセスで毎秒数万のメッセージを同時に処理できるように、高性能で同時実行性が高くスケーラブルなロード バランサーが必要な場合スレッドは、1 つのプロセスがメッセージ キュー テーブルをロックする傾向があるため、かなり困難です)。
  • 異なるデータベースを使用して異なるシステム間で通信する必要がある (そのため、システム データベースへの書き込みアクセス権を別のチームの他の人に渡す必要はありません)。

単一のデータベース、チーム、およびかなり控えめなパフォーマンス要件を持つ単純なシステムの場合は、必ずデータベースを使用してください。仕事などに適したツールを使用してください。

ただし、メッセージ キューが優れているのは、相互に通信する必要のあるシステムが多数ある大規模な組織 (したがって、ビジネス データベースが障害の中心点やバージョン地獄の場所になることを望まない) や、高いパフォーマンス要件。

パフォーマンスの点では、メッセージ キューは常にデータベース テーブルよりも優れています。メッセージ キューはジョブ用に特別に設計されており、ペシミスティック テーブル ロック (キューのデータベース実装に必要 - 負荷分散を行うために必要) に依存しないためです。また、優れたメッセージ キューは、キューへのメッセージの熱心な読み込みを実行して、データベースのネットワーク オーバーヘッドを回避します

同様に、Web サーバー間で HTTP リクエストのロード バランシングを行うためにデータベースを使用することはありません。これは遅すぎるためです。ロード バランサーに高いパフォーマンスが必要な場合は、データベースも使用しません。

于 2008-11-03T12:10:06.100 に答える
9

最初にテーブルを使用してから、理由がある場合 (および場合) に本格的な msg キューにリファクタリングします。これは、設計が合理的であれば些細なことです。

最大の利点は、a.) 簡単である、(b. 結合する他のテーブルがあるため、より優れた監査証跡になる、c.) データベース ツールをよく知っていれば、メッセージ キュー ツールよりも使いやすい、ということです。 、d.) 通常、アプリ用に既に存在するコンテキストでテスト/開発環境をセットアップする方が少し簡単です (同じ知識が適用される場合)。

ああ、そして e.) おそらくあなたや他の人にとって、学習、インストール、構成、管理、およびサポートを行うのは別の製品ではありません。

IMPE、それは信頼性が高く、切断可能であり、よりスケーラブルな必要がある場合は変換できます.

于 2008-11-01T17:44:21.123 に答える
9
  1. データはテーブルに永続的に保存されます。キャッチされていない例外やその他のバグのために途中でメッセージが失われたり消えたりする、非常に多くの Java (jms) アプリケーションを見てきました。

    どの JMS 実装ですか? Sun は、メッセージを失わない信頼できるキューを販売しています。おそらく、安っぽい JMS 準拠の製品を購入したばかりではないでしょうか。IBM の MQ は非常に信頼性が高く、それにアクセスするための JMS ライブラリがあります。

  2. キューはいっぱいになる傾向があります。代わりに、DB ストレージは事実上無限です。

    うーん...キューがいっぱいになると、何かが壊れているように聞こえます。アプリがクラッシュした場合、それは良いことではありません。キューはそれとはほとんど関係がありません。本当に質の悪い JMS 実装を購入した場合、どこに不満があるのか​​がわかります。それは競争の激しい市場です。より優れたキュー・マネージャーを見つけてください。Sun の JCAPS には、以前は SeeBeyond メッセージ キューであった、非常に優れたキュー マネージャーがあります。

  3. テーブルには簡単にアクセスできますが、難解な手段を使用してキューから読み取る必要があります。

    それは私の経験と一致しません。テーブルは、この独特の「他の言語」(SQL) を介してアクセスされ、テーブルからオブジェクトへの構造マッピングと、VARCHAR2 から文字列へのデータ型マッピングを認識する必要があります。さらに、ある種のアクセス層 (JDBC または JDBC を使用する ORM) を使用する必要があります。それは非常に複雑に思えます。単純な送受信を使用して、MessageConsumers と MessageProducers を介してキューにアクセスします。

于 2008-11-01T18:51:57.333 に答える
7

あなたが経験した問題は、メッセージングに固有のものではなく、不十分に実装されたメッセージング システムの成果物のように思えます。メッセージング システムの構築は、データベース システムの構築よりも難しいですか? はい、データベース システムを構築するだけなら。

  • キャッチされない例外でメッセージが失われますか? これは、メッセージ キューのせいではありません。使用しているアプリケーションの設計が不十分です。処理が完了する前にキューからメッセージを削除しています。彼らはトランザクションやジャーナリングを使用していません。
  • DBストレージが「事実上無限」である間にメッセージキューがいっぱいになりますか? あなたは、ディスク領域の管理はデータベースには必要ないものであるかのように話します。データベース サーバーと同様に、メッセージ キュー サーバーにも管理が必要です。
  • キューから読み取るための難解な楽器?たぶん、非同期メソッドが難解だと思うなら。たぶん、シリアライゼーションとデシリアライゼーションが難解だと思うなら。(少なくとも、これらは私がメッセージングを学んでいるときに難解だと感じたものです。多くの一見難解なテクノロジと同様に、それらは実際には理解すると非常にありふれたものであり、それらを理解することは経験豊富な開発者の教育の重要な部分です。)

データベースより優れているメッセージングの側面:

  • 非同期処理。 メッセージ キューは、新しいメッセージが到着すると、待機中のプロセスに通知します。データベースでこの機能を実現するには、待機中のプロセスがデータベースをポーリングする必要があります。
  • 関心事の分離。 通信チャネルは、メッセージ コンテンツの実装の詳細から切り離されます。送信者と受信者だけが、特定のメッセージ内のデータ ストリームの形式について知る必要があります。
  • 耐障害性。. メッセージングは​​、サーバー間の接続が断続的な場合に機能します。メッセージ キューは、メッセージをローカルに保存し、接続が有効な場合にのみリモート サーバーに転送できます。
  • システム統合。 少なくとも Windows の世界では、メッセージングは​​オペレーティング システムに組み込まれています。OS のセキュリティ モデルを使用し、OS のツールなどを通じて管理されます。

これらが必要ない場合は、おそらくメッセージングは​​必要ありません。

メッセージング用のアプリケーションの簡単な例を次に示します。私は現在、複数のネットワークに分散しているユーザーが、印刷出力の生成に使用されるかなり複雑な一連のトランザクションを入力するシステムを構築しています。出力生成は計算コストが高く、ワークフローの一部ではありません。つまり、ユーザーはいつ出力が生成されるかを気にしません。

そのため、トランザクションをメッセージにシリアル化し、キューにドロップします。サーバー上で実行されるプロセスは、キューからメッセージを取得し、出力を生成して、出力をイメージング システムに格納します。

データベースをメッセージ ストアとして使用した場合、現在は送信者と受信者だけが関心を持っているトランザクション フォーマットを格納するためのスキーマを作成する必要があり、ネットワーク上のすべてのワークステーションに永続的なデータベース サーバーへの永続的な接続がなければ、このトランザクションの負荷を複数のサーバーに分散する能力がなく、出力サーバーは、処理する新しいジョブがあるかどうかを確認するために、1 日に何千回もデータベースにクエリを実行する必要があります。

于 2008-11-01T21:03:02.563 に答える
2

キューは、信頼できるメッセージングを提供します。キューイングのストア アンド フォワードの切断された性質により、データベースよりもはるかにスケーラブルであり、さらに堅牢であることは言うまでもありません。

また、キューは情報の永続的な保存に実際に使用するべきではありません。データベースとは異なり、キューを一時的な受信トレイと考えるのが最善です。

于 2008-11-01T17:27:57.037 に答える