管理RabbitMQ消费者

5
我计划使用RabbitMQ、Symfony2和RabbitMqBundle编写日志处理应用程序。 我正在开发的工具必须高度可用,并且每天必须处理数百万条记录,因此消费者必须始终处于运行状态(短暂的中断是可以接受的),否则队列可能会在一段时间后溢出。
有没有关于如何管理消费者(用PHP编写)、在出现错误时启动/重新启动它们等方面的最佳实践?
谢谢
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代码中获取的基础。


如果我看得正确,脚本只启动了消费者,但它没有处理死亡消费者的情况,也没有重新启动它。 - Tibor
为此,我设置了一个cron任务,每分钟运行该脚本,以确保它始终正常工作。 - Anton Babenko
1
我也尝试了supervisord,它看起来很不错,如果rabbitmq消费者死亡,它会重新启动它们等。http://edvanbeinum.com/how-to-install-and-configure-supervisord/ - Tibor
当然,有很多这样的工具(god就是其中之一)。我认为我已经回答了你的问题,所以如果你选择它作为最佳答案,我将不胜感激。 :) - Anton Babenko
1
抱歉,我的生活中没有Windows :) - Anton Babenko
显示剩余2条评论

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配置启动/停止/重新启动消费者。这些任务基于上述命令。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接