20

外部 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

お時間とご意見をいただければ幸いです。

4

2 に答える 2

33

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

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

これは単なる理論ですが、私のテストでは保持されているようです。

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

subChannel.basicQos(10);

(このコード スニペットを追加することを思い出させてくれた @shawn-guo に感謝します)

于 2016-03-20T13:09:32.780 に答える
13

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

subChannel.basicQos(10); 

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

于 2016-08-18T14:44:53.773 に答える