2015-12-14 14 views
7

私はRabbitMQの統合についてSymfonyアプリケーションに多くの(偉大な)記事を読んでいます。Symfony:rabbitmq:consumerコマンドをcrontabに追加する必要がありますか?

RabbitMqBundleはそれが非常に簡単にそれを恩知らずすることができ、そしてそれは、このようなキューからメッセージを消費するために便利なrabbitmq:consumerコマンドが用意されています

app/console rabbitmq:consumer -m 50 upload_picture 

私はしかし、疑問を持っています。このコマンドをcrontabに追加することをお勧めしますか?それに関するベストプラクティスはありますか?

+1

サイドノート-m 50は常に信頼できるものではありません。たとえば、いくつかのメソッドがキューに入れられると、接続が失われてしまうという問題が発生します。それは長いアイドル期間のために起こります。コマンドが実際に働く時間を制限する方がよいでしょう。すべての接続タイムアウトがこの制限に縛られる可能性があります。消費者は1時間働いて終了するので、タイムアウトは1時間20分に設定できます。これはrabbitmqバンドルが逃したものですが、エンキューバンドルで利用できます(--limit-time = "now + 1 hour"オプション)。 –

答えて

6

より受け入れられる方法は、消費者を継続的に実行することです。あなたを助けることができるSupervisorCircusのようなツールがあります。 this discussionを参照してください。しかし、メッセージがなくなったときに消費者を出させることができれば、cronを使うこともできます。ただし、メッセージの消費が遅れることがあります。あなたは即座にメッセージに反応することはできません。ユーザーは、タスクが開始される/メールが受信されるまで1分待たなければならない場合があります。長い時間のためにあなたの消費者(またはそのことについては任意のPHPコード)を実行しているとき

アカウントに次のことを行ってください:

をメモリ使用量の蓄積を避けるようにしてください。配列をクリアしないで配列に追加し続けないでください。たとえば、ログメッセージのバッファを保持するので、FingersCrossedHandlerをMonologで使用しないでください。デバッグメッセージの数日間ではなく、1回のリクエストでうまくいく。

注意しても、PHPがメモリをリークする可能性があります。あなたは何を言うことができます、PHP ...(それは確かにキャッチフレーズかもしれません)私の状況で私は毎晩労働者を再起動cronjobがインストールされていますが、理論的には、消費者は彼らがメモリを使い果たす前に約1ヶ月実行することができます。

+5

ありがとうございます。これはまさに私が探していたもので、RabbitMQ for Symfonyチュートリアルで言及されたことはありません。 RabbitMQBundleの自動スーパーバイザ設定を処理する興味深いSymfonyバンドルがあるようです:https://github.com/Phobetor/rabbitmq-supervisor-bundle –

+1

"このディスカッション"の下にある問題リンクはオフです。 – Cassiano

+1

私は実際の信頼性の問題を持っている最初のコメントで言及バンドルを避けるだろう。 –