1

ディスク レベルまたはメモリ ウォーターマーク アラートが原因で、RabbitMQ が接続をブロックし始めた状況を処理するために、意味のあるコードを作成しようとしています。

接続をブロック モードに設定することに関する通知のハンドラーを追加する可能性があります。

ただし、この通知は、接続を閉じようとしたときにのみ送信されるようです。

とても走っている

$this->channel->basic_publish($msg, $this->exchangeName, $route);

正常に実行されますが、ハンドラーはブロックされた接続に関する通知を受け取りません。

同時に、メッセージはキューに追加されません - ダッシュボードからわかります。

しかし、明示的に接続を閉じようとすると:

$this->channel->close();

または暗黙的に(スクリプトを終了させるだけで、AMQPオブジェクトデストラクタが残りを行います)チャネルがブロックされたという通知を受け取り、その後、スクリプトはフリーズします。

問題は、公開時 (または公開直後) にブロックされたチャンネルに関する情報を取得する方法です。また、ブロックされた接続でスクリプトが永遠に待機するのを回避するにはどうすればよいですか?

前もって感謝します。

4

1 に答える 1

1

わかりました、答えがあるようです。

RabbitMQ は、アクティブな接続に通知を送信します。

したがって、メモリまたはディスクの問題が発生しているサーバーへの接続を作成しようとすると、これらの通知はまったく役に立ちません。

しかし、接続がアクティブな場合、メッセージを公開しようとした直後にブロックに関する通知が届きます。

次に、新しい接続を作成する段階でサーバーに問題が発生していることを検出する方法を理解する必要があります。しかし、これは別の問題です。

于 2016-05-09T23:05:07.510 に答える