PostgreSQLなどのデータベースではなく、RabbitMQなどのメッセージブローカーが必要なのはなぜですか?


214

私のようなメッセージブローカーに新しいですRabbitMQの私たちのようなスケジューリングシステムのためのタスク/メッセージ・キューを作成するために使用することができますセロリ

さて、ここに質問があります:

  • 新しいタスクを追加し、Celeryなどのコンシューマープログラムで使用できるPostgreSQLでテーブルを作成できます。

  • なぜ、RabbitMQのように、まったく新しいテクノロジーをセットアップしたいのですか?

PostgreSQLのような私たちのデータベースは分散環境で動作することができるので、今、私はスケーリングが答えではないと信じています。

データベースが特定の問題に対してどのような問題を引き起こすかを探してみたところ、次のことがわかりました。

  • ポーリングはデータベースをビジー状態に保ち、パフォーマンスを低下させます
  • テーブルのロック->再び低パフォーマンス
  • 数百万行のタスク->再度、ポーリングのパフォーマンスは低い

では、RabbitMQなどのメッセージブローカーは、これらの問題をどのように解決するのでしょうか。

また、私AMQPはプロトコルがそれに続くものであることを発見しました。その中で何が素晴らしいのですか?

Redisはメッセージブローカーとしても使用できますか?RabbitMQよりMemcachedに似ています。

これに光を当ててください!


9
PostgreSQLを使用すると、リーダーがライターによってブロックされないMVCCが実装されるため、ロックの影響ははるかに少なくなります。メッセージキューとしてのデータベースの使用を批判した記事のほとんどは、MySQLを念頭に置いています。
CadentOrange 2014年

メッセージブローカーはノード間でデータを移動し、データベースはデータを1か所に保持します。複数のノードからデータベース内のデータにアクセスできるという事実は、一見すると、ノード間でデータをすばやく転送するための優れたツールにはなりません。
theMayer

2
「のようなスケジューリングシステムcelery」— 質問から、設計に役立つ何かを学びました。今答えを読む...
マークKコーワン

メッセージブローカーのプロデューサーとコンシューマーの使用は分離されています。
Giorgi dvalishvili

下記リンクからご覧いただけます。幅広い説明があります:stackoverflow.com/a/51377756/3073945
Ms. Sajedul Karim

回答:


110

ウサギのキューはメモリに常駐するため、これをデータベースに実装するよりもはるかに高速です。(良い)専用のメッセージキューは、スロットル/フロー制御などの必須のキュー関連機能や、カップルに名前を付けるためのさまざまなルーティングアルゴリズムを選択する機能も提供する必要があります(ウサギはこれらを提供します)。プロジェクトのサイズによっては、メッセージパッシングコンポーネントをデータベースから分離することもできます。これにより、1つのコンポーネントに大きな負荷がかかった場合でも、他のコンポーネントの動作を妨げる必要がなくなります。

あなたが言及した問題については:

  • データベースをビジーで低パフォーマンスに保つポーリング:Rabbitmqを使用すると、プロデューサーは更新をコンシューマーにプッシュでき、ポーリングよりもはるかにパフォーマンスが高くなります。データは必要なときに消費者に送信されるだけなので、無駄なチェックの必要がなくなります。

  • テーブルのロック->再び低パフォーマンス:ロックするテーブルがありません:P

  • 数百万行のタスク->ポーリングのパフォーマンスが低い:上記のように、RabbitmqはRAMに常駐しているため高速で動作し、フロー制御を提供します。必要に応じて、RAMが不足した場合にディスクを使用してメッセージを一時的に保存することもできます。2.0以降、RabbitのRAM使用量は大幅に改善されました。クラスタリングオプションも利用できます。

AMQPに関して言えば、本当に素晴らしい機能は「交換」であり、それが他の交換にルーティングできることです。これにより、柔軟性が高まり、スケーリング時に非常に便利なさまざまな複雑なルーティングトポロジを作成できます。良い例については、以下を参照してください。


