RabbitMQ的几个重要基础概念!没看之前不要说搭MQ用MQ!

理解几个重要概念
(1)Virtual Host : 虚拟主机

用于最高层级的逻辑隔离,不同的用户权限能操作的虚拟主机也不同,这就实现了根据一定规则(人群,地域,科目,部门)的权限划分。例如下面两个用户虽然都是Administrator管理员,但是它们的访问权限不同,能管理的虚拟主机也不同。
在这里插入图片描述

(2)Exchange:交换机

在这里插入图片描述
根据我们自己配置的规则,将消息路由到一个或者多个消息队列中。

(3)Queues:消息队列

在这里插入图片描述
消息队列就是用来存放消息的地方,它跟交换机是相对独立创建的,同一个虚拟主机下就属于兄弟关系,两者功能不同,但是它们两兄弟会通过绑定来合作,queue是保存消息和提供给消费者,exchange交换机是根据规则来读取消费绑定的消息队列中的消息。
queue就是一个杯子的作用!往里面装水也用它,喝水也用它,它传递奔波服务于生产者与消费端之间,而exchange就像一个服务员,准确地将这杯水送到需要的客人手中。

(4)Binding:绑定

基于第2,3步我们创建好了队列以及交换机,下一步就是绑定。
在这里插入图片描述
在这里插入图片描述
由此可以看出,交换机绑定了队列,不管是发送还是接受,都要经过交换机。所以我们发送消息时,只需要简单的指定交换机和路由key,就可以发送成功,无需队列名(多余)。

路由key就是路由规则,也可以看作是一种匹配规则,routing精准匹配模式下一般使用XX.XX这种命名规则。topic主题匹配模式下,可以采用XX.星星**或者✨.XX这种。都可以。
在这里插入图片描述

(5)工作流程:

由于RabbitMQ是ErLang写的。我也懒得去看源码,其实也非常简单,就大概了解下它的工作流程。
在这里插入图片描述

疑问?

有的人觉得MQ为了实现一点数据传输,搞得这么麻烦简直脱裤子放屁,通过接口回调接口请求的方式不一样可以搞定吗?
如果是业务数据交互非常频繁的时候,不停地互相调用接口,等待返回接口,以及报错时候做服务降级处理,这是非常麻烦而且对于服务器来说是徒增了请求压力。

RabbitMQ默认基于TCP构建的长链接(闲得慌可以改成短链接),通过在长链接中开启相对独立的虚拟链接Channel信道,来实现生产与消费,减去了不断进行TCP链接创建和销毁的操作。所以我们可以看到最后两个概念:
Connections:基于AMQP协议的长链接

在这里插入图片描述

Channel:信道

信道与队列基本上属于一一对应关系,队列必须依靠虚拟链接信道才能实现消息传输。这些由不得我们创建,是基于Connection自动创建的。
在这里插入图片描述

那么,同一个TCP链接下如何区分Channel呢?

答案是通过channel id 和 queue name 和 consumer tag,随便点击一个channel进去看:
在这里插入图片描述

什么是AMQP(Advanced Message Queuing Protocol高级消息队列协议)?

AMQP其实是一种协议,一种数据传输模型,一种消息队列规范。不论是什么MQ,十有八九离不开这个规范。就跟JDBC一样,你可以有Mysql驱动,Oracle驱动,SQLServer驱动,但是都必须根据JDBC规范来玩。
而以上我们创建的全部概念,集合起来就是AMQP给我们的约定和规范(不管是生产者还是消费者):
首先基于TCP长链接创建
然后通过信道来进行消息的发送和接收
进行虚拟主机分区管理
根据交换机匹配不同路由规则,分发消息
消息队列用来装消息,并与交换机绑定合作关系

优点:
解耦,更加灵活
基于单TCP长链接,减轻请求压力
信道概念的引入,更加适用于多线程场景
…剩下的靠自己吹,其实都是老一套了,顺便把MQ的优点说出来也行,什么侵入小,异步请求,削峰填谷,进程间和不同服务间调用减少了交互接口的编码量等等…

猜你喜欢

转载自blog.csdn.net/whiteBearClimb/article/details/108909506
MQ
今日推荐