まず、キューは多くの場合、実際の DB テーブルに支えられており、メッセージの耐久性を維持できます。それはさておき、キューは、非同期で実行する必要がある作業を押しのけるための自然な方法です。最初からそのプリンシパルで設計すると、キューは非常に強力です。
テーブル (エンティティ) がハード列 (属性) のセットを持っているという事実を除けば、このテーブルは構成するレコードのセットで構成されているだけでなく、キューももののリストに過ぎません。 -a-table を正式なキューとして、定期的に (cron) ベースでポーリングしているだけです。
MQ は、通常、メッセージ自体へのアクセスを同期するという別の気の利いた機能を追加します (次のものを取得するために SQL でこれを行う場合と行わない場合があります)。
私は cron/table メカニズムを POLL ベース、MQ を EVENT ベースと考えるのが好きです。
私の意見では、キューの利点は、同期とステータスの更新を処理できることです。MQ は、「ブロードキャスト」(トピック) するように設定したり、コンシューマーまたはリスナーのグループにメッセージを提供したりできます。
MQ は非同期ですが、cron ウィンドウ間で動作する可能性があります。テーブルで処理するメッセージの数が、次の cron ジョブが実行されて前のジョブを実行しようとする前に達成できることをどのように知ることができますか?
MQ の複数のコンシューマーにより、必要に応じて作業をスケーリングできます。上記の例で、load average
(OS のプロセス キューとまったく同じ) が希望よりも大きいことがわかった場合は、別のコンシューマーをプロビジョニングして、その負荷を処理し、メトリックの要求に応じてオンまたはオフラインにすることができます。
MQ は、メッセージの優先度やパフォーマンスなどのさまざまな運用パラメーターを持つように設定できます (一部のキューはメモリに保持でき、その他はディスクに保持できます)。
欠点は、(既に述べたように) キューのクエリやメトリックの取得が難しい場合があることです。SQL でキューを自分で監視できるように、DB バッキング ストアを備えた MQ システムを常に見つけます。