MQ RabbitMQ入门介绍和核心原理

1 简介

RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。 且RabbitMQ是基于 AMQP 协议的,目前各个互联网大厂都在使用RabbitMQ作为消息中间件。

附上官网地址: https://www.rabbitmq.com/

2 特点

2.1 核心特点

  • 采用Erlang语言作为底层实现:Erlang有着和原生Socket一样的延迟

  • 开源、性能优秀,稳定性保障

  • 提供可靠性消息投递模式(confirm)、返回模式( return )

  • 与SpringAMQP完美的整合、API丰富

  • 集群模式丰富,表达式配置,HA模式,镜像队列模型

  • 保证数据不丢失的前提做到高可靠性、可用性

高性能原因:

  • Erlang语言最初在于交换机领域的架构模式,这样使得RabbitMQ在Broker之间进行数据交互的性能非常优秀
  • Erlang有着和原生Socket一样的延迟

2.2 专业术语

  • 生产者(Producer):发送消息的应用。

  • 消费者(Consumer):接收消息的应用。

  • Server:又称Broker,接受客户端连接,实现AMQP实体服务

  • Connection:连接、应用程序与Broker的网络连接

  • Channel:网络信道,几乎所有的操作都在Channel中进行,Channel是进行消息读写的通道。客户端可建立多个Channel,每个Channel代表一个会话任务

  • Message:消息,服务器和应用程序之间传送的数据,由Properties和Body组成。Properties可以对消息进行修饰,比如消息的优先级,延迟等高级特性;Body则就是消息体内容

  • Virtual host:虚拟主机,用于进行逻辑隔离,最上层的消息路由。一个Virtual host里面可以有若干个Exchange和Queue,同一个Virtual Host里面不能有相同名称的Exchange或Queue

  • Exchange:交换机、接收消息。根据路由键转发消息到绑定的队列

  • Binding:Exchange和Queue之间的虚拟连接,binding中可以包含routing key

  • Routing key:一个路由规则,虚拟机可用它确定如何路由一个特定消息

  • Queue:也称Message Queue,消息队列,保存消息并将它们转发给消费者

3 核心功能

3.1 AMQP

基础模型

v2-370a909a995cde466c4965b51b6782dd_720w.jpg

AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。Erlang中的实现有RabbitMQ等。

它可以使对应的客户端(client)与对应的消息中间件(broker)进行交互。消息中间件从发布者(publisher)那里收到消息(发布消息的应用,也称为producer),然后将他们转发给消费者(consumers,处理消息的应用)。由于AMQP是一个网络协议,所以发布者、消费者以及消息中间件可以部署到不同的物理机器上面。

虽然在同步消息通讯的世界里有很多公开标准(如 COBAR的 IIOP ,或者是 SOAP 等),但是在异步消息处理中却不是这样,只有大企业有一些商业实现(如微软的 MSMQ ,IBM 的 Websphere MQ 等),因此,在 2006 年的 6 月,Cisco 、Redhat、iMatix 等联合制定了 AMQP 的公开标准。

RabbitMQ是由RabbitMQ Technologies Ltd开发并且提供商业支持的。该公司在2010年4月被SpringSource(VMWare的一个部门)收购。在2013年5月被并入Pivotal。其实VMWare,Pivotal和EMC本质上是一家的。不同的是VMWare是独立上市子公司,而Pivotal是整合了EMC的某些资源,现在并没有上市。

3.2 基础架构

780135-20210209091458529-1809465892.png

3.3 交换器

3.3.1 交换机属性

Exchange

  • Type:交换机类型 direct、topic、fanout、headers

  • Durability:是否需要持久化 ,默认为 true 表示持久化

  • Auto Delete:当最后一个绑定到Exchange上的队列删除后,自动删除该Exchange

  • Internal:当前Exchange是否用于RabbitMQ内部使用,默认为False

  • Arguments:扩展参数,用于扩展AMQP协议自制定化使用Name:交换机名称

3.3.2 交换器类型

生产者发送消息到 RabbitMQ 的交换器上。常用的交换器有四种:

  • fanout 。会把所有发送到该交换器的消息路由到与该交换器绑定的消息队列中。

  • Direct。会把消息路由到bingingKey 和RoutingKey 完全匹配的队列中。

  • Topic。Topic 类型的交换器哎在 direct 匹配规则上进行了扩展,不是进行完全匹配,而是进行模糊匹配。匹配规则如下:BindingKey和RoutingKey一样都是由"."分隔的字符串;BindingKey中可以存在两种特殊字符“” 和 “#”,用于模糊匹配,其中""用于匹配一个单词,"#"用于匹配多个单词(可以是0个)。

  • Headers 。Handers 类型的交换器不是根据路由匹配规则来的,而是根据消息中的 headers 属性进行匹配的。在绑定队列和交换器时指定一组键值对,当发送的消息到交换器时,RabbitMQ会获取到该消息的headers,对比其中的键值对是否完全匹配队列和交换器绑定时指定的键值对,如果匹配,消息就会路由到该队列。headers类型的交换器性能很差,不实用。

3.4 消息流程

  • 生产者(producer)把消息发送给交换机。创建交换机的时候指定上面的交换机类型。

  • 交换机(exchange)接收消息并且负责对消息进行路由。根据交换机的类型,消息的多个属性会被使用,例如路由键。

  • 绑定(binding)需要从交换机到队列的这种方式来进行创建。在这个例子里,我们可以看到交换机有到两个不同队列的绑定。交换机根据消息的属性来把消息分发到不同的队列上。

  • 消息(message)消息会一直留在队列里直到被消费。

  • 消费者(consumer)处理消息。

3.5 数据存储

RabbitMQ消息有持久化消息和非持久化消息。

持久化消息在到达队列时写入磁盘,同时在内存中保存一份备份,当内存不足时,消息从内存中清除。

非持久化消息一般只存在内存中,当内存不足时进行数据的刷盘处理。节省内存空间。

RabbitMQ 存储层包含两部分,队列索引和消息存储。索引维护队列的落盘消息的信息,比如存储地点、是否已经被消费者接收,是否已经被消费者ack等,每个队列都有相应的索引。

索引使用顺序的段文件来存储,后缀为 .idx ,文件名从0开始累加,每个段文件中包含固定的记录数,默认是16384 ,每个index从磁盘中读取消息的时候,都会在内中中维护一段文件。

消息存储。消息通过键值对的形式存储到文件中,一个虚拟主机上的所有队列使用同一块存储,每个接地那只有一个。存储分为:

  • 持久化存储。在broker 重启后不会丢失。

  • 临时存储。在broker 重启后会丢失。

存储方式为文件来存储,后缀为 .rdq 。经过store 处理的所有消息都会以追加的方式写入到该文件中,当文件达到指定容量时,会创建一个新的文件进行写入。

读取消息时,先根据消息的ID(msg_id)找到对应存储的文件,如果文件存在并且未被锁住,则直接打开文件,从指定位置读取消息内容。如果文件不存在或者被锁住了,则发送请求由store进行处理。

删除消息时,只是从ETS表删除指定消息的相关信息,同时更新消息对应的存储文件和相关信息。在执行消息删除操作时,并不立即对文件中的消息进行删除,也就是说消息依然在文件中,仅仅是标记为垃圾数据而已。当一个文件中都是垃圾数据时可以将这个文件删除。当检测到前后两个文件中的有效数据可以合并成一个文件,并且所有的垃圾数据的大小和所有文件(至少有3个文件存在的情况下)的数据大小的比值超过设置的阈值garbage_fraction(默认值0.5)时,才会触发垃圾回收,将这两个文件合并,执行合并的两个文件一定是逻辑上相邻的两个文件。

4 相关信息

  • 博文不易,辛苦各位猿友点个关注和赞,感谢

你可能感兴趣的:(MQ RabbitMQ入门介绍和核心原理)