一个5年工作经验的小伙伴,在面试的时候被这样一个问题。谈谈你对RabbitMQ架构原理的理解。当时,这位小伙伴只解答说,我只会用,原理并没有关注过。那今天我给大家来分享一下我的理解。
另外,我花了很长时间,准备了一份500页的PDF面试资料文档和一份10W字的Java总结面试题和答案,
想获取的小伙伴可以
↓ ↓ ↓
扫描下方二维码联系我领取!
1、核心组件
要回答这个问题呢,首先要知道RabbitMQ架构中几个核心组件,
ENTER TITLE
浪漫和悲观并不冲突,我时常消极但又依旧觉得生活很美好,哪怕只是一束光照进了房间,也要认真对待它的到来。
它们分别是Product、Cunsumer、Broker、Connection、Channel、Queue、Exchange、Binding、VHost。
【导航条:工作原理】
(转场,屏幕黑底白字,正中央出现“1 工作原理”)
2、工作原理
那么,这些组件之间是如何协调工作的呢?下面来看这么一个动画:
ENTER TITLE
首先是,第1个和第2个,Product和Consumer分别是消息的生产者和消息的消费者,这是所有的消息中间件都有两个角色,我就不做过多介绍了。
ENTER TITLE
重点来看,第3个叫Broker,中文翻译过来叫做代理或者中介,我可以把Broker理解为就是安装RabbitMQ的服务器,就像是一栋用来存储和转发消息的房子。
ENTER TITLE
第4个就是,Connection连接。无论是生产者发送消息,还是消费者接收消息,都必须要跟Broker之间建立一个连接,那Connection呢就相当于是一个TCP的长连接。
ENTER TITLE
第5个Channel通道。如果所有的生产者发送消息和消费者接收消息,每次都创建和释放TCP长连接的话,对于Broker来说肯定会造成很大的性能损耗,也会浪费时间。
所以在AMQP协议里面引入了Channel的概念,它相当于是一个虚拟的连接。这样我们就可以在已经连接好的TCP长连接里面去创建和释放Channel,大大了减少了资源消耗。
不同的Channel是相互隔离的,每个Channel都有自己的编号。对于每个客户端线程来说,Channel就没必要共享了,各自用自己的Channel。
另外一个需要注意的是,Channel是RabbitMQ原生API里面的最重要的编程接口,也就是说我们定义交换机、队列、绑定关系,发送消息,消费消息,调用的都是Channel接口上的方法。
ENTER TITLE
第6个,Queue队列。它专门用来存储消息,Queue也是生产者和消费者的纽带,生产者发送的消息会存储到队列中,而消费者也是从队列中来消费消息。
ENTER TITLE
第7个,就是Exchange交换机。相当于消息的路由器。Exchange不会存储消息,它只做一件事情,根据规则分发消息。
ENTER TITLE
第8个,就是Binding绑定。Exchange和存储消息的队列必须建立一个绑定关系,并且为每个队列指定一个特殊的标识。
Exchange和队列是多对多的绑定关系,也就说,一个交换机的消息一个路由给多个队列,一个队列也可以接收来自多个交换机的消息。
绑定关系建立好之后,生产者发送消息到Exchange,也会携带一个特殊的标识。当这个标识跟绑定的标识匹配的时候,消息就会发给一个或者多个符合规则的队列。
ENTER TITLE
最后一个就是Vhost,全称叫Virtual Host虚拟机。为了解决不同业务系统之间的消息隔离,节约硬件成本,我们可以利用RabbitMQ的Vhost来实现资源的隔离和权限的控制。它的功能和其他编程语言中的NameSpace比较类似。
以上就是我对RabiitMQ的架构原理的理解,,小伙伴们,你是不是也理解得更加透彻了呢?
最后,我把之前分享的视频全部整理成了文字。
我是被编程耽误的文艺Tom,只弹干货不掺水!你们的支持就是我最大的动力!关注我,面试不再难!