RabbitMQ的阻塞和初步优化

2016/3/15 posted in  RabbitMQ

RabbitMQ占用内存达到峰值(内存的40%)消息链接就会发生阻塞

情况模拟:大量发送消息,RabbitMQ的消息处于堆积状态,内存值持续增大,RabbitMQ 的连接会阻塞。导致发送等待状态,CPU、内存占用很大,发送消息服务器异常。

异常处理结果分析:

管理后台删除queue会大幅度的减少内存的占用,内存释放,链接不会发生阻塞,接受消息正常,CPU也正常。

异常发生原因初步分析:

1. 消费者采用的排他队列(Exclusive)和持久化方式(Durable

持久化方式消息保存在磁盘中,非持久化保存在内存采用临时队列,应该注意以下三点:

  • 排他队列是基于连接可见的,同一连接的不同信道是可以同时访问同一个连接创建的临时队列的

  • 连接间不允许建立同名的排他队列的

  • 即使该队列是持久化的,一旦连接关闭或者客户端退出,应立即删除队列

我们处理措施:队列修改为一旦连接关闭或者客户端退出,该队列都会被立即删除

channel.queueDeclare(queueName, true, true, true, null);
  • @param queue the name of the queue
  • @param durable true if we are declaring a durable queue (the queue will survive a server restart) 服务器重启
  • @param exclusive true if we are declaring an exclusive queue (restricted to this connection) 一个queue能不能有多个消费者
  • @param autoDelete true if we are declaring an autodelete queue (server will delete it when no longer in use) 如果一个queue的全部消费者都挂了
  • @param arguments other properties (construction arguments) for the queue
  • @return a declaration-confirm method to indicate the queue was successfully declared

2. 修正程序中的bug,建立MQSender时不建Queue

在之前的程序中,当我们新建一个MQSender总会建一个Queue,而这个Queue没有消费者。P在发送信息时总会同时发送给ExchangeQueue。没有消费者以及持续不断地收消息导致Queue占用内存不断增大,最终拖垮整个RabbitMQ的效能。

异常导致RabbitMQ连接异常处理:

1.管理页面可以访问的情况下

点击queues --> 点击对应的队列名 --> 进入队列详情页面,点击页面底部的delete按钮删除相应的队列,上述操作可以让RabbitMQ的内存下降

2.管理后台不能访问,后台不能启动,后台相关处理

删除所有queues的消息,减小内存 (110为例)

cd /var/lib/rabbitmq/mnesia/rabbit\@template-CentOS6/
rm -rf queues

启动RabbitMQ

service rabbitmq-server start

此时两种方式删除queues

1.访问管理台页面按1的方式删除queues
2.linux管理台删除
rabbitmqctl stop_app 

清除所有队列同时初始化rabbitmq

rabbitmqctl reset

创建登录管理后台的用户用户名 密码

rabbitmqctl add_user 用户名 密码
rabbitmqctl set_user_tags 用户名 administrator
rabbitmqctl set_permissions -p / hao24 ".*" ".*" ".*"

建立连接用户名密码

rabbitmqctl add_user 用户名 密码
rabbitmqctl set_permissions -p / 用户名 ".*" ".*" ".*"