アプリのログを処理するためにRabbitMQを使用しています(Windowsサーバー2008のインストール)。アプリは交換にメッセージを送信します。メッセージを転送する専用のキューがあります。次に、Windows サービスをそのキューに接続し、メッセージを取り出して DB に永続化します。ストリームをラッチするためにリアルタイムで交換に接続する n 数のクライアントがあるため、一度に n 数の接続があります。これらのクライアントの一部は、コードで接続を Close() しない可能性があります。多くのクライアントは長時間接続しています。
メッセージがキューから取り出されると、メッセージは自動的に確認応答されるため、未確認のメッセージがキューにありません。しかし、ラビットの記憶は時間の経過とともに成長しているのを見ています。最初にオンにしたときは32K程度で始まり、しきい値を超えて着信接続をブロックするまで忍び寄ります.
.NET クライアントと Java クライアントの両方を持っていますが、どちらも自動応答です。
ドキュメントを読んでも、Rabbit がどのようにメモリを使用しているかについての説明は見当たりませんでした。つまり、時間の経過とともにメモリが膨張する理由がわかりません。メッセージが引き離されて承認されているということは、Rabbit がこれ以上それを保持していないため、関連するメモリを解放して、安定したメモリ使用プロファイルを引き起こしていることを意味しているように思えます。
Rabbit のメモリ ダイヤルをいじっても、どれだけ効果があるかわかりません。
私の推測では、時間の経過とともにメモリが増加する原因となっているクライアントで何か間違ったことをしているのですが、それがなぜなのかはわかりません。
why does Rabbit memory usage creep up when no messages are kept on any queues?
what coding practices could cause the RabbitMQ server to
retain (and grow) memory?