当前位置:首页 > 服务端 > RabbitMQ 的核心组件&工作原理【很重要】

RabbitMQ 的核心组件&工作原理【很重要】

2022年08月04日 22:10:33服务端2

RabbitMQ 最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面都表现不俗,也是目前社区活跃度较高的消息中间件之一。本文我们就来看看RabbitMQ很重要的核心的组件。

一、RabbitMQ简介

RabbitMQ是一个用Erlang语言开发的、实现了AMQP协议的消息中间件。

AMQP :Advanced Message Queue,高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。

二、为什么选择RabbitMQ

  • 除了Qpid,RabbitMQ是唯一一个实现了AMQP标准的消息服务器;
  • 可靠性,RabbitMQ的持久化支持,保证了消息的稳定性;
  • 高并发,RabbitMQ使用Erlang语言开发,Erlang是一种面向并发的编程语言,天生自带高并发和高可用特性;
  • 集群部署简单,正是因为Erlang使得RabbitMQ集群部署变的超级简单;
  • 社区活跃度高;

三、RabbitMQ的核心组件

重头戏!很重要!

下图是RabbitMQ的结构模型,生产者发送消息给交换机,交换机根据路由规则,将不同的消息路由到不同的队列(什么是路由规则继续往下看),消费者订阅/监听队列,当有消息过来时,就立即消费。对着图,我们先来搞懂RabbitMQ中几个非常非常重要的概念。

RabbitMQ 的核心组件&工作原理【很重要】 _ JavaClub全栈架构师技术笔记

> Broker

Broker简单理解就是RabbitMQ服务器,图中灰色的整个部分。后面说Broker说的就是RabbitMQ服务器。

> vHost 虚拟主机

每一个RabbitMQ服务器可以开设多个虚拟主机vhost(图中粉色的部分),或者说每一个Broker里可以开设多个vhost,每一个vhost本质上是一个mini版的RabbitMQ服务器,拥有自己的 "交换机exchange、绑定Binding、队列Queue",更重要的是每一个vhost拥有独立的权限机制,这样就能安全地使用一个RabbitMQ服务器来服务多个应用程序,其中每个vhost服务一个应用程序。

每一个RabbitMQ服务器都有一个默认的虚拟主机 "/",客户端连接RabbitMQ服务时须指定vHost,如果不指定默认连接的就是"/"。

> Exchange 交换机

交换机的作用就是根据路由规则,将消息转发到对应的队列上。

> Connection

我们知道无论是生产者还是消费者,都需要和 Broker 建立连接,这个连接就是Connection(看图),是一条 TCP 连接 ,一个生产者或一个消费者与 Broker 之间只有一个Connection,即只有一条TCP连接。

> ConnectionFactory

Connection工厂,负责创建和管理Connection的。

> Channel

信道是建立在真实的TCP连接内的虚拟连接(图中白色的channel)。AMQP的命令都是通过信道发送出去的,每条信道都会被指派一个唯一ID,不论是发布消息、订阅队列还是接收消息都是通过信道完成的。一个TCP连接下包含多个信道,实现共用TCP、减少TCP创建和销毁的开销。

> Routing key

Routing key是消息头的属性,生产者将消息发送到交换机时,会在消息头上携带一个 key,这个 key就是routing key,来指定这个消息的路由规则。

> Binding

绑定,可以理解成一个动词,它的作用就是把exchange和queue按照路由规则绑定起来。

> Binding key

在绑定Exchange与Queue时,一般会指定一个binding key,生产者将消息发送给Exchange时,消息头上会携带一个routing key,当binding key与routing key相匹配时,消息将会被路由到对应的Queue中。

如果上面的各个核心概念看完了还有点迷糊,没关系,继续往下看。

四、消息是怎么从生产者到消费者的?

首先,生产者发送消息到交换机,消息头上携带一个routing key,通过routing key,交换机就知道该把消息发到哪个队列,随后交换机把消息发送到相应的队列中,再由队列将消息发送给消费者,消费者监听(订阅)某些队列,当有消息过来时,就立即处理消息。

五、交换机如何路由消息到队列

上面我们说了,生产者发送消息给交换机,消息头上会携带一个routing key,通过routing key,交换机就知道该把消息分发到哪个队列,那么交换机根据routing key如何判断这个消息应该路由到哪个队列呢?或者说交换机的路由规则是什么样的呢?

※ RabbitMQ 的交换机有四种类型:fanout、direct、topic、headers。

> fanout

fanout 交换机就跟广播一样,对消息不作选择地分发给所有绑定的队列。

> direct

RabbitMQ 的核心组件&工作原理【很重要】 _ JavaClub全栈架构师技术笔记

在 direct 模式里,交换机和队列之间绑定了一个 key(这个key就是Binding key),只有消息的 Routing key 与Binding key 相同时,交换机才会把消息发给该队列。

如上图,消息的Routing key 为 orange 时,消息将进入队列 Q1,Routing key 为 black 或green 时,消息将进入队列Q2。若消息的 key 是其他字符串,被交换机直接遗弃。

RabbitMQ 的核心组件&工作原理【很重要】 _ JavaClub全栈架构师技术笔记

同时,交换机也支持多重绑定。不同的队列可以用相同的Binding key与同一交换机绑定。如上图,当消息的Routing key为black时,消息将进入 Q1 和 Q2。

