activeMQで優先キューをサポートするにはどうすればよいですか

How Can I Support Priority Queues Activemq

メッセージ優先度を使用する

一般的な要件は、優先度の高いメッセージが低い優先度の前に消費されるように、優先度の消費をサポートすることです。

バージョン5.4では、優先キューがサポートされています。メッセージカーソルとメッセージストア(KahaDBとJDBC)の両方が、メッセージの優先度をサポートします。サポートはデフォルトで無効になっているため、を使用して有効にする必要があります 宛先ごとのポリシー xml構成により、以下の例では、「prioritizedMessages」がすべてのキューに対して有効になっています。



'>' prioritizedMessages='true'/> ...

優先度の値の全範囲(0〜9)は、 JDBC メッセージストア。ために KahaDB 低(4)の3つの優先カテゴリがサポートされています。

メッセージカーソル(およびクライアント側)は優先順位の厳密な順序付けを実装しているため、メッセージディスパッチがキャッシュから発生し、ディスクに到達する必要がない場合(つまり、コンシューマーがプロデューサーに追いつくのに十分な速度である場合)、厳密な優先順位を監視できます。 )、またはディスクにフラッシュする必要のない非永続メッセージを使用している場合(FilePendingMessageCursorを使用)。ただし、コンシューマーが遅い、またはプロデューサーが非常に速いという状況に陥ると、キャッシュがいっぱいになり(優先度の低いメッセージでいっぱいになる可能性があります)、優先度の高いメッセージがディスクにスタックし、それらが利用できるようになるまで使用できなくなります。この場合、最適化されたメッセージディスパッチを優先度の適用とトレードオフすることを決定できます。キャッシュ、メッセージの有効期限チェックを無効にし、コンシューマーのプリフェッチを1に下げると、優先度の低いメッセージよりも優先度の高いメッセージをストアから確実に取得できます。この種のトレードオフはパフォーマンスに重大な影響を与える可能性があるため、シナリオをテストする必要があります。徹底的に。 :

'>' prioritizedMessages='true' useCache='false' expireMessagesPeriod='0' queuePrefetch='1' /> ...

代替戦略

セレクターを使用する

セレクターを使用して100人の消費者が優先度の高いものを見つけることができます

JMSPriority > 6

次に、50人の消費者が平均以上のことをしている

JMSPriority >= 4

次に、10人の消費者がすべてのメッセージを消費していると言います(つまり、すべての優先順位)。このようにして、常に優先度の高いメッセージを処理するスレッドのプールができます。これにより、ActiveMQがメッセージをバッチ処理して、メッセージをディスパッチする前に並べ替える必要がなく、非常に効率的な優先度ベースのメッセージのディスパッチが可能になります。

リシーケンサーを使用する

クライアントを変更する必要がないように、一部の入力キューAでメッセージを並べ替えて、並べ替えられた順序でキューBに送信できます。これにより、上記のようにアプリケーションでセレクターを使用する必要がなくなります。

これを行うには、 リシーケンサー から エンタープライズ統合パターン