最后更新:2022-02-05 04:41:53 手机定位技术交流文章
最近马上面临过年,就等着下周发年终奖了哈哈,先给大家拜个早年,然后再一起来学习RabbitMQ。
RabbitMQ是一个消息队列中间件。
中间件是处于操作系统和应用程序之间的软件,一般用于跨平台,跨应用,跨语言的信息互通,持久化等操作,只要通信协议相同即可。
消息队列中间件是一个应用于分布式架构中的传递信息数据进行数据收集与分发的一个中间件。一般用于如下场景:
1.跨系统数据传递
2.高并发的流量削峰
3.数据分发与异步处理
4.大数据分析与传递
5.分布式事务
常见的消息中间件有:
| 名称 | 特点 |
| ActiveMQ | 比较老牌的消息中间件,比较复杂 |
| RabbitMQ | 与Spring同厂商,在普遍SpringBoot框架下RabbitMQ的发挥空间肯定是最大的 |
| Kafka | 高性能中间件,但不支持事务 |
| RocketMQ |
消息队列需要完成跨应用,跨平台的通信,信息的传递,那么他就要指定一个大家都要遵守的协议,才能完成信息的传递,底层的协议分为TCP与UDP协议,如果有不懂的同学可以自己去查询一下,稍微理解依稀概念就好,但是这种底层的协议不能满足我们消息队列功能的构建,他可能只约定了一部分功能,所以我们需要在底层协议上自己添加限制内容,使消息队列能够完成更加复杂的工作。
常见的消息中间件协议有:OpenWire、AMQP、MQTT、Kafka、OpenMessage协议等。
| 协议名称 | 特点 |
| AMQP协议 | RabbitMQ(默认)、ActiveMQ支持 1.分布式事务支持 2.消息持久化支持 3.高性能和高可靠的消息处理 |
| MQTT协议 | RabbitMQ(需要开启)、ActiveMQ支持 是物联网系统架构的重要组成部分 1.轻量级 2.结构简单 3.传输快,不支持事务 3.没有持久化设计 |
| OpenMessage协议 | RocketMQ支持 1.结构简单 2.解析速度快 3.支持事务及持久化设计 |
| Kafka协议 | Kafka支持 基于TCP/IP协议的二进制协议,速度最快 1.结构简单 2.解析速度快 3.无事务支持 3.有持久化设计 |
RabbitMQ采用了AMQP协议,是用Erlang语言开发的消息中间件。
面试1:为什么消息队列发送消息不直接采用http协议呢?
答:因为http协议的请求头与请求体内容复杂, 包括cookie,数据的加解密,状态码,响应码等功能,但是对于消息队列来说,我们不要求这些,我们只要求能够简洁快速的传递信息,存储数据,分发消息就可以了。
其次http大部分为短连接,在交互过程中难免面临响应中断,不会进行持久化,造成消息丢失。这是消息中间件不能忽略的问题,所以http协议并不适用于消息中间件。
| ActiveMQ | RabbitMQ | Kafka | RocketMQ | |
| 发布订阅 | 支持 | 支持 | 支持 | 支持 |
| 轮询分发 | 支持 | 支持 | 支持 | 不支持 |
| 公平分发 | 不支持 | 支持 | 支持 | 不支持 |
| 重发 | 支持 | 支持 | 不支持 | 支持 |
| 消息拉取 | 不支持 | 支持 | 支持 | 支持 |
RabbitMQ下载安装
RabbitMQ安装过后,我们可以通过IP地址加端口号进行访问。同时可以注册用户,注册的用户需要分配权限,则RabbitMQ有如下几个角色权限。
| 角色名称 | 权限 |
| none | 无法登录的权限 |
| management | 只能查看与自己有关的节点 |
| policymaker | 可以查看、删除、创建自己的节点 |
| monitoring | 可以查看、删除、创建自己的节点外,还可以查看其他人的节点 |
| administrator | 最高权限,可以查看、删除、创建所有节点,并且可以创建用户,赋予权限 |
先导入依赖
创建生产者
创建消费者
面试2:为什么消息队列的生产与消费是基于通道,而不是连接的呢?
答:因为rabbitMQ是基于TCP/IP协议的,需要经历三次握手跟四次挥手。所以连接的每一次创建与关闭都会十分消耗性能,但是通道则不会。每一个连接中都会有多个通道,基于通道的消息性能会特别高。
核心概念:
| 名称 | 含义 |
| Server/Broker | 接收客户端的连接,实现AMQP实体服务,安装rabbitmq-server |
| Connection(连接) | 应用程序与Broker的网络连接 |
| Channel(网络信息通道) | 几乎所有的操作都在Channel中进行,Channel是进行消息读写的通道,每一个Channel都代表一个会话任务 |
| Message(消息) | 服务与应用程序之间传送的数据,由Properties和body组成,Properties可对消息进行修饰,比如优先级、延时处理等;body则是消息体的内容 |
| Virtual Host(虚拟地址) | 用于进行逻辑隔离,同一个虚拟主机内可以有多个Exchange,但不能有名称相同的Exchange |
| Exchange(交换机) | 接收消息,根据路由key发送消息到绑定的队列,不具备消息存储的能力 |
| Bindings(虚拟连接) | Exchange与Queue之间的虚拟连接 |
| Routing key(路由规则) | 虚拟机通过Routing key来决定消息的发送与接收 |
| Queue(队列) | 消息队列,接收Exchange的消息保存到队列中,并转发给消费者, |
RabbitMQ消息发布模式
上面的网址可以查看RabbitMQ的全部消息发布模式。
1.简单模式
创建生产者与消费者,通过队列,生产者进行生产,消费者进行消费,如上图代码示例

2.Fanout模式
发布与订阅模式,下图中深蓝色X表示交换机,我们需要创建一个交换机,然后绑定交换机与队列,这样我们向此交换机投递消息的时候,绑定到的队列全部都会收到消息。设置路由Key没有意义。

3.Direct模式
路由模式,在Fanout模式之上,添加了路由Key,如果设置路由Key,就会指定发送到对应路由key的队列中,进一步缩小消息发送的范围。

上面简单模式创建的生产者使用的为默认的交换机,那么我们应该如何使用代码进行交换机的创建及与队列绑定呢?代码如下:
4.Topic模式
主题模式,在路由模式的基础上可以模糊匹配路由,路由可以为xxxx.xxxx,由如下符号进行模糊匹配变为 *.xxxx或#.xxxx.* 等多种类型含义。
| 符号 | 含义 |
| * | 必须匹配一级 |
| # | 匹配0级或多级 |

5.Headers模式
参数模式,在页面中没有模型,概念为我们创建交换机的时候添加参数,之后我们创建channel.basicPublish对象时第三个参数附带值后,根据值内容来对相应的队列进行消息投递。与路由模式类似。
6.Work模式
工作模式,其中由两种模式,分别为:轮询模式、公平分发模式。
轮询模式:每个消费者一条,不会多发也不会少发。
公平分发模式:能者多劳,处理的快就多消费,处理的慢就少消费。

确定轮询分发还是公平分发,两者的消费者代码是不同的,我分别示例
轮询分发代码:
公平分发代码:
下一篇请戳↓
RabbitMQ学习笔记(二)
本文由 在线网速测试 整理编辑,转载请注明出处。