2016-08-17 7 views
1

私は、RackbitMQが未実装のメッセージで「固まっている」ことを確認しました。待ち行列にはもう存在しない消費者が表示されます。私は、RabbitMQがそのコンシューマにメッセージを引き続き送信していることを想定しています。これらのメッセージは、増え続けるメッセージの数が増えていることを示しています。私はphp-amqplibでPHPでこれをやっています。rabbitMQがphp-amqplibでハートビートを使用できない

私は消費者プロセスを殺すことによって問題を引き起こすことができます(コマンドラインではcontrol-C)。

私は3秒のハートビートを指定しようとしましたが、キープアライブをtrueとfalseの両方で試しました。ハートビートを使用すると、消費者は最終的に失敗します:

Exception fwrite(): send of 573 bytes failed with errno=32 Broken pipe 
PhpAmqpLib\Wire\IO\StreamIO->error_handler(8, 'fwrite(): send ...', 
php-amqplib/PhpAmqpLib/Wire/IO/StreamIO.php(281): fwrite(Resource id #176, '\x01\x00\x01\x00\x00\x00\x15\x00<\x00(\x00\x00\fb...', 8192) 

問題#374が関係あります:https://github.com/php-amqplib/php-amqplib/issues/374

を消費者が複数のキューから消費しているが、私はそれは問題ではないはずと信じています。

私が解決しようとしている問題は、RabbitMQが消費者が存在しないときに存在していると考え続けていることです。その結果、RabbitMQはこれらのメッセージをどこにも届かず、無認可になります。私は、それらのメッセージを実際の消費者に再配信できるように、その偽の接続を取り除く方法を探しています。私はそれが心拍のためだと思うが、私はそれを働かせていない。

+0

ハートビートhereとデッドTCP接続の検出についての詳細を読むことができますを有効にしているのですか? – cantSleepNow

+0

私はしません。私は、メッセージの作業が完了した後に、拒否を介してスロットルをすることができる必要があります。 –

答えて

2

この場合、最初に、もっと重要なことは、コンテンツメッセージを「印刷」し、消費者に真実を返そうとしていること、実際のコードを処理しないこと、メッセージを「消費」できることおそらく私たちはウサギへのメッセージを承認するために多くの時間を費やし、ウサギは私たちの結びつきを閉じてしまうからです。

私のケースでは、メッセージごとに多くの製品IDがあり、ACK処理に長い時間を費やすため、この問題のアプローチを変更しています。私のメッセージに合っていて、うまくいきました。

このメッセージに合わせて別のキューを作成するなどのアプローチを変更できますが、わかりませんが、問題の90%はそれです。あなたは自動ACKは、あなたの消費者に

あなたは

+0

残念ながら、これは述べられた問題を助けません。問題は、消費者がメッセージを確認するのに時間がかかりすぎるということではありません。メッセージは約20ミリ秒以内に確認されます。問題は、消費者プロセスはもはや存在しないと私は信じているが、RabbitMQは消費者が依然として存在すると考える。これはRabbitMQ管理ページ(キューへのコンシューマ接続数)で確認できます。 RabbitMQはメッセージを引き続き配信しますが、実際には何も受信されていません。私は管理ページ上で、確認できないメッセージの数が上がったり上がったりするのを見ることができます。 –

関連する問題