5

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

是否有关于如何管理消费者(用 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 回答