前言
在RabbitMQ中为了传输数据,使用的是基于TCP/IP协议构造的AMQP协议。RabbitMQ的核心组成部分包括:Server、Connection、Channel、Message、ExChange、Virtual Host、Bingings、Routing key、Queue
AMQP协议
AMQP协议全称:Advanced Message Queuing Protocol(高级消息队列协议),是应用层协议的一个开发标准,为面向消息的中间件设计。它是基于TCP/IP协议构造的协议
AMQP协议生产者/消费者流转过程
生产者Producer
在这个过程中,我们需要先进行一个建立连接(既然是基于TCP/IP协议那肯定有三次握手和四次挥手这个过程),再在连接的基础上开辟通道,一个连接可以有许多个通道,我们的消息可以通过这些通道发送到我们的队列中去(当然这个过程还需要经过交换机的转发,这个我们后面会详细谈到。)
消费者Consumer
RabbitMQ核心组成
下图是RabbitMQ的核心组成
下面是对图中的一些名称的一些解释:
Server:又称Broker ,接受客户端的连接,实现AMQP实体服务。 安装rabbitmq-server
Connection:连接,应用程序与Broker的网络连接 TCP/IP/ 三次握手和四次挥手
Channel:网络信道,几乎所有的操作都在Channel中进行,Channel是进行消息读写的通道,客户端可以建立对各Channel,每个Channel代表一个会话任务。
Message :消息:服务与应用程序之间传送的数据,由Properties和body组成,Properties可是对消息进行修饰,比如消息的优先级,延迟等高级特性,Body则就是消息体的内容。
Virtual Host虚拟地址:用于进行逻辑隔离,最上层的消息路由,一个虚拟主机理由可以有若干个Exhange和Queueu,同一个虚拟主机里面不能有相同名字的Exchange。虚拟地址可以理解为数据库中的表,每个表中有不同的数据
Exchange:交换机,接受消息,根据路由键发送消息到绑定的队列。(不具备消息存储的能力)
Bindings:Exchange和Queue之间的虚拟连接,binding中可以保护多个routing key. Routing
Routing key:是一个路由规则,虚拟机可以用它来确定如何路由一个特定消息。 Queue:队列:也成为Message
Queue:消息队列,保存消息并将它们转发给消费者。
问题
基于以上的介绍,我们可以联想到一些问题:
问题一
问:AMQP与TCP/IP协议都是传输协议,为什么RabbitMQ使用的是前者不是后者?
答:RabbitMQ作为一款消息中间件,使用AMQP协议作为通信协议,有以下原因:
AMQP协议是一种分布式消息传递协议,可以保证消息的可靠传递和顺序。
AMQP提供的队列、路由、交换机等功能,能够更好地支持消息中间件的流程和功能。
AMQP具有多语言调用的API,可以跨平台进行应用开发。
因此,在RabbitMQ中使用AMQP协议,可以更好地支持分布式架构下的消息传递,提高系提高系统的可靠性和稳定性。
问题二
问:既然连接可以完成通信了,为什么需要管道Channel来完成沟通?
答:要知道TCP/IP的连接是短连接的,而AMQP是基于它构造的,那自然也避免不了是短连接的问题,一次消息发送就得重新把断开的连接重新连接上,这样效率就降下来了,那要维持这个连接,就需要用Channel管道维持端对端的连接。再有一个TCP连接可以实现多管道,做到了多路复用提高了效率。总得来说,一是Channel可以维持连接,省去了端对端的频繁连接的过程,二是一个连接可以建立多个Channel,实现了多路复用,提高了消息发送效率。
问题三
问:Virtual Host是什么?为什么需要它?
答:Virtual Host就是一个虚拟主机,主要作用就对不同的ExChange和Queue做隔离,可以理解为数据库的表,一个数据库中有多个表,每个表的作用不一样,而Virtual Host的作用就和这些表一样,左一个逻辑隔离,方便对不同的ExChange和Queue进行管理
…