管理RabbitMQ消费者

时间:2013-11-05 16:25:40

标签: symfony rabbitmq

我打算使用RabbitMQ,Symfony2和RabbitMqBundle编写日志处理应用程序。 我正在处理的工具必须具有高可用性,并且每天必须处理数百万个条目,因此消费者始终启动并运行(短暂休息很好)非常重要,否则我的队列可能会在一段时间后溢出。

是否有关于如何管理使用者的最佳实践(用PHP编写),在出现错误时启动/重启?等等?

由于

2 个答案:

答案 0 :(得分: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代码中获取了基础。

答案 1 :(得分: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 - 将终止所有已找到的流程
  5. 启动消费者

    使用名称my_consumer启动您的消费者

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

    我在项目中有很多消费者,部署后很难重新启动它们。我开始使用Capistrano + Symfony plugin来部署我的项目。我根据yaml配置编写了一些自定义任务来启动/停止/重启消费者。任务基于上面的命令。