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
在发送信息时总会同时发送给Exchange
和Queue
。没有消费者以及持续不断地收消息导致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 / 用户名 ".*" ".*" ".*"