RabbitMQ:基础概述

news2024/7/6 18:34:57

RabbitMQ 是一个消息中间件,它接收消息并且转发,是“消费-生产者模型”的一个典型的代表,一端往消息队列中不断的写入消息,而另一端则可以读取或者订阅队列中的消息。

RabbitMQ 于 2007 年发布,由 erlang 语言进行开源实现,基于 AMQP(Advanced Message Queue 高级消息队列协议)基础上完成的。RabbitMQ 是当前最主流的消息中间件之一。

本篇内容包括:RabbitMQ 简介、RabbitMQ 相关概念


文章目录

    • 一、RabbitMQ 简介
        • 1、RabbitMQ 简介
        • 2、关于 erlang 语言
        • 3、关于 AMQP 协议
        • 4、关于 消息队列
    • 二、RabbitMQ 相关概念
        • 1、Broker 节点
        • 2、Exchange 消息交换机
        • 3、Queue 消息队列
        • 4、Binding 绑定
        • 5、Routing Key 路由关键字
        • 6、VHost
        • 7、Producer 消息生产者
        • 8、Consumer 消息消费者
        • 9、Channel 信道


一、RabbitMQ 简介

1、RabbitMQ 简介

RabbitMQ 是一个消息中间件,它接收消息并且转发,是“消费-生产者模型”的一个典型的代表,一端往消息队列中不断的写入消息,而另一端则可以读取或者订阅队列中的消息。

img

RabbitMQ 于 2007 年发布,由 erlang 语言进行开源实现,基于 AMQP(Advanced Message Queue 高级消息队列协议)基础上完成的。RabbitMQ 是当前最主流的消息中间件之一。

2、关于 erlang 语言

Erlang 是一门通用编程语言,主要用途是构建并发应用程序,在 1991 年由爱立信公司向用户推出了第一个版本。目的是创造一种可以应付大规模并发活动的程序设计语言和运行环境。现在 Erlang 主要用于电信行业、Web 应用、分布式计算、即时消息、电子商务等领域,负责处理大规模的并发持续连接。

3、关于 AMQP 协议

AMQP(Advanced Message Queuing Protocol)高级消息队列协议,一个提供统一消息服务的应用层标准协议,是应用层协议的一个开放标准,为面向消息的中间件设计。AMQP是一个进程间传递异步消息的网络协议。

基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同开发语言等条件的限制。

AMQP 的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP在消息提供者和客户端的行为进行了强制规定,使得不同卖商之间真正实现了互操作能力。

Ps:我们对 RabbitMQ 的学习和掌握在很大程度上就是对 AMQP 的学习和掌握!

4、关于 消息队列

消息队列 是在消息的传输过程中保存消息的容器。

消息队列 是典型的:生产者、消费者模型。生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和接收,没有业务逻辑的侵入,这样就实现了生产者和消费者的解耦。

消息队列的作用:

  • 解耦:主要是消息中间件的发布订阅功能,订阅的消息,采用拉/推的方式,避免了接口间调用时出现问题而产生阻塞的场景;
  • 异步:对于一次复杂操作可能需要耗时很长,这时候就可以对其进行时序性要求不高的功能进行拆分,通过发送消息来异步执行以提高系统响应速度;
  • 削峰:针对于大并发场景,大量请求到数据库对数据库造成压力,此时可以采用消息队列将请求信息缓存,然后按照数据库承受量对消息进行消费。

二、RabbitMQ 相关概念

1、Broker 节点

简单来说 Broker 就是消息队列服务器实体。

我们把部署 RabbitMQ 的机器称为节点,也就是 Broker。Broker 有 2 种类型节点:

  • 磁盘节点:磁盘节点的 Broker 把元数据存储在磁盘中,磁盘节点的 Broker 在重启后元数据可以通过读取磁盘进行重建,保证了元数据不丢失
  • 内存节点:内存节点的 Broker 把元数据存储在内存中,内存节点的 Broker 可以获得更高的性能,但在重启后元数据就都丢了。

2、Exchange 消息交换机

Exchange 的可以说是“人如其名”,在 RabbitMQ 的消息传递模型中,对于 Exchange 的核心思想就是:生产者生产的消息从不会直接发送到队列,生产者只能将消息发送到交换机。交换机工作的内容非常简单,一方面它接收来自生产者的消息,另一方面将它们推入队列。

Exchanges 的类型:直接(direct)、主题(topic)、标题(headers)、扇出(fanout)

3、Queue 消息队列

Queue 即消息队列载体,是 RabbitMQ 的内部对象,用于存储消息队列,并将它们转发给消费者,每个消息都会被投入到一个或多个队列(Queue)

img

4、Binding 绑定

Binding 绑定,RabbitMQ 中通过 Binding 将 Exchange 与 Queue 关联起来,在绑定的时候一般会指定一个 BindingKey(绑定建) ,这样 RabbitMQ 就知道如何正确将消息路由到队列了。

