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に送信できます。これにより、上記のようにアプリケーションでセレクターを使用する必要がなくなります。
これを行うには、 リシーケンサー から エンタープライズ統合パターン