一. RabbitMQ 简介
网上介绍一大堆,通俗点,就是一个中间件(翻译官),中国人要跟美国人交流,就需要这么一个翻译官,
RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。
AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、 安全。
AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。
1. RabbitMQ优点
1.1 解耦
解耦(为面向服务的架构(SOA)提供基本的最终一致性实现)
场景说明:用户下单后,订单系统需要通知库存系统。传统的做法是,订单系统调用库存系统的接口。
传统模式的缺点:
假如库存系统无法访问,则订单减库存将失败,从而导致订单失败
订单系统与库存系统耦合
引入消息队列
订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功
库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作
假如:在下单时库存系统不能正常使用。也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦
为了保证库存肯定有,可以将队列大小设置成库存数量,或者采用其他方式解决。
1.2 异步提升效率
场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有两种 1.串行的方式;2.并行方式
(1)串行方式:将注册信息写入数据库成功后,发送注册邮件,再发送注册短信。以上三个任务全部完成后,返回给客户端
(2)并行方式:将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信。以上三个任务完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间
(3)引入消息队列,将不是必须的业务逻辑,异步处理。改造后的架构如下:
1.3 流量削峰
流量削锋也是消息队列中的常用场景,一般在秒杀或团抢活动中使用广泛
应用场景:系统其他时间A系统每秒请求量就100个,系统可以稳定运行。系统每天晚间八点有秒杀活动,每秒并发请求量增至1万条,但是系统最大的处理能力只能每秒处理1000个请求,于是系统崩溃,服务器宕机。
之前架构:大量用户(100万用户)通过浏览器在晚上八点高峰期同时参与秒杀活动。大量的请求涌入我们的系统中,高峰期达到每秒钟5000个请求,大量的请求打到MySQL上,每秒钟预计执行3000条SQL。但是一般的MySQL每秒钟扛住2000个请求就不错了,如果达到3000个请求的话可能MySQL直接就瘫痪了,从而系统无法被使用。但是高峰期过了之后,就成了低峰期,可能也就1万用户访问系统,每秒的请求数量也就50个左右,整个系统几乎没有任何压力。
引入MQ:100万用户在高峰期的时候,每秒请求有5000个请求左右,将这5000请求写入MQ里面,系统A每秒最多只能处理2000请求,因为MySQL每秒只能处理2000个请求。系统A从MQ中慢慢拉取请求,每秒就拉取2000个请求,不要超过自己每秒能处理的请求数量即可。MQ,每秒5000个请求进来,结果只有2000个请求出去,所以在秒杀期间(将近一小时)可能会有几十万或者几百万的请求积压在MQ中。这个短暂的高峰期积压是没问题的,因为高峰期过了之后,每秒就只有50个请求进入MQ了,但是系统还是按照每秒2000个请求的速度在处理,所以说,只要高峰期一过,系统就会快速将积压的消息消费掉。我们在此计算一下,每秒在MQ积压3000条消息,1分钟会积压18万,1小时积压1000万条消息,高峰期过后,1个多小时就可以将积压的1000万消息消费掉。
二、rabbitMq在服务器上的安装
然后在Linux服务器上执行如下命令:
# 新建一个rabbitMq的文件夹
mkdir -p /usr/rabbitMq
# 进入该目录
cd /usr/rabbitMq
# 导包
rpm -Uvh erlang-solutions-2.0-1.noarch.rpm
# 安装erlang环境
yum install -y erlang
# 查看erlang版本,查看是否安装成功
erl -v
# 安装相关依赖
yum install -y soccat
# 导包
rpm -Uvh rabbitmq-server-3.8.13-1.el8.noarch.rpm
# 安装rabbitMq
yum install -y rabbitmq -y
# 启动
systemctl start rabbitmq-server
# 查看rabbitmq状态,查看是否启动成功
systemctl status rabbitmq-server
出现如下状态表示启动成功
# 配置rabbitmq开机自启动
systemctl enable rabbitmq-server
然后可以通过外网访问服务器,地址:服务器地址:15672
若是没有出现如上图的网页,则需要执行如下命令后重启rabbitmq即可:
rabbitmq-plugins enable rabbitmq_management
rabbitmqctl start_app