如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bmOW94Tk-1670682296011)(https://lizhengi.oss-cn-beijing.aliyuncs.com/BenjaminNode/Binding%20(1)].png)

一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表。Exchange 和 Queue 的绑定可以是多对多的关系。

5、Routing Key 路由关键字

Routing Key 路由关键字,exchange 根据这个关键字进行消息投递

Exchange 接收到的消息会带有 RoutingKey 这个字段,Exchange 就是根据这个 RoutingKey 和当前 Exchange 所有绑定的 BindingKey 做匹配,如果满足要求,就往 BindingKey 所绑定的 Queue 发送消息,这样我们就解决了我们向 RabbitMQ 发送一次消息,可以分发到不同的 Queue 的过程

  • RoutingKey:指定当前消息被谁接受
  • BindingKey:指定当前 Exchange 下,什么样的 RoutingKey 会被下派到当前绑定的 Queue 中

Ps:由 Exchange、Queue、RoutingKey 三个才能决定一个从 Exchange 到 Queue的 唯一的线路。

6、VHost

VHost 可以理解为虚拟 Broker ,即 mini-RabbitMQ server。其内部均含有独立的 queue、exchange 和 binding 等,但最最重要的是,其拥有独立的权限系统,可以做到 VHost 范围的用户控制。当然,从 RabbitMQ 的全局角度,VHost 可以作为不同权限隔离的手段(一个典型的例子就是不同的应用可以跑在不同的 VHost 中)。

7、Producer 消息生产者

Producer 消息的生产者,也就是发送消息的一方,消息一般包含两个部分:消息体(payload)和标签(Label)

8、Consumer 消息消费者

Consumer 消息的消费者,也就是接受消息一方,连接上 RabbitMQ 服务器,并订阅到队列上。消费消息只消费消息体,丢弃标签。

9、Channel 信道

Channel 信道是生产者/消费者与 RabbitMQ 通信的渠道,生产者 publish 或者消费者消费一个队列都是需要通过信道来通信的。信道是建立在 TCP 上面的虚拟链接,也就是 RabbitMQ 在一个 TCP 上面建立成百上千的信道来达到多个线程处理。

在客户端的每个连接里,可建立多个 Channel,每个 Channel 代表一个会话任务

Ps:一个TCP 被多个线程共享,每个线程对应一个信道,信道在 RabbitMQ 都有唯一的 ID,保证了信道的私有性,对应上唯一的线程使用。

Ps:RabbitMQ 需要使用信道,而不是直接进行 TCP 通信的原因:TCP的创建开销很大,创建需要三次握手,销毁需要四次握手。而且 TCP 可以被多个线程共享,显然线程比 TCP 要省事的多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/78469.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

37_软件I2C通信实验

目录 I2C通信协议 多主机I2C总线系统结构 I2C协议 应答信号ACK 数据有效性 数据传输 I2C设备地址 I2C通讯整个过程 硬件连接 EEPROM(24C02) 24C02字节写时序 24C02字节读时序 实验源码 I2C通信协议 I2C(IIC,Inter-Integrated Circuit),两线式串行总线,由PHILIPS公…

ATtiny13与Proteus仿真-ADC仿真

ADC仿真 1、ADC介绍 ATtiny13的ADC有如下特点: 10位分辨率0.5 LSB 积分非线性 2 LSB 绝对精度13 - 260 μs 转换时间在最高分辨率下高达 15 kSPS四个多路复用单端输入通道ADC 结果读数的可选左调整0 - VCC ADC 输入电压范围可选择的 1.1V ADC 参考电压自由运行或单一转换模式…

[附源码]计算机毕业设计家庭医生签约服务管理系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

dmb ish osh

转自:原理和实战解析Linux中如何正确地使用内存屏障 圈里流传着一句话“珍爱生命,远离屏障”,这足以说明内存屏障是一个相当晦涩和难以准确把握的东西。使用过弱的屏障,会导致软件不稳定。使用过强的屏障,会引起性能问…

c语言篇(动态内存管理)

前言: 对于数据的存储我们可以静态存储,也可以动态存储,两种方式都有自己特有的好处,这篇文章教我们如和进行动态的数据存储!!!! 💞 💞 欢迎来到小马学习代码…

自动驾驶之单目3D目标检测TensorRT调研

目前在github上只能找到2个项目 TensorRT-CenterNet-3D tkDNN 两者都是使用CenterNet,但第1个基于TensorRT5,无法与当前最新的TensorRT6和TensorRT7兼容。经测试,第1个无法在XavierJetpack 4.3/4.4上部署,因此选择部署第二个tkDNN。 1. 基本…

Python学习基础笔记三十八——time模块

1、time模块:和时间有关系的,我们就用到了时间模块: import timeprint(time.time()) #获得当前时间戳 2、表示时间的三种方式: 在Python中,通常用三种方式来表示时间:时间戳、元组(struct_time)、格式…

LeetCode刷题复盘笔记—一文搞懂动态规划之337. 打家劫舍 III问题(动态规划系列第十九篇)

今日主要总结一下动态规划完全背包的一道题目,337. 打家劫舍 III 题目:337. 打家劫舍 III Leetcode题目地址 题目描述: 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。 除了 root 之外&#xff0…

UDS入门至精通系列:Service 19(二)

文章目录 前言一、协议的定义(19 04/06)二、数据库编辑(CANdelaStudio)三、CAPL应用(Service 19 04 / 06)总结前言 本文主要讲述了ECU诊断中用到的DTC Status以及Service 19 02作用和用法。 本文主要讲述了ECU诊断中用到的DTC Status以及Service 19 02作用和用法。 本文…

Transformer15

今天还是Transformer~~ 都连载这么多了 , 据说是全球首个面向遥感任务设计的亿级视觉大模型 大规模视觉基础模型在基于自然图像的视觉任务中取得了重大进展。得益于良好的可扩展性和表征能力,基于视觉Transformer (Vision Transformer, ViT) 的大规模视觉基础模型吸…

Instruction Tuning(FLAN、instructGPT、chatGPT)

首页最近被chatGPT刷屏,但翔二博主左看右看发现很多想法似乎都是一脉相通的,于是连夜从存档中找了一些文章尝试理一理它的理论路线。 具身智能综述和应用(Embodied AI)多模态中的指令控制 同时想到今年在智源人工智能前沿报告&a…

线程,线程池的使用

文章目录线程,线程池的使用1. 多线程基础1.1 线程和进程1.2 多线程的创建1.2.1 继承Thread类1.2.2 实现Runnable接口1.2.3 匿名内部类方式1.2.4 守护线程1.3 线程安全1.3.1 卖票案例1.3.2 线程同步2. 线程池的实现方式2.1 Java提供的四种线程池2.2 线程池的创建原理…

微信小程序开发【从0到1~入门篇】

目录 1. 微信小程序介绍 1.1 什么是小程序? 1.2 小程序可以干什么? 2. 申请账号 2.1 申请帐号 2.2 测试号申请(我们小程序账号申请完成之后,建议务必要申请一个测试号用来开发) 3. 安装开发工具 3.1 选择稳定…

我的创作纪念日(2021-12-10 2022-12-10)

🌆 内容速览阴差阳错成为一名博主?这一年来的收获日常生活未来憧憬阴差阳错成为一名博主? 如上图所见,她就是我在CSDN上发布的第一篇博客——无标题,有时候机缘来的那么突然,我甚至都没有给她想一个凑合的名…

spring——Spring 注入内部Bean——构造函数方式注入内部 Bean

项目依赖&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.or…

【MySQL进阶篇】存储引擎

&#x1f349;个人主页&#xff1a;个人主页 &#x1f353;系列专栏&#xff1a;MySQL数据库 目录 1.MySQL体系结构 1). 连接层 2). 服务层 3). 引擎层 4). 存储层 2.存储引擎介绍 3.存储引擎特点 1. InnoDB 2.MyISAM 3.Memory 4.区别及特点 4.存储引擎选择 1.MySQ…

MAC QT OpenGL 图像曝光度调节

目录 一.MAC QT OpenGL 图像曝光度调节演示 1.原始图片2.效果演示 二.MAC QT OpenGL 图像曝光度调节源码下载三.其他平台图像曝光度调节版本 1.IOS 曝光度演示效果2.Windows OpenGL ES 曝光度演示效果3.Windows OpenGL 曝光度演示效果 四.猜你喜欢 零基础 OpenGL ES 学习路线推…

39-kafka-监控Eagle

39-kafka-监控Eagle&#xff1a; Eagle的安装 1.修改 kafka 启动命令 修改 kafka-server-start.sh 命令中 if [ "x$KAFKA_HEAP_OPTS" "x" ]; then export KAFKA_HEAP_OPTS"-Xmx1G -Xms1G" fi 为 if [ "x$KAFKA_HEAP_OPTS" &qu…

功能测试(八)—— APP之专项测试、性能测试、性能测试工具SoloPi

目录 APP测试要点 目标 一、APP专项测试 1.1 兼容性 1.2 安装 1.3 卸载 1.4 升级 1.5 干扰测试(交叉事件测试) 1.6 Push推送 1.7 用户体验 二、 性能测试工具 2.1 APP性能测试工具介绍 —— SoloPi简介 2.2 APP性能测试工具 —— SoloPi使用 三、APP性能测试 3.…

English Learning - L2 窥得大段表达门径 2022.12.8 周四

English Learning - L2 窥得大段表达门径 2022.12.8 周四引言2 形容词2.1 -ing 形容词 VS -ed 形容词核心思想举例3 名词3.1 修饰成分修饰成分的排列的黄金原则&#xff1a;左二右六举例3.2 名词的数3.2.1 "名词 介词/副词/不定式 等" 构成的复合名词变复数&#xf…