开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 13 天,点击查看活动详情
消息队列-RabbitMQ
学习目标:
- 理解消息队列的概念、使用场景
- 掌握AMQP的协议模型和相关概念
- 会实现RabbitMQ的安装
1. RabbitMQ概述
1.1.什么是MQ
消息队列,即MQ,Message Queue。
消息队列是典型的:生产者、消费者模型。
生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和接收,没有业务逻辑的侵入,这样就实现了生产者和消费者的解耦。
1.2.为什么要用MQ
MQ在企业中有很多的应用场景,例如:
- 异步调用
- 业务解耦
- 流量削峰
- 分布式事务
1.2.1.异步调用
例如这样的场景:用户注册后,需要发注册邮件和注册短信。
1)传统做法(同步调用):
将注册信息持久化后,发送注册邮件,再发送注册短信。三个业务全部完成后,返回给客户端。
用户注册后,要等待发送邮件、发送短信等业务逐个串行执行,整个业务耗时300ms。
2)MQ调用(异步调用)
引入MQ以后,执行流程如图:
用户注册成功,直接向MQ发送消息,然后业务结束,用户拿到结果,耗时105ms。
邮件、短信服务都监听MQ消息,接收到消息后各自完成自己业务,互不干扰。
整个注册业务流程大大简化,耗时也缩短了很多倍,并发能力就会有极大的提升。
1.2.2.业务解耦
例如系统A执行完业务,系统B需要得到系统A的业务结果,此时可以系统A中调用系统B
(系统A中耦合了系统B的业务)。
此时如果系统C、系统D都有类似需求,那么系统A的业务逻辑还要继续修改,违反了开闭原则。
此时,可以利用MQ来解耦,让商品微服务发送消息通知,而相关的其它系统监听MQ即可:
1.2.3.流量削峰
数据库的并发能力有限,往往称为业务执行的性能瓶颈。
例如我们的服务只能支持500的并发,然而又每秒1000甚至更高的服务流量涌入,服务肯定会崩溃的。
此时,利用MQ来作为缓冲,就像大坝一样,高并发流量涌入,先放到MQ中缓存起来,后续系统再慢慢取出并处理即可:
1.3.AMQP和JMS
MQ是消息通信的模型,不是具体实现。现在实现MQ的有两种主流方式:AMQP、JMS。
两者间的区别和联系:
- JMS是定义了统一的接口,来对消息操作进行统一;AMQP是通过规定协议来统一数据交互的格式
- JMS限定了必须使用Java语言;AMQP只是协议,不规定实现方式,因此是跨语言的。
- JMS规定了两种消息模型;而AMQP的消息模型更加丰富
1.4.常见MQ产品
常见的消息组件有:Kafka、ActiveMQ、RabbitMQ、RocketMQ ,关于他们之间的对比也有各种各样的讨论,下面我们看看关于它们的总结:
ActiveMQ现在已经很少使用,社区不太活跃,放弃。
RabbitMQ并发能力强、消息延时低、高可用、管理界面丰富,并且最重要的是:社区非常活跃,出现BUG都能及时解决。
Kafka和RocketMQ的特点都是高吞吐量,但是kafka消息可靠性比较一般,而且消息不保证有序性。
RocketMQ弥补了Kafka的缺点,不过是阿里开源,社区不太活跃,文档也不够丰富。
对应中小型企业,建议使用RabbitMQ,大中型公司,建议使用RocketMQ。
1.5.RabbitMQ介绍
RabbitMQ是基于AMQP的一款消息管理系统
官方教程:www.rabbitmq.com/getstarted.…
RabbitMQ基于Erlang语言开发:
2.RabbitMQ下载和安装
官网下载地址:www.rabbitmq.com/download.ht…
快速入门地址:www.rabbitmq.com/getstarted.…
此处我们以windows为主
安装步骤如下:
2.1 windows环境安装rabbitmq
一、下载安装软件
rabbit的安装依赖于erlang,所以得先安装erlang:
erlang安装
erlang下载:www.erlang.org/downloads
下载好的exe文件直接双击运行:
设置环境变量:
验证erlang环境:
rabbit安装
rabbitmq下载:www.rabbitmq.com/download.ht…
双击exe文件直接安装:
cmd进入安装目录:C:\Program Files\RabbitMQ Server\rabbitmq_server-3.8.6\sbin
安装web管理插件:
rabbitmq-plugins.bat enable rabbitmq_management
用guest/guest登入:
到此rabbitmq就安装好了!
2.6.使用管理界面
1)界面总览
2)用户权限管理
我们新建的itcast用户,不具备访问权限,如图:
我们需要添加对virtual hosts的访问权限,点击itcast用户,进入用户管理界面,然后添加权限:
添加权限以后,可以看到用户已经具备了访问权: