2009-07-16 8 views
8

優先度メッセージ(AMQPなど)を一貫してサポートしないメッセージ指向のミドルウェアの場合、キューがFIFOセマンティクスのみを持つ場合に優先消費を実装する最適な方法?一般的なユースケースは、メッセージの大きなバックログがキューに存在する場合に、優先度の低いメッセージの前に優先度の高いメッセージを受信するシステムです。FIFO Qeueingシステムでは、優先メッセージングを実装する最良の方法は何ですか

+2

複数のキューを使用できますか?もしそうなら、優先順位キューが空の場合にのみ使用される標準キューの前に最初に照会される高優先順位メッセージ用の別個のキューを持つことをお勧めします。それがあなたのシナリオに合っているかどうかは分かりませんが、それが私の最初のアイディアでした。 – CodeFusionMobile

+0

私はCSharpWithJavaに同意します。私は現時点で大きなメッセージングアプリケーションをやっています。あなたの質問から、複数のキューが必要だと思うので、低いプライオリティのメッセージを下位のキューに降ろして、すぐにハイプライを読むことができます。 –

答えて

10

与えられた単一のキューに対してのみFIFOサポートが与えられた場合、もちろん、複数のキュー、仲介者のいずれかを導入するか、より複雑なコンシューマを持つ必要があります。

複数のキューは、いくつかの方法で処理できます。プロデューサとコンシューマは、優先度の高いキューとバックグラウンドタスクのキューの2つのキューを持つことに同意できます。

プロデューサが1つのキューに制限されていてもコンシューマを制御できる場合は、パスにファンアウトルータを導入することを検討してください。プロデューサ→ルータは単一のキューであるため、ルータは消費者に対して2つのキューを持っています。

これに対処するもう一つの方法は、消費者に待ち行列の前でスレッドをスピンさせ、次に内部的に作業をディスパッチさせることです。上記のルータバージョンのようなものですが、1つのアプリ内にあります。これには、アプリ内で複数のメッセージが飛んでいるという欠点があります。これは、エラーが発生した場合の復旧を複雑にする可能性があります。

優先度が高いイベントがまだぶら下がっていても、そのうちのいくつかを処理する必要がある場合は、効果的に優先度の低いイベントの枯渇を考慮する必要があります。

+1

これは、仕事中のプロジェクトに対してこの戦略を実装した人の多かれ少なかれです。優先度の高いシステムの複数のキュー。このような場合、重要度の低い重要度の低いメッセージを優先度の高いものとして再発行するだけで済みますので、飢餓についてはあまり心配しません。重複して作業が行われるのは、ほとんどの場合、これを可能にすることです。 – quaternion

関連する問題