> topic

topic模式即主题模式,通过模式匹配来路由到队列。topic 模式的Routing key必须具有固定的格式:以 . 间隔的一串单词,

比如:quick.orange.rabbit,Routing key 最多不能超过255byte。

交换机和队列的Binding key用通配符来表示,有两种语法:

    * 可以替代一个单词;

    # 可以替代 0 或多个单词;

RabbitMQ 的核心组件&工作原理【很重要】 _ JavaClub全栈架构师技术笔记

上图中,Q1与交换机的Binding kye为"*.orange.*",当消息的Routing key为三个单词,且中间的单词为 orange 时,消息将进入 Q1。Q2 与 exchange的Binding key 为 "rabbit.#",当消息的Routing key以 rabbit 开头时,消息将进入 Q2 。

> headers

不常用,headers交换机是通过Headers头部来将消息映射到队列的,Headers头部携带一个Hash结构,Hash结构中要求携带一个键"x-match",这个键的Value可以是any或者all,这代表消息携带的Hash是需要全部匹配(all),还是仅匹配一个键(any)就可以了。相比直连交换机,首部交换机的优势是匹配的规则不被限定为字符串String类型。

> 默认交换机

default Exchange,默认交换机的名字是空字符串。

如果在发送消息时不指定交换机的名称,那么就会发到"默认交换机"上。默认的Exchange不进行Binding操作,任何发送到该Exchange的消息都会被转发到"Queue名字和Routing key相同的队列"中,如果vhost中不存在和Routing key同名的队列,则该消息会被抛弃。

要学习RabbitMQ,先掌握RabbitMQ的结构模型很重要,以及它们之间的工作模式,希望多加揣摩理解。

 

RabbitMQ 的核心组件&工作原理【很重要】 _ JavaClub全栈架构师技术笔记

作者:Felix-Yuan
来源链接:https://blog.csdn.net/yuanlong122716/article/details/104488654/

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/server/17453.html

标签: RabbitMQ
分享给朋友:

“RabbitMQ 的核心组件&工作原理【很重要】” 的相关文章

中间件RabbitMQ

中间件RabbitMQ

一、前言 RabbitMQ在Windows上安装非常简单,就跟日常安装应用聊天软件一样,因此这里选择Linux环境安装RabbitMQ,并且借助Docker容器进行安装,在使用Docker安装RabbitMQ之前,我们先简单的了解一下几个概念:什么...

MQ--01为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比

MQ--01为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比

MQ 是什么?队列是什么,MQ 我们可以理解为消息队列,队列我们可以理解为管道。以管道的方式做消息传递。 场景:     1.其实我们在双11的时候,当我们凌晨大量的秒杀和抢购商品,然后去结算的时候,就会发现,界面会提...

RabbitMQ基本特性

RabbitMQ基本特性

1.互联网大厂为什么选择RabbitMQ? 2.RabbitMQ的高性能之道是如何做到的? 3.什么是AMQP高级协议? 4.AMQP核心概念是什么? 5.RabbitMQ整体架构模型是什么样子? 6.RabbitMQ消息是如何流...

RabbitMQ消息队列创建

RabbitMQ消息队列创建

操作环境 centos 7.9 RabbitMQ 3.8.23 Erlang 24.1.2 局域网(内网) 本文章是通过RabbitMQ图形管理界面,进行消息创建与队列绑定 首先在RabbitMQ安装时...

消息中间件RabbitMQ学习笔记---RabbitMQ简介

消息中间件RabbitMQ学习笔记---RabbitMQ简介

消息中间件RabbitMQ学习笔记—RabbitMQ简介 1.RabbitMQ简介 RabbitMQ,俗称“兔子MQ”(可见其轻巧,敏捷),是目前非常热门的一款开源消息中间件,不管是互联网行业还是传统行业都广泛使用(最早是为了解决电信...

rabbitmq权限配置

关于rabbitmq权限的几点: rabbitmq的权限控制通过两层来实现,一是vhost的权限,二是确认有权限访问vhost后,对vhost内资源的权限控制(配置,读,写)   1.默认...

linux查看rabbitmq运行状态,RabbitMQ常用命令

RabbitMQ常用命令 rabbitmqctl命令 http://www.rabbitmq.com/man/rabbitmqctl.1.man.html# 1). 服务器启动与关闭 启动: rabbitmq-server –detach...

RabbitMQ与SpringBoot整合

RabbitMQ与SpringBoot整合

RabbitMQ  SpringBoot    一.RabbitMQ的介绍 二.Direct模式...

Window 下载安装 RabbitMQ

Window 下载安装 RabbitMQ

安装必看:erlang与rabbitmq版本对应关系表   "版本一定要匹配" 下载与安装 erlang 由于RabbitMQ是基于erlang的,所以,在正式安装RabbitMQ之前,需要先安装一下erlang。 下载链接:http://e...

activeMQ、rabbitMQ学习对比心得

activeMQ、rabbitMQ学习对比心得

一、activemq activemq工作模型比较简单。只有两种模式 queue、topics 。 queue就多对一,producer往queue里发送消息,消费者从queue里取,消费一条,就从queue里移除一条。如果一个消费者消费速度...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。