目标:RabbitMQ 基本概念
分析:
详解:
第一部分 消息队列模型
1、点对点模型
在点对点(Point to Point)模型中,应用程序有队列(Queue)、发送者(Sender)和接收者(Receiver)组成。
每条消息都被发送到一个特定的队列中,接收者从队列中获取消息。队列中一直保留着消息,直到它们被接收或超时。
2、发布/订阅模型
在发布/订阅(Pub/Sub)模型中,应用程序由主题(Topic)、发布者(Publisher)和订阅者(Subscriber)组成。
发布者发布一条消息,该消息通过主题传递给所有订阅者。在这种模型中,发布者和订阅者彼此不知道对方,它们是匿名的并且可以动态发布和订阅主题。主题用于保存和传递消息,并且会一直保存消息直到消息被传递给订阅者。
第二部分 AMQP协议
1、主要概念
-
Message(消息) 消息服务器所处理数据的原子单元。消息可以携带内容,从格式上看,消息包括一个内容头、一组属性和一个内容体。这里所说的消息可以应对到许多不同应用程序的实体,比如一个应用程序级消息、一个传输文件、一个数据流帧等。消息可以被保存到磁盘上,这样即使发生严重的网络故障、服务器崩溃也可确保投递。消息可以有优先级,高优先级的消息会在等待同一个消息队列时在低优先级的消息之前发送,当消息必须被丢弃以确保消息服务器的服务质量时,服务器将会优先丢弃低优先级的消息。消息服务器可以在内容头中添加额外信息,但不能删除或修改现有信息。
-
Publisher(消息生产者) 也是一个向交换器发布消息的客户端应用程序。
-
Exchange(交换器) 用来接收消息生产者所发送的消息并将这些消息路由给服务器中的队列。
-
Binding(绑定) 用于消息队列和交换器之间的关联。一个绑定就是基于路由键将路由键将交换器和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表。
-
Virtual Host(绑定) 它是消息队列以及相关对象的集合,是共享同一个身份验证和加密环境的独立服务器域。每个虚拟主机本质上都是一个mini版的消息服务器,拥有自己的队列、交换器、绑定和权限机制。
-
Broker(消息代理) 表示消息队列服务器实体,接受客户端连接,实现AMQP消息队列和路由功能的过程。
-
Routing Key(路由规则) 虚拟机可用它来确定如何路由一个特定消息。
-
Queue(消息队列) 用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可被投入一个或多个队列中。消息一直在队列里面,等待消费者连接到这个队列将其取走。
-
Connection(连接) 可以理解成客户端和消息队列服务器之间的一个TCP连接。
-
Channel(信道) 仅仅当创建了连接后,若客户端还是不能发送消息,则需要为连接创建一个信道。信道是一条独立的双向数据流通道,它是建立在真是的TCP连接内的虚拟连接,AMQP命令都是通过信道发出去的,不管是发布消息、订阅队列还是接受消息,它们都通过信道完成。一个连接可以包含多个信道,之所以需要信道,是因为TCP连接的建立和释放都是十分昂贵的,如果客户端的每一个线程都需要与消息服务器交互,如果每一个线程都建立了一个TCP连接,则暂且不考虑TCP连接是否浪费,就算操作系统也无法承受每秒建立如此多的TCP连接。
-
Consumer(消息消费者) 表示一个从消息队列中取得消息的客户端应用程序。
2、生命周期
一条消息的流转过程通常是这样的:Publisher 产生一条数据,发送到 Broker,Broker 中的Exchange 可以被理解为一个规则表(Routing Key 和 Queue 的映射关系--Binding),Broker 收到消息后根据 Routing Key 查询投递的目标 Queue。Consumer 向 Broker 发送订阅消息时会指定自己监听哪个 Queue,当有数据到达Queue时Broker会推送数据到Consumer。
graph LR;
Publisher(Publisher)-->|publish|Exchange((Exchange));
Exchange-->|Routes|Queue1((Queue1));
Exchange-->|Routes|Queue2((Queue2));
Exchange-->|Routes|Queue3((Queue3));
Queue1-->|Consumes|Consumer1(Consumer1);
Queue2-->|Consumes|Consumer2(Consumer2);
Queue3-->|Consumes|Consumer3(Consumer3);
第三部分 RabbitMQ基本概念
1、基本概念
RabbitMQ是AMQP协议的一个开源实现,所以其基本概念也就是AMQP协议的基本概念。
2、交换器类型
-
Direct 交换器
如果消息中的路由键(routing Key)和 Binding 中的绑定键(binding key)一致,交换器就将消息发送到对应的队列中。路由键与队列名称要完全匹配,如果将一个队列绑定到交换机要求为“dog”,则只转发routing key标记为“dog”的消息,不会转发“dog.puppy”消息,也不会转发“dog.guard”消息等。Direct交换器是完全匹配、单播的模式。 -
Fanout 交换器 Fanout交换器不处理路由键,只是简单地将队列绑定到交换器,发送到交换器的每条消息都会被转发到与该交换器绑定的所有队列中。这很像子网广播,子网内的每个主机都获得了一份复制的消息。
通过Fanout交换器转发消息是最快的。 -
Topic 交换器 Topic交换器通过模式匹配分配消息的路由键属性,将路由键和某种模式进行匹配,此时队列需要绑定一种模式。Topic交换器将路由键和绑定键的字符串切分成单词,这些
单词之间用点“.”隔开。该交换器会识别两个通配符:“#”和“*”,其中“#”匹配0个或多个单词,“*”匹配一个单词。 -
Headers 交换器 Headers交换器匹配AMQP消息的Header而不是路由键。Headers交换器和Direct交换器完全一致,但性能相差很多,目前几乎不用了。