web-dev-qa-db-ja.com

RabbitMQエラーのタイムアウト

外部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です。

お時間とご意見をよろしくお願いします!

18
user927901

私はpythonで同様の問題を解決しました。私の場合、コンシューマのプリフェッチカウントを減らすことで解決され、受信バッファにキューイングされるメッセージが少なくなりました。

私の理論では、コンシューマーの受信バッファーがいっぱいになると、RMQは他のメッセージをコンシューマーのソケットに書き込もうとしますが、コンシューマーのソケットがいっぱいであるためにできません。 RMQはこのソケットをブロックし、最終的にタイムアウトして、コンシューマーの接続を閉じます。プリフェッチキューを小さくすると、ソケットの受信バッファーがいっぱいにならず、RMQは実行しようとしたブックキーピングメッセージを書き込むことができるため、書き込みがタイムアウトしたり、接続を閉じたりしません。

これは理論にすぎませんが、私のテストでは保持されているようです。

Pythonでは、プリフェッチカウントの設定は次のように行うことができます。

subChannel.basicQos(10);

(このコードスニペットを追加するように通知してくれた@ shawn-guoに感謝)

27
tul

@tulの回答にさらに追加してください。

subChannel.basicQos(10); 

コンシューマーのプリフェッチ数を減らすと、このタイムアウト例外がなくなります。
デフォルトのプリフェッチ数は無制限です。

12
Shawn Guo