一、AMQP架构原理
Rabbit是使用Erlang语言开发的,其是基于AMQP协议模型开发的一款MQ(AMQP即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计)。
AMQP的结构如下所示:
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的处理流程与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。