我打算使用 RabbitMQ、Symfony2 和 RabbitMqBundle 编写一个日志处理应用程序。我正在使用的工具必须具有高可用性,并且每天必须处理数百万个条目,因此消费者始终保持正常运行(短暂休息很好)很重要,否则我的队列可能会在一段时间后溢出。
是否有关于如何管理消费者(用 PHP 编写)、在出现错误时启动/重新启动它们等方面的最佳实践?
谢谢
我使用这个 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 代码中获取了基础。
阻止您的消费者使用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 配置启动/停止/重新启动消费者。任务基于上面的命令。