赞
踩
由某一次真实生产环境rabbitMQ故障引发血案,下面复盘问题发生原因以及问题解决方法。
1、 问题引发
由某个服务BI-collector-xx队列出现阻塞,影响很整个rabbitMQ集群服务不可用,多个应用MQ生产者服务出现假死状态,系统影响面较广,业务影响很大。当时为了应急处理,恢复系统可用,运维相对粗暴的把一堆阻塞队列信息清空,然后重启整个集群。
在复盘整个故障过程中,我心中有不少疑惑,至少存在以下几个问题点:
2、 试验队列阻塞
某天周末在家里,找个测试环境,安装rabbitmq尝试重现这过程,并做模拟测试。
写两个测试应用Demo(假设是两个项目应用)分别有生产者和消费者,并分别使用队列testA和testB。
为了尽可能还原生产的情况,一开始测试使用了同一个vhost,后面分别设置不同vhost。
生产者A,示例代码如下
消费者A
MQ配置
生产者B,每次生产10万条消息
消费者B,代码故意写错(模拟出现异常的情况),不是正常的json串导致解释json时抛出异常
先了解一下Rabbitmq客户端启动连接工作过程,通过wireshark抓包分析,如下
先对AMQP做一个简单的介绍,请求的AMQP协议方法信息,AMQP协议方法包含类名+方法名+参数,这一列主要展示了类名和方法名
Connection.Start
:请求服务端开始建立连接Channel.Open
:
请求服务端建立信道Queue.Declare
:
声明队列Basic.Consume
:
开始一个消费者,请求指定队列的消息详细方法可以查看amqp
官网https://www.rabbitmq.com/amqp-0-9-1-reference.html
工作过程分析:
Basic.Publish
:
客户端发送Basic.Publish
方法请求,将消息发布到exchange
,
rabbitmq server
会根据路由规则转发到队列中;
Basic.Deliver
:
服务端发送Basic.Deliver
方法请求,投递消息到监听队列的客户端消费者;
Basic.Ack
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。