在SpringCloud之整合ribbon和MyBatis-Plus之@Version的结合,实现分布式系统下并发时保证数据一致性。
于是使用Jemter进行测试,一万个线程同时发起请求,mybatis-plus的@version虽然保证了数据的一致性,但是服务消费者多次发送请求到服务提供者导致后面请求失效。
然后就了解到rabbitMQ
目录
一、简介
- RabbitMQ是一个开源的消息代理的队列服务器,用来通过普通协议在完全不同的应用之间共享数据。
- RabbitMQ是使用Erlang语言来编写的,并且RabbitMQ是基于AMQP协议的。
- Erlang语言在数据交互方面性能优秀,有着和原生Socket一样的延迟,这也是RabbitMQ高性能的原因所在。
术语解释
消息队列(Message Queue):简称MQ,本质是个队列,先进先出(FIFO),存放的内容是message,用于不同进程Process/线程Thread之间通信。
Erlang:一种通用的面向并发的编程语言。
AMQP:一个提供统一消息服务的应用层标准高级消息队列协议
二、应用场景
2.1 解耦
场景说明:用户下单后,订单系统需要通知库存系统。按照传统的做法,就说下订单时,订单系统调用库存系统提供的接口。
传统做法的缺点:
- 库存系统无法访问时,订单调用减库存失败,从而导致订单失败
- 订单系统与库存系统耦合
使用RabbitMQ,引入消息队列:
- 订单系统:下订单时,系统会自动返回提醒——下单成功,将下单的信息写入到消息队列中。
- 库存系统:订阅消息队列通道,收到下单信息时,根据下单信息进行库存操作
- 当下单时,如果库存系统不能正常使用,订单系统写入消息队列就不再关心其他的后续操作,不影响正常下单,实现订单系统与库存系统的应用解耦
2.2 异步提升效率
一些业务比较复杂,处理时间比较长,但还得需要及时的响应结果给另一方,这就得需要采用异步的方式来处理这种复杂的业务逻辑,先把主要的业务流程走完,另外一些业务借助多线程技术或者使用MQ进行异步处理。
以淘宝购买商品为例:
在购买商品时,需要记录日志,调用积分服务,还要调用第三方支付端(微信支付、支付宝),传统做法就两种:
1. 串行
2. 并行
2.2.1 串行方式
以串行的方式响应给第三方支付端很可能会超时,会引起第三方端进行重试
2.2.2 并行方式
引入消息队列后,把记录日志和调整积分两个业务处理逻辑进行异步处理。整个响应时间就等于主业务逻辑的时间+写入消息队列的时间,响应时间比串行方式短得多。
2.3 流量削峰
应用场景:
平时系统的请求量可能每秒就100个,系统稳定运行。当遇到节日(比如双十一购物节)、新商品上架秒杀(当年小米5s秒杀,可惜笔者没秒到)或微博有瓜(汪峰老师发新专辑),系统每秒并发请求量暴增,进而导致系统崩溃,服务器宕机。
使用RabbitMQ,引入消息队列后:
- 进入请求高峰期时,将请求写入MQ,系统从MQ拉取不超过自己每秒能处理的请求数进行处理,于是这一期间会有大量请求积压在MQ里。
- 高峰期过了之后,每秒就只有100个请求进入MQ了,但是系统还是按照每秒2000个请求的速度在处理,系统快速将积压的消息消费掉。
三、搭建RabbitMQ环境
3.1 windows
3.1.2 安装Erlang
下载Erlang
安装:
傻瓜式安装
3.1.2 安装RabbitMQ
下载RabbitMQ
安装:
傻瓜式安装
3.1.3 启动RabbitMq管理控制台(图形管理界面)
- 安装成功后在开始菜单点击RabbitMQ Command Prompt(sbin dir)
- 输入命令:
- 启动服务:net start RabbitMQ
- 停止服务:net stop RabbitMQ
- 输入命令启用管理工具
rabbitmq-plugins enable rabbitmq_management
- 浏览器中查看:http://127.0.0.1:15672/
- 登录账号
使用默认账号&密码登录:guest
3.2 Linux
3.2.1 安装Erlang
下载erlang(提取码:v2lo)
将对应的rpm文件复制到opt目录下
输入安装命令
rpm -ivh erlang-23.2.3-1.el7.x86_64.rpm
安装socat 插件,输入命令
yum install -y socat
3.2.2 安装rabbitMQ
下载rabbitMQ(提取码:rure)
跟erlang的文件一样,复制到opt目录下输入安装命令
rpm -ivh rabbitmq-server-3.8.11-1.el7.noarch.rpm
使用命令查看rabbit是否启动成功
ps -ef|grep rabbit
此时rabbitMQ服务没启动,使用命令启动
rabbitmq-server -detached
再一次查看,rabbitMQ服务启动了
关闭rannitMQ命令
rabbitmqctl stop
3.2.3 启动RabbitMq管理控制台(图形管理界面)
查看可用插件
rabbitmq-plugins list
启用控制管理台
rabbitmq-plugins enable rabbitmq_management
linux访问本地15672端口
四、用户管理
4.1 添加用户
在admin页签下点击Add user
4.2 删除用户
选中用户
点击 delete this user
4.3 角色
角色标签 | 角色名称 | 描述 |
---|---|---|
Admin | 超级管理员 | 可登陆管理控制台,可查看所有的信息,并且可以对用户,策略(policy)进行操作 |
Monitoring | 监控者 | 可登陆管理控制台,同时可以查看节点的相关信息 |
Policymaker | 策略制定者 | 可登陆管理控制台, 同时可以对**策略(policy)**进行管理。但无法查看节点的相关信息 |
Management | 普通管理者 | 仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理 |
none | 无角色 | 不能登录管理控制台 |
4.4 创建Virtual Hosts
创建虚拟机
点击testhost(创建的虚拟机),设置虚拟机权限
看到admin已经加了testhost的虚拟机权限
五、卸载RabbitMQ
-
打开Windows控制面板,双击“程序和功能”。
-
在当前安装的程序列表中,右键单击RabbitMQ Server,然后单击“卸载”。
-
在当前安装的程序列表中,右键单击“Erlang OTP”,然后单击“卸载”。
-
打开Windows任务管理器。
-
在任务管理器中,查找进程epmd.exe。 如果此进程仍在运行,请右键单击该进程,然后单击“结束进程”。
-
删除RabbitMQ和Erlang的所有安装目录。
-
删除文件C:\Windows\erlang.cookie(如果存在)。
-
转到用户文件夹:C:\Users [username],然后删除文件.erlang.cookie
-
同样在User文件夹中,转到AppData\Roaming\RabbitMQ。删除RabbitMQ文件夹。
-
开运行cmd->sc delete RabbitMQ。
-
打开运行->regedit 找到RabbitMQ节点,删掉即可。