我打算使用RabbitMQ,Symfony2和RabbitMqBundle编写日志处理应用程序。 我正在处理的工具必须具有高可用性,并且每天必须处理数百万个条目,因此消费者始终启动并运行(短暂休息很好)非常重要,否则我的队列可能会在一段时间后溢出。
是否有关于如何管理使用者的最佳实践(用PHP编写),在出现错误时启动/重启?等等?
由于
答案 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}'`
ps aux | less | grep 'rabbitmq:consumer my_consumer'
- 将查找消费者的所有正在运行的进程grep -v grep
- 将排除您自己的搜索过程awk '{print $2}'
- 只从行中获取进程ID kill
- 将终止所有已找到的流程使用名称my_consumer
启动您的消费者
nohup /usr/bin/env php app/console rabbitmq:consumer consumer --env=prod &
我在项目中有很多消费者,部署后很难重新启动它们。我开始使用Capistrano + Symfony plugin来部署我的项目。我根据yaml配置编写了一些自定义任务来启动/停止/重启消费者。任务基于上面的命令。