(ソース:springsource.com

および:http : //blog.springsource.org/2011/04/01/routing-topologies-for-performance-and-scalability-with-rabbitmq/

最後に、redisに関しては、はい、メッセージブローカーとして使用でき、うまく機能します。ただし、rabbitmqは完全に機能するエンタープライズレベルの専用メッセージキューになるようにゼロから構築されているため、Rabbitmqにはredisよりも多くのメッセージキューイング機能があります。一方、Redisは、主にメモリ内のKey-Valueストアとして作成されました(現在ではそれよりもはるかに多くの機能があります。スイスのアーミーナイフとも呼ばれます)。それでも、小規模なプロジェクトでRedisを使用して多くの人が良い結果を達成していることを読んだり聞いたりしましたが、大規模なアプリケーションでそれについてあまり聞いたことはありません。

ここでロングポーリングチャットの実装で使用されているのRedisの例です。http://eflorenzano.com/blog/2011/02/16/technology-behind-convore/


2
データベースの上にJMS実装(つまり、メッセージパッシングシステム)を実装しました。私はそれ可能であると言うことができますが、それ楽しいものではなく、それを行うために通常は報われません。あなたが言及する問題のいくつかは回避することができますが、それはかなり複雑さを増加させます。全体として、同意します。必要な場合は、専用のMQシステムを使用してください。ただし、ワークロードが低い場合は、DBでそれを回避できます。
ヨアヒムザウアー

1
あなたは単にすべての懸念/疑問をカバーしました。素晴らしい答え!
Yugal Jindle、

それは面白い。ちなみに一貫性はどうですか?キューに何百ものジョブがあり、それらをRAMに保持しているノードがクラッシュした場合はどうなりますか?
Mahn

22
実際、PostgreSQLでは、ポーリング(NOTIFYを参照)もテーブルロック(MVCCを参照)もありません。PostgreSQLはまだメッセージキューイング用に設計されていませんが、完全に不適切ではありません。
jkj 2012年

3
@jkjが言ったように、NOTIFYがあり、テーブルロックはありません。唯一の問題は、メッセージの高帯域幅のようです。Rabbitのようなまったく新しいシステムを維持する代わりに、専用のPostgreSQLインスタンスを用意できませんか?1)ボトルネックに到達するまで単一のPostgreSQLインスタンスを使用し、2)専用のPostgresを使用し、最後に3)ブローカーとしてRabbitに簡単に切り替えることができます。Rabbitから始めると最適化が進んでいるようです。
Joe

71

PostgreSQL 9.5

PostgreSQL 9.5にはが組み込まれていSELECT ... FOR UPDATE ... SKIP LOCKEDます。これは、作業待ち行列システムの実装になり多くの単純かつ簡単に。他のセッションがロックしていない 'n'行をフェッチし、作業が完了したことを確認するまでそれらをロックしておくことが簡単になったため、外部キューイングシステムは不要になる場合があります。外部調整が必要な場合は、2フェーズトランザクションでも機能します。

外部キューイングシステムは引き続き有用であり、缶詰機能、実証済みのパフォーマンス、他のシステムとの統合、水平スケーリングとフェデレーションのオプションなどを提供します。それでも、単純なケースでは、本当にそれらは必要ありません。

古いバージョン

そのようなツールは必要ありません、ツールを使用すると生活が楽になる場合があります。データベースでキューイングを行うのは簡単に見えますが、実際には、リレーショナルデータベースで高性能で信頼性の高い並行キューイングを行うことは非常に難しいことがわかります。

そのため、PGQなどのツールが存在します。

LISTENとを使用してPostgreSQLでポーリングを取り除くことができますNOTIFYが、高度な並行処理を維持し、挿入をブロックせずに、キューの先頭から1つのコンシューマーにエントリを確実に渡すという問題は解決されません。あなたが考えるすべての単純で明白な解決策はその問題を実際に解決するものではなく、シングルワーカーのキューフェッチの非効率なバージョンに退化する傾向があります。

高度な並行マルチワーカーキューフェッチが必要ない場合、PostgreSQLで単一のキューテーブルを使用することは完全に合理的です。


11
reliably handing out entries off the top of the queue to exactly one consumer while preserving highly concurrent operation and not blocking inserts. はそれを要約します-右?
Yugal Jindle、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.