在使用RabbitMQ进行异步消息处理时,总是发现开启了消费者进程后,不管是开启1个还是多个,总是过一段时间,比如几分钟或10几分钟后,就自动断开了,导致queue中的消息大量堆积,无法处理。
为了保证消费者一直持续高性能的运行,采用supervisor来监管,kill了就自动重启。
其原理:
rabbitmq在收到来自客户端的connection.tune-ok信令后,启用心跳检测,
rabbitmq会为每个tcp连接创建两个进程用于心跳检测:
一个进程,定时检测tcp连接上是否有数据发送(这里的发送是指rabbitmq发送数据给客户端),如果一段时间内没有数据发送给客户端,则立即发送一个心跳包给客户端(也就是消费者),然后循环进行下一次检测;
另一个进程,定时检测tcp连接上是否有数据的接收,如果一段时间内没有收到任何数据,则判定为心跳超时,最终会关闭tcp连接。
最后解决方法:
安装并配置supervisor,将消费者进程守护起来,一旦进程关闭就自动重启。
环境:Centos
第一步:下载
yum install -y epel-release
yum install -y supervisor
第二步:配置
cd /etc/
mkdir supervisord.d
echo_supervisord_conf > supervisord.conf
vim /etc/supervisord.conf
#加入以下配置信息
[include]
files = /etc/supervisord.d/*.conf
第三步:开机启动服务文件 (写入文件位置 vim /etc/init.d/supervisord )
#!/bin/sh
#
# /etc/init.d/supervisord
#
# Supervisor is a client/server system that
# allows its users to monitor and control a
# number of processes on UNIX-like operating
# systems.
#
# chkconfig: - 64 36
# description: Supervisor Server
# processname: supervisord
# Source init functions
. /etc/rc.d/init.d/functions
prog="supervisord"
prog_bin="/usr/bin/supervisord"
PIDFILE="/var/run/$prog.pid"
start()
{
echo -n $"Starting $prog: "
###注意下面这一行一定得有-c /etc/supervisord.conf 不然修改了配置文件根本不生效!
daemon $prog_bin -c /etc/supervisord.conf --pidfile $PIDFILE
[ -f $PIDFILE ] && success $"$prog startup" || failure $"$prog startup"
echo
}
stop()
{
echo -n $"Shutting down $prog: "
[ -f $PIDFILE ] && killproc $prog || success $"$prog shutdown"
echo
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status $prog
;;
restart)
stop
start
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
;;
esac
三、执行命令
chmod +x /etc/init.d/supervisord
chkconfig --add supervisord
chkconfig supervisord on
service supervisord start
第四步:开启web查看
# 如果想通过web查看管理的进程,加入以下代码,监听9001,默认用户user,默认密码123
[inet_http_server]
port=9001
username=user
password=123
第五步:创建监听任务 (创建在 vim /etc/supervisord.d/rabbitmq_worker.conf 文件)
[program:rabbitmq_worker]
command=curl http://IP/Delay.Consumer/start ;启动时命令行执行操作
autostart=true ;是否随supervisor启动
autorestart=true ;是否在挂了之后重启,意外关闭后会重启,比如kill掉!
startsecs=10 ;持续运行多久,认为运行成功
startretries=3 ;启动尝试次数
stderr_logfile=/tmp/rabbitmq_worker_err.log ;标准错误输出的位置
stdout_logfile=/tmp/rabbitmq_worker_out.log ;标准输出的位置
第六步:重新启动supervisor服务
service supervisord restart
第七步:查看服务启动状态
[kingfly@kingfly supervisord.d]# lsof -i:9001
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
superviso 9452 root 4u IPv4 40107676 0t0 TCP *:etlservicemgr (LISTEN)
第八步:web方式查看(打开后需要登录,默认登录账号:user、默认密码:123)
http://服务器IP:9001
若想修改登录账号密码,可在配置文件里执行修改。
vim /etc/supervisord.conf
好了,到这里,通过Supervisor守护消费者进程的解决方案和实战就完成了。
快开始实战吧~ 不懂就问
若想深入了解Supervisor的各种命令,可看最后一篇