[解決済み】なぜPostgreSQLのようなデータベース上でRabbitMQのようなメッセージブローカーが必要なのでしょうか?
質問
私は、以下のようなメッセージブローカーを初めて利用します。 ラビットMQ のようなスケジューリングシステムのタスク/メッセージキューを作成するために使用することができます。 セロリ .
さて、ここで問題です。
-
でテーブルを作成することができます。 PostgreSQL 新しいタスクが追加され、Celeryのような消費プログラムによって消費されることができます。
-
一体なぜ、RabbitMQのような全く新しい技術をセットアップする必要があるのでしょうか?
PostgreSQLのようなデータベースは分散環境でも動作するので、スケーリングが答えになるとは思えません。
ある問題に対して、データベースがどのような問題を引き起こすのか、ググってみたら、ありました。
- ポーリングによってデータベースが忙しくなり、低パフォーマンスになる
- テーブルのロック ->これも低パフォーマンス
- 数百万行のタスク -> ここでもポーリングは低性能です。
さて、RabbitMQやその他のメッセージブローカーは、これらの問題をどのように解決しているのでしょうか?
また
AMQP
プロトコルに従うものです。それのどこがすごいんですか?
可能 レディス は、メッセージブローカーとしても使えるのでしょうか?RabbitMQよりもMemcachedに類似していると思います。
是非ともご教示ください。
解決方法は?
Rabbitのキューはメモリ上に存在するため、データベースで実装するよりもはるかに高速になります。良い)専用メッセージキューは、スロットリング/フロー制御や、異なるルーティングアルゴリズムを選択する機能など、キューイングに関する重要な機能も提供する必要があります(rabbitはこれらを含む)。プロジェクトの規模にもよりますが、メッセージパッシングコンポーネントをデータベースから分離し、一方のコンポーネントが高負荷になっても、もう一方のコンポーネントの動作を妨げることがないようにすることもできます。
ご指摘の問題点についてですが
-
データベースをビジー状態にして低パフォーマンスを維持するポーリング : Rabbitmqを使用することで、プロデューサーは以下のことが可能になります。 プッシュ ポーリングよりもはるかに高いパフォーマンスでコンシューマに更新します。データは必要な時にコンシューマに送られるだけなので、無駄なチェックが不要になります。
-
テーブルのロック ->また低性能です。 ロックするテーブルがない :P
-
数百万行のタスク -> 再びポーリングは低パフォーマンスです。 前述の通り、RabbitmqはRAMを常駐させ、フロー制御を行うため、より高速に動作します。また、必要に応じて、RAMがなくなった場合、ディスクを使用してメッセージを一時的に保存することもできます。2.0以降、RabbitはRAM使用率を大幅に向上させました。また、クラスタリングオプションも利用可能です。
AMQPに関しては、quot;exchange"と他のexchangeにルーティングする機能がとてもクールな機能だと思います。これにより、より柔軟性が増し、スケーリング時に非常に便利な様々な精巧なルーティングの類型を作成することができます。良い例としては、以下を参照してください。
<サブ
(出典
スプリングソース・ドット・コム
)
最後に、Redisについてですが、はい、メッセージブローカーとして使うことができますし、うまくやることも可能です。しかし、RabbitmqはRedisよりもメッセージキューの機能が充実しており、rabbitmqは全機能を備えたエンタープライズレベルの専用メッセージキューとして一から構築されています。一方、Redisは主にインメモリのKey-Valueストアとして作られました(現在ではそれ以上の機能を持っており、swiss army knifeとさえ呼ばれています)。しかし、私は多くの人が小規模なプロジェクトではRedisで良い結果を出していると聞いたことがありますが、大規模なアプリケーションではあまり聞いたことがありません。
ここでは、ロングポーリングチャットの実装でRedisを使用した例を紹介します。 http://eflorenzano.com/blog/2011/02/16/technology-behind-convore/
関連
-
[解決済み] PostgreSQLのCASE ... 複数条件付きEND
-
[解決済み] Ubuntu 18.04でPostgreSQLを再起動する方法
-
[解決済み] postgresでスーパーユーザーを作成する
-
[解決済み] PostgreSQLでデータベースのコピーを作成する
-
[解決済み] PostgreSQLデータベースにアクティブな接続がある場合、そのデータベースを削除する方法は?
-
[解決済み] PostgreSQLデータベースへのSQLダンプのインポート
-
[解決済み】postgresql - テキストフィールド内の文字列のすべてのインスタンスを置換する
-
[解決済み】Postgresのインストール時に入力したパスワードを忘れてしまいました。
-
[解決済み】ライブラリがロードされない。/usr/local/opt/readline/lib/libreadline.6.2.dylib
-
[解決済み】PostgreSQL ERROR:リカバリーと競合するため、ステートメントをキャンセルする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] ERROR: テーブル "tablename" の更新または削除は外部キー制約に違反します。
-
[解決済み] "psql: サーバーに接続できませんでした。リモートデータベースへの接続時に「Connection refused」エラー
-
[解決済み] ポストグレス \コピー構文
-
[解決済み] Ubuntu 18.04でPostgreSQLを再起動する方法
-
[解決済み] PostgreSQLのプロセスが "Idle in transaction "である場合、どのような意味がありますか?
-
[解決済み】psql: FATAL: ユーザー "postgres" の Ident 認証に失敗しました。
-
[解決済み】PostgreSQLで、既存のテーブルに自動インクリメントの主キーを追加する方法は?
-
[解決済み】PostgreSQL ERROR:リカバリーと競合するため、ステートメントをキャンセルする
-
[解決済み】psql - コマンドの結果をファイルに保存する
-
[解決済み] [Solved] "on delete cascade "制約を追加する方法は?