外部APIからの約20.000のリクエストを解析するためにRabbitMQをセットアップしましたが、数分後にタイムアウトし続けます。合計20.000リクエストのうち、約2000を正しく解析できます。
ログファイルは言う:
=INFO REPORT==== 16-Feb-2016::17:02:50 ===
accepting AMQP connection <0.1648.0> (127.0.0.1:33091 -> 127.0.0.1:5672)
=ERROR REPORT==== 16-Feb-2016::17:03:21 ===
closing AMQP connection <0.1648.0> (127.0.0.1:33091 -> 127.0.0.1:5672):
{writer,send_failed,{error,timeout}}
ハートビート値はすでに増加していますが、なぜタイムアウトになるのかわかりません。構成は、Ubuntu 14.04、NGINX 1.8.1、RabbitMQ 3.6.0です。
お時間とご意見をよろしくお願いします!
私はpythonで同様の問題を解決しました。私の場合、コンシューマのプリフェッチカウントを減らすことで解決され、受信バッファにキューイングされるメッセージが少なくなりました。
私の理論では、コンシューマーの受信バッファーがいっぱいになると、RMQは他のメッセージをコンシューマーのソケットに書き込もうとしますが、コンシューマーのソケットがいっぱいであるためにできません。 RMQはこのソケットをブロックし、最終的にタイムアウトして、コンシューマーの接続を閉じます。プリフェッチキューを小さくすると、ソケットの受信バッファーがいっぱいにならず、RMQは実行しようとしたブックキーピングメッセージを書き込むことができるため、書き込みがタイムアウトしたり、接続を閉じたりしません。
これは理論にすぎませんが、私のテストでは保持されているようです。
Pythonでは、プリフェッチカウントの設定は次のように行うことができます。
subChannel.basicQos(10);
(このコードスニペットを追加するように通知してくれた@ shawn-guoに感謝)
@tulの回答にさらに追加してください。
subChannel.basicQos(10);
コンシューマーのプリフェッチ数を減らすと、このタイムアウト例外がなくなります。
デフォルトのプリフェッチ数は無制限です。