RabbitMQ
1 RabbitMQ简介
1.1 消息队列中间件简介
消息队列中间件是分布式系统中重要的组件,主要用来解决应用耦合
、异步消息
、流量削峰
等问题实现高并发,高可用,易扩展和最终一致性
常用的消息队列有
ActiveMQ
,RabbitMQ
,ZeroMQ,Kafka
,MetaMQ,RocketMQ
消息队列在实际应用中常用的使用场景:异步处理,应用解耦,流量削峰和消息通讯
-
异步处理
例如用户注册的时候,会同时发送“成功消息”到手机短信、邮箱
-
应用解耦
发的短信和邮箱都是用专门的微服务来进行操作,比封装成工具类耦合性要低
-
流量削峰
1.2 什么是RabbitMQ
MQ全程是MassageQueue,消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送通信,而不是通过直接调用彼此来通信,直接调用通常使用的是远程过程调用
。排队指的是应用程序通过队列来通信。队列的使用出去了接收和发送应用程序同时执行的要求。
1.3 基于消息中间件的分布式系统的架构
从上图可以看出,消息中间件是
-
利用可靠的消息传递机制进行系统和系统直接的通讯
-
通过提供消息传递和消息的排队机制,他可以在分布式系统环境下扩展进程间的通讯
消息中间件应用场景
- 跨系统数据传递,跨平台,跨语言
- 高开发的流量削峰
- 数据的分发和异步处理
- 大数据分析与传递
- 分布式事务
消息中间件的本质及设计
他是一种接受数据,接受请求、存储数据、发送数据功能的技术服务。
消息中间件的核心组成部分
- 消息的协议
- 消息持久化
- 消息并发策略
- 消息的高可用,高可靠
- 消息的容错机制
1.4 消息队列协议
消息中间件负责数据的传递,存储和分发消费三个部分,数据在存储和分发过程中要遵循某种约定规范,是采用TCP/IP,UDP协议还是其他自己构建的,二这些约定的规范就称之为:协议。
网络协议三要素
1.语法。语法是用户数据与控制信息的构造与格式,以及数据出现的顺序
2.语义。语义是解释控制信息每个部分的意义,他规定了需要发出何种控制信息,以及完成的动作与做出什么样的相应。
3.时序。时序是对事件发生顺序的详细说明。
HTTP的是短连接,不具备持久化,在现实场景中,如果出现服务器宕机,那么数据会出现丢失。还有就是HTTP中请求头相应报文头这些的比较复杂,包含数据加密等等
AMQP协议
AMQP:(全程:Advanced Message Queuing Protocol)是高级消息队列协议,提供了一个同意消息服务的应用层标准高级消息队列协议,是应用层协议的一个开发标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同语言等条件限制。
Erlang中的实现有RabbitMQ等。
特性:
1:分布式事务支持。
2:消息的持久化支持。
3:高性能和高可靠的消息处理优势
MQTT协议
MQTT协议:(Message Queueing Telemetry Transport) 消息队列是IBM开放的一个即时通讯协议,物联网系统架构中重要组成部分。
特点:
1:轻量
2:结构简单
3:传输快,不支持事务
4:没有持久化设计。
应用场景:
1:适用于计算能力有限
2:低带宽
3:网络不稳定的场景
OpenMessage协议
由阿里、雅虎和滴滴、stremalio等公司共同参与创立的分布式消息中间件、流处理等领域的应用开发标准。
特点:
1:结构简单
2:解析速度快
3:支持事务和持久化设计
Kafka协议
Kafka协议是基于TCP/IP的二进制协议,消息内部是通过长度分割,由一些基本数据类型组成
特点:
1:结构简单
2:解析速度快
3:无事务支持
4:由持久化设计
1.5 消息持久化
1.持久化
简单来说就是将数据放到磁盘,而不是存到内存里随着服务器的断开连接而消失,使数据能够永久保存。
2.常见的持久化方式
ActiveMQ | RabbitMQ | Kafka | RocketMQ | |
---|---|---|---|---|
文件储存 | 支持 | 支持 | 支持 | 支持 |
数据库 | 支持 | / | / | / |
1.6 消息的分发策略
MQ消息队列有如下几个角色
1:生产者
2:存储消息
3:消费者
那么生产者生成消息以后,MQ进行储存,消费着是如何获取信息的呢?一般就是两种推(push)或者拉(pull),和git一样,我们发送http请求就是典型的拉去数据库数据返回的过程。而消息队列MQ是推送的过程,这些推机制会适用到很多业务也有很多推机制策略。
消息分发策略和机制对比
ActiveMQ | RabbitMQ | Kafka | RocketMQ | |
---|---|---|---|---|
发布订阅 | 支持 | 支持 | 支持 | 支持 |
轮询分发 | 支持 | 支持 | 支持 | / |
公平分发 | / | 支持 | 支持 | / |
重发 | 支持 | 支持 | / | 支持 |
消息拉取 | / | 支持 | 支持 | 支持 |
轮询分发就是,大家都一样,不管你的性能,都是一个一个来,不糊造成数据的倾斜。
公平分发是,谁的性能好,谁就分发的多,在一定时间内大家都在做事。
1.7 消息队列高可用和高可靠
1、什么是高可用
高可用就是指在规定的条件和规定的时刻内处于可执行规定功能状态的能力。
当业务增加,请求也过大,一台消息中间件服务器会到达极限,一台服务器已无法满足,所以消息中间件必须支持集群部署。来达到高可用的目的。
2、集群模式1 -Master-slave主从共享数据的部署方式
3、集群模式2 - Master-slave主从同步部署方式
4、集群模式3 - 多主集群同步部署模式
5、集群模式4 - 多主集群转发部署模式
6、集群模式5 - Master-slave与Breoker-cluster组合的方案
三句话:
要么消息共享
要么消息同步
要么元数据共享
什么是高可靠机制
指系统无故障低持续运行,比如一个系统突然崩溃,报错,异常等等不影响线上业务的正常运行,出错的几率极低。如果在高并发的场景中,不能保证高可靠,那会造成非常严重的隐患和损失。
如何保证中间件的高可靠:
1.消息的传输:通过协议来保证系统的高可靠,那造成的隐患和损失是非常严重的。
2.消息存储可靠:通过持久化来保证消息的可靠性。
1.8 安装
下载链接:https://www.rabbitmq.com/download.html
环境:CentOS7+/Erlang
RabbitMQ是采用Erlang语言开发的,所以系统环境必须提供Erlang环境,第一步就是安装Erlang
版本对照图地址:https://www.rabbitmq.com/which-erlang.html
建议使用Docker安装:
安装Docker:https://blog.csdn.net/weixin_40248745/article/details/108060748
安装RabbitMQ:https://www.cnblogs.com/angelyan/p/11218260.html
Docker Rabbitmq 3.9开始不支持直接写入用户名密码 需要改成3.8之前的 最后一句镜像名改成rabbitmq:3.8-management
1.8.1 启动
设备关闭后,docker的容器会自己停止,需要手动重启已停止的容器
查看已停止的容器:docker ps -a
查看启动的容器:docker ps
启动已停止的容器:docker start 容器ID或容器名
提醒,如果关闭计算机时未停止这个启动的容器,再次启动docker时会出现无法访问5672的情况,此时只需停止并移除这个容器,然后重启一次docker,重新执行启动rabbitmq容器的命令即可。
1.9 RabbitMQ的角色分类
1、none
不能访问management plugin
2、management
用户可以通过AMQP做的任何事外加:
列出自己可以通过AMQP登入的virtual hosts
查看自己的virtual hosts中的queues, exchanges 和 bindings
查看和关闭自己的channels 和 connections
查看有关自己的virtual hosts的“全局”的统计信息,包含其他用户在这些virtual hosts中的活动。
3、policymaker
management可以做的任何事外加:
查看、创建和删除自己的virtual hosts所属的policies和parameters
4、monitoring
management可以做的任何事外加:
列出所有virtual hosts,包括他们不能登录的virtual hosts
查看其他用户的connections和channels
查看节点级别的数据如clustering和memory使用情况
查看真正的关于所有virtual hosts的全局的统计信息
5、administrator
policymaker和monitoring可以做的任何事外加:
创建和删除virtual hosts
查看、创建和删除users
查看创建和删除permissions
关闭其他用户的connections
2 RabbitMQ入门案例 - Simple 简单模式
1.实现步骤
1:jdk1.8
2:构建一个maven工程
3:导入RabbitMQ的maven依赖
4:启动RabbitMQ-server服务
5:定义生产者
6:定义消费者
7:观察消息的在RabbitMQ-server服务中的过程
2.构建一个maven工程
3 AMQP
1 什么是AMQP
AMQP全称:Advanced Message Queuing Protocol(高级消息队列协议)。是应用层协议的一个开发标准,为面向消息的中间件设计。
2 AMQP生产者流转过程
3 AMQP消费者流转过程
4 RabbitMQ的核心组成部分
1、RabbitMQ的核心组成部分
核心概念:
Server:又称Broker ,接受客户端的连接,实现AMQP实体服务。 安装rabbitmq-server
Connection:连接,应用程序与Broker的网络连接 TCP/IP/ 三次握手和四次挥手
Channel:网络信道,几乎所有的操作都在Channel中进行,Channel是进行消息读写的通道,客户端可以建立对各Channel,每个Channel代表一个会话任务。
Message :消息:服务与应用程序之间传送的数据,由Properties和body组成,Properties可是对消息进行修饰,比如消息的优先级,延迟等高级特性,Body则就是消息体的内容。
Virtual Host 虚拟地址,用于进行逻辑隔离,最上层的消息路由,一个虚拟主机理由可以有若干个Exhange和Queueu,同一个虚拟主机里面不能有相同名字的Exchange
Exchange:交换机,接受消息,根据路由键发送消息到绑定的队列。(不具备消息存储的能力)
Bindings:Exchange和Queue之间的虚拟连接,binding中可以保护多个routing key.
Routing key:是一个路由规则,虚拟机可以用它来确定如何路由一个特定消息。
Queue:队列:也成为Message Queue,消息队列,保存消息并将它们转发给消费者。
2、RabbitMQ整体架构是什么样子的?
3、RabbitMQ的运行流程
4、RabbitMQ支持消息的模式
参考官网:https://www.rabbitmq.com/getstarted.html
4-1、简单模式 Simple
- 参考第12章节
4-2、工作模式 Work
- web操作查看视频
- 类型:无
- 特点:分发机制
4-3、发布订阅模式
- web操作查看视频
- 类型:fanout
- 特点:Fanout—发布与订阅模式,是一种广播机制,它是没有路由key的模式。
4-4、路由模式
- web操作查看视频
- 类型:direct
- 特点:有routing-key的匹配模式
4-5、主题Topic模式
- web操作查看视频
- 类型:topic
- 特点:模糊的routing-key的匹配模式
4-6、参数模式
- web操作查看视频
- 类型:headers
- 特点:参数匹配模式
小结
- rabbitmq发送消息一定有一个交换机
- 如果队列没有指定交换机会默认绑定一个交换机
持续更新...