Spring Boot RabbitMQ 工作原理

RabbitMQ简介

 在介绍Rabbitmq之前先给大家介绍一下MQ,MQ是什么?

MQ全称是Message Queue,可以理解为消息队列的意思,简单来说就是消息以管道的方式进行传递。

既然我们知道了MQ是什么,那我们来说说RabbitMQ是什么?

RabbieMQ是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,rabbitmq是使用Erlang语言来编写的,并且rabbitmq是基于amqp协议的。

可能很多人不理解AMQP协议是什么?

AMQP:高级消息队列协议。他是应用层协议的一个开放标准,为面对消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不接受产品、开发语言等条件的限制。简单理解就是定义了一个规范,而rabbitmq就是实现了这个规范。

应用场景         

   在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理(请求与动作分离),而这种异步处理的    方式大大的节省了服务的请求响应时间,从而提高了系统的性能等。

RabbitMQ一些优秀的特点:

1.除了Qpid,RabbitMQ是唯一一个实现了AMQP标准的消息服务器;

2.可靠性,RabbitMQ的持久化支持,保证了消息的稳定性;

3.高并发,RabbitMQ使用了Erlang开发语言,Erlang是为电话交换机开发的语言,天生自带高并发光环,和高可用特性;

4.集群部署简单,正是应为Erlang使得RabbitMQ集群部署变的超级简单;

5.社区活跃度高,根据网上资料来看,RabbitMQ也是首选;

RabbitMQ中一些相关名词:

Broker:简单来说就是消息队列服务器实体。

Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。

Queue:消息队列载体,每个消息都会被投放到一个或多个队列。

Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。

Routing Key:路由关键字,exchange根据这个关键字进行消息投递。

vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。

producer:消息生产者,就是投递消息的程序。

consumer:消息消费者,就是接收消息的程序。

channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

RabbitMQ消息发送原理

首先就是连接RabbitMQ,你的应用程序和RabbitMQ Server之间会创建一个TCP连接,一旦TCP打开,并通过了认证,认证就是你试图连接RabbitMQ之间发送的RabbitMQ服务器连接信息和用户名密码,一旦认证通过,你的应用程序和RabbitMQ就创建了一条AMQP信道(Channel)。

信道是创建在真是TCP上的虚拟连接,AMQP命令都是通过信道发送出去的,每个信道都会有一个唯一的ID,不论是发布信息,订阅队列或者介绍信息都市通过信道完成的。

为什么不通过TCP直接发送命令?

对于操作系统来说创建和销毁TCP会话是非常昂贵的开销,假设高峰期每秒有成千上万条连接,每个连接都要创建一条TCP会话,这就造成了TCP连接的巨大浪费,而且操作系统每秒能创建的TCP也是有限的,因此很快就会遇到系统瓶颈。

如果我们每个请求都使用一条TCP连接,既满足了性能的需要,又能确保每个连接的私密性,这就是引入信道概念的原因。

  

RabbitMQ执行流程

 消息生产者投递消息到exchange,Exchange根据某种路由规则路由到队列,消费者只需要监听队列进行消费就行,

生产者不需要关心要把消息投送到哪个队列,接收者只需要监听队列进行消费,从而做到解耦。

消息的持久化       

RabbitMQ 在重启服务器会导致消息丢失,那么怎么保证RabbitMQ在重启的时候不丢失呢?那就是持久化。

1.交换机持久化  Durable:是否持久化参数设为True即可

2.队列持久化  Durable:是否持久化参数设为True即可

这样就可以了  ,我们把服务器重启下,我们的消息还在,我这边就不贴图了。

持久化的工作原理

   RabbitMQ会将你的持久化消息写入磁盘上的持久化日志文件,等消息被消费后,RabbitMQ会把这条信息标识为等待垃圾回收。

持久化的缺点

消息持久化的有点显而易见,但缺点也很明显,那就是性能,因为要写入硬盘要比写入内存性能较低很多,从而降低了服务器的吞吐量,尽管使用SSD硬盘可是使事情得到环节,但他仍然吸干了RabbitMQ的性能,当消息成千上万条要写入硬盘的时候,性能的降低就显而易见了。

虚拟主机

每个RabbitMQ都能创建很多vhost,我们称之为虚拟主机,每个虚拟主机其实都市mini版的RabbitMQ,拥有自己的队列,交换器,绑定,权限机制。

vhost特性

  1. RabbitMQ默认的vhost是"/"开箱即用;
  2. 多个vhost是隔离的,多个vhost无法通讯,并且不用担心命名冲突(队列和交换机和绑定),实现了多层分离;
  3. 创建用户的时候必须指定vhost;

vhost操作

Spring Boot RabbitMQ 工作原理_第1张图片

  之前总是在网上找问题  ,从来没想过自己写,我也想把自己学的分享给需要的人,还请点个赞让我继续坚持。

 我的博客里面还有rabbitmq系列的文章,欢迎大家观看,有写的不好的欢迎指出        

 Spring Boot RabbitMQ 五种模式

 Spring Boot RabbitMQ 消息确认

 

你可能感兴趣的:(RabbitMQ)