多数の永続キュー (250) 1000 永続 TextMessages 10 KB で ActiveMQ を使用すると問題が発生します。
シナリオでは、これらのメッセージが消費されるまで、長期間 (数日) にわたってストレージに保持する必要があります (大量のデータが多数のコンシューマーに配布するためにステージングされ、数日間オフラインになる可能性があります)。
Persistence Store がこれらのメッセージでいっぱいになった後、ブローカーの再起動 後、30 秒後に #checkpoint が呼び出されるまで、いくつかのキューを参照/消費できます。
この呼び出しにより、ブローカは使用可能なすべてのメモリを使用し、キューの参照/消費などの他のタスクのためにメモリを解放することはありません。内部的に、MessageCursor はメモリが不足していると判断したようで、ブラウザ/コンシューマへのキュー コンテンツの配信を停止します。
=> 構成によってこの動作を回避する方法はありますか、それともバグですか?
期待されるのは、すべての状況で任意のキューを消費/参照できることです。
以下の設定は現在しばらくの間本番環境にあり、ActiveMQ のドキュメントに記載されているいくつかの推奨事項が適用されています (宛先ポリシー、systemUsage、永続ストア オプションなど)。
- 動作は ActiveMQ: 5.11.2、5.13.0、および 5.5.1 でテストされています。
- メモリ設定: Xmx=1024m
- Java: 1.8 または 1.7
- OS: Windows、MacOS、Linux
- PersistenceAdapter: KahaDB または LevelDB
- ディスク: 十分な空き容量 (200 GB) と物理メモリ (最大 16 GB)。
上記の設定に加えて、ブローカーには次の設定を使用します (ちなみに、memoryLimit を 1mb のような低い値に変更しても状況は変わりません)。
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue=">" producerFlowControl="false" optimizedDispatch="true" memoryLimit="128mb" timeBeforeDispatchStarts="1000">
<dispatchPolicy>
<strictOrderDispatchPolicy />
</dispatchPolicy>
<pendingQueuePolicy>
<storeCursor />
</pendingQueuePolicy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
<systemUsage>
<systemUsage sendFailIfNoSpace="true">
<memoryUsage>
<memoryUsage limit="500 mb" />
</memoryUsage>
<storeUsage>
<storeUsage limit="80000 mb" />
</storeUsage>
<tempUsage>
<tempUsage limit="1000 mb" />
</tempUsage>
</systemUsage>
</systemUsage>
memoryUsage と利用可能なヒープ領域の違いに応じて、 destinationPolicy のcursorMemoryHighWaterMarkを150または600などのより高い値に設定すると、回避策として状況が少し緩和されますが、これは実際には本番システムのオプションではありません。見る。
メモリから決して解放されない ActiveMQTextMessage インスタンスを示す Oracle Mission Control からの情報を含む画面: