一、AMQP架构原理

  Rabbit是使用Erlang语言开发的,其是基于AMQP协议模型开发的一款MQ(AMQP即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计)。

  AMQP的结构如下所示:

      RabbitMQ--架构原理_虚拟主机

  AMQP协议模型由publisher application、consumer application、Server、Virtual Host、Exchange、Message Queue等组成。

    publisher application:生产者

    consumer application:消费者

    Server:也可以叫Broker,是存储消息的服务器

    Virtual Host:虚拟主机

    Exchange:交换机

    Message Queue:消息队列

  在发送消息时和消费消息时:

    应用使用Connection连接到虚拟主机

    然后通过Channel信道进行消息的读写操作,每个客户端都可以建立多个Channel, 每个channel代表一个会话任务

    读写的内容是Message消息,Message消息由Properties + body 组成,其中Properties是对消息的描述,而Body则是具体的消息内容。

    Exchange用来接收消息,然后通过Binding绑定,将Exchange中的消息与Message Queue中的队列进行绑定,最终将信息存储在Message Queue中,而Exchange和Message Queue的绑定是通过路由键Routing key来进行绑定的。

二、RabbitMQ架构

  RabbitMQ是基于AMQP协议模型开发的,因此RabbitMQ的架构图基本上与AMQP一致。

    RabbitMQ--架构原理_消息队列_02

   RabbitMQ的处理流程与AMQP也一样:生产者发送消息到Exchange,Exchange通过路由键将消息发送到对应的MessageQueue上进行存储,而消费者则从指定的MessageQueue中读取消息。

  上图中:

    蓝色标注的是发送消息的流程,生产者发送消息到交换机,然后由交换机通过routingkey路由到指定的队列中。

    绿色标注的是消费消息的流程,消费者从指定的 队列中获取消息

    红色标注的是RabbitMQ的服务端,由Exchange交换机和队列组成

    黄色标注的是交换机和和队列的对应关系

(一)Exchange(交换机)

  1、交换机的类型

  交换机的类型有四个:direct、topic、fanout、headers(不常用)

  (1)直连交换机(direct exchange)

    直连交换机的作用其实就是一对一的作用。发送到Direct Exchange的 消息,都会被转发到Routingkey中指定的队列中。

    Direct模式可以使用RabbitMQ自带的Exchange(default Exchange),所以不需要将Exchange进行任何绑定操作,消息传递时,RoutingKey必须完全匹配才会被队列接收,否则该消息会被抛弃

  (2)主题交换机(topic exchange)

    发送到Topic Exchange上的信息,会被指定给topic相关的队列上,主要是将RoutingKey和设置的Topic进行模糊匹配。匹配方式可以使用通配符的方式,#代表匹配一个或多个词,*代表匹配一个词,例如使用 lcl# 可以匹配到 lcl.abc ,也可以匹配到 lcl.abc.123,但是如果使用 lcl*,就只能匹配到 lcl.abc ,但是匹配不到 lcl.abc.123

  (3)广播交换机(Fanout Exchange)

    直播广播,不走路由键,直接将队列绑定到交换机上,发送到交换机上的消息,全都会被转发到与该交换机绑定的队列上。

  2、交换机属性

    Durability:是否持久化

    Auto Delete:当Exchange上所有队列都删除后,Exchange也将会被自动删除。在队列上,如果找不到对应的Exchange,队列也会被清除。总之,就是队列和交换机的一方找不到对并的绑定后,其自身就会被删除。

    Internal(较少使用):这个比较少使用,设置Exchange是否只在RabbitMQ内部使用,但是我们一般都需要在代码中使用,因此一般都设置为false,除非是一些自定义的扩展插件。

    Arguments:扩展参数,用于扩展AMQP协议定制使用。

(二)Binding(绑定)

  Exchange和Queue的绑定关系,,Binding中可以包含RoutingKey或者参数

(三)Queue(队列)

  消息队列,存储消息,使用Dueability来设置是否需要持久化(Durable表示需要持久化,Transient表示不需要持久化)。Aotu Delete是否自动删除,如果选择yes,表示最后一个监听被移除后,该Queue将会被自动删除。

(四)Message(消息)

  消息由Propertites和Body组成。

    Propertites用来记录一些属性信息,例如delivery mode确定消息的送达模式(持久化或非内存级别的持久化)、headers用来自定义一些属性、content_type、content_encoding、priority、correlation_id、reply_to、expiration、message_id、timestamp、type、user_id、app_id、cluster_id等。

    Body用来存储具体的消息。

(五)Virtual Host 虚拟主机

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

 

------------------------------------------------------------------
-----------------------------------------------------------
---------------------------------------------
朦胧的夜 留笔~~