5

RabbitMQ、Symfony2、RabbitMqBundle を使用してログ処理アプリケーションを作成する予定です。私が取り組んでいるツールは、可用性が高く、1 日に何百万ものエントリを処理する必要があるため、コンシューマーが常に稼働していることが重要です (短い休憩は問題ありません)。そうしないと、しばらくするとキューがオーバーフローする可能性があります。

コンシューマー (PHP で記述) を管理する方法、エラーが発生した場合にコンシューマーを開始/再起動する方法に関するベスト プラクティスはありますか?

ありがとう

4

2 に答える 2

5

この bash スクリプトを使用して、必要なすべてのコンシューマーがimagepush.toで実行されていることを確認します。

#!/bin/bash

NB_TASKS=1
SYMFONY_ENV="prod"

TEXT[0]="app/console rabbitmq:consumer primary"
TEXT[1]="app/console rabbitmq:consumer secondary"

for text in "${TEXT[@]}"
do

NB_LAUNCHED=$(ps ax | grep "$text" | grep -v grep | wc -l)

TASK="/usr/bin/env php ${text} --env=${SYMFONY_ENV}"

for (( i=${NB_LAUNCHED}; i<${NB_TASKS}; i++ ))
do
  echo "$(date +%c) - Launching a new consumer"
  nohup $TASK &
done

done

私の記憶が正しければ、KnpBundles コードからベースを取得しました。

于 2013-11-05T20:57:40.310 に答える
0

コンシューマを停止

my_consumer名前の使用で消費者を停止するには

kill `ps aux | less | grep 'rabbitmq:consumer my_consumer' | grep -v grep | awk '{print $2}'`
  1. ps aux | less | grep 'rabbitmq:consumer my_consumer'- コンシューマーの実行中のすべてのプロセスを検索します
  2. grep -v grep- 独自の検索プロセスを除外します
  3. awk '{print $2}'- 行からプロセス ID のみを取得します
  4. kill- 見つかったすべてのプロセスを終了します

コンシューマーを開始する

my_consumer名前の使用からコンシューマを開始するには

nohup /usr/bin/env php app/console rabbitmq:consumer consumer --env=prod &

プロジェクトには多くのコンシューマがあり、デプロイ後にそれらを再起動するのが難しくなりました。そして、Capistrano + Symfony プラグインを使用してプロジェクトをデプロイし始めました。yaml 構成に基づいてコンシューマーを開始/停止/再起動するカスタム タスクをいくつか作成しました。タスクは上記のコマンドに基づいています。

于 2016-01-26T04:16:56.140 に答える