我计划使用RabbitMQ、Symfony2和RabbitMqBundle编写日志处理应用程序。
我正在开发的工具必须高度可用,并且每天必须处理数百万条记录,因此消费者必须始终处于运行状态(短暂的中断是可以接受的),否则队列可能会在一段时间后溢出。
有没有关于如何管理消费者(用PHP编写)、在出现错误时启动/重新启动它们等方面的最佳实践?
谢谢
有没有关于如何管理消费者(用PHP编写)、在出现错误时启动/重新启动它们等方面的最佳实践?
谢谢
#!/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代码中获取的基础。
要停止名称为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}'
- 仅获取行中的进程IDkill
- 将终止所有找到的进程要使用名称为my_consumer
启动消费者,请使用以下命令:
nohup /usr/bin/env php app/console rabbitmq:consumer consumer --env=prod &
我在项目中有很多消费者,部署后重新启动它们变得困难。因此,我开始使用Capistrano + Symfony插件来部署我的项目。我编写了一些自定义任务,根据yaml配置启动/停止/重新启动消费者。这些任务基于上述命令。
god
就是其中之一)。我认为我已经回答了你的问题,所以如果你选择它作为最佳答案,我将不胜感激。 :) - Anton Babenko