一:什么是MQ?
MQ是消息队列,主要为了解决传统消息传递上管理困难的问题。
MQ有三大优点:
异步、削峰、解耦
异步:比如淘宝,当下了订单后,系统会走积分系统、物流系统、供货商系统等,如果是串行,那走完一个订单所需要的时间就是走完所有子系统时间总和。当异步时,走完订单系统,不需要知道后续系统的运行情况,还可以继续发送其他信息。
削峰:比如经典的双十一期间,电商系统会面临极大的压力,在短时间内,会有极大量的消息发送给服务器,这时候服务器极有可能因为消息处理不过来而导致宕机。而MQ的削峰特性刚好能让所有消息排好队慢慢处理,不至于让系统处于负载状态,极大缓解了系统压力。
解耦:传统消息通讯方式,无论是哪一方都要维护供外部通讯的接口而且各方处理消息能力有限,效率较低,耦合度较高,当使用了MQ后,发送方只需要将消息发给MQ,后续MQ如何在处理就不需要管了,接口维护等操作都是MQ在处理。
MQ缺点:
系统可用性降低、数据一致性问题、系统复杂度提高
系统可用性降低:当所有子系统都连接在MQ上时,如果MQ挂了,将会导致整体系统无法运行。可以用集群解决。
数据一致性:当B、C系统都写入数据成功,D系统却写入数据失败。
系统复杂度:加入MQ后,如何保证数据没有重复消费,没有消息丢失。
二:什么是RabbitMQ
(1)生产者Publisher:生产消息,就是投递消息的一方。消息一般包含两个部分:消息体(payload)和标签(Label)
(2)消费者Consumer:消费消息,也就是接收消息的一方。消费者连接到RabbitMQ服务器,并订阅到队列上。消费消息时只消费消息体,丢弃标签。
(3)Broker服务节点:表示消息队列服务器实体。一般情况下一个Broker可以看做一个RabbitMQ服务器。
(4)Queue:消息队列,用来存放消息。一个消息可投入一个或多个队列,多个消费者可以订阅同一队列,这时队列中的消息会被平摊(轮询)给多个消费者进行处理。
(5)Exchange:交换器,接受生产者发送的消息,根据路由键将消息路由到绑定的队列上。
(6)Routing Key: 路由关键字,用于指定这个消息的路由规则,需要与交换器类型和绑定键(Binding Key)联合使用才能最终生效。
(7)Binding:绑定,通过绑定将交换器和队列关联起来,一般会指定一个BindingKey,通过BindingKey,交换器就知道将消息路由给哪个队列了。
(8)Connection :网络连接,比如一个TCP连接,用于连接到具体broker
(9)Channel: 信道,AMQP 命令都是在信道中进行的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成。因为建立和销毁 TCP 都是非常昂贵的开销,所以引入了信道的概念,以复用一条 TCP 连接,一个TCP连接可以用多个信道。客户端可以建立多个channel,每个channel表示一个会话任务。
(10)Message:消息,由消息头和消息体组成。消息体是不透明的,而消息头则由一系列的可选属性组成,这些属性包括routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指出该消息可能需要持久性存储)等。
(11)Virtual host:虚拟主机,用于逻辑隔离,表示一批独立的交换器、消息队列和相关对象。一个Virtual host可以有若干个Exchange和Queue,同一个Virtual host不能有同名的Exchange或Queue。最重要的是,其拥有独立的权限系统,可以做到 vhost 范围的用户控制。当然,从 RabbitMQ 的全局角度,vhost 可以作为不同权限隔离的手段。
以上解释来自于下面链接:https://blog.csdn.net/a745233700/article/details/115060109
三:交换机路由消息到队列
有4种方式:
fanout:广播方式
会将消息广播传递给所有绑定了此交换机的队列。
将消息分发给所有绑定了此交换机的队列
direct:路由方式
交换机和队列绑定了key,只有当交换机的key和队列的key相同,才能传递消息。
同时,交换机也支持多重绑定。不同的队列可以用相同的Binding key与同一交换机绑定。如下图,当消息的Routing key为black时,消息将进入 Q1 和 Q2。
topic:主题方式
可以模糊搜索路由到队列
交换机和队列的Binding key用通配符来表示,有两种语法:
-
* 可以替代一个单词;
-
# 可以替代 0 或多个单词;
headers参数方式
不常用,自行搜索了解。
以上4种方式图来自于:https://blog.csdn.net/w15558056319/article/details/123373383
四:消息发送原理
信道是TCP连接。
不直接用TCP,而是转换为AMQP信道的原因是,TCP连接/断开的消耗太大。
信道是创建在“真实”TCP上的虚拟连接,AMQP命令都是通过信道发送出去的,每个信道都会有一个唯一的ID,不论是发布消息,订阅队列或者介绍消息都是通过信道完成的。
标签:学习,队列,RabbitMQ,TCP,初步,信道,MQ,消息,路由 From: https://www.cnblogs.com/baitaotao/p/17078887.html