探秘 RabbitMQ 的设计理念与核心技术要点

目录

一、消息中间件介绍

        1.1 消息中间件的作用

二、RabbitMQ

        2.1 核心概念

        2.2 生产者发送消息过程

        2.3 消费者接收消息过程

        2.4 RabbitMQ 为何要引入信道(channel)

        2.5 消费模式


一、消息中间件介绍

        消息队列中间件(message queue middleWare, MQ)指利用高效可靠消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程通信。

        一般有两种传递模式:点对点模式和发布订阅模式。点对点的模式是基于队列的,消息生产者发送消息到队列,消费者从队列中接收消息,队列的存在使得消息的异步传输成为可能。发布订阅模式定义了如何向一个内容节点发布和订阅,这个内容节点称为主题(topic),主题可以认为是消息传递的中介,消息发布者将消息发布到某个主题,消息订阅者从主题中订阅消息。

        消息中间件将消息路由给应用程序B,这样消息可以完全存在于两台不同的计算机上。消息中间件负责网络通信,如果网络不可用,消息中间件会存储消息直到连接可用。

        1.1 消息中间件的作用

        解耦:生产者和消费者完全解耦,双方都感知不到对方的存在。

        冗余(存储):有些情况数据处理会失败,消息中间件可以把数据进行持久化,直到他们已经被完全处理。通过这种方式规避数据丢失的风险。

        扩展性:因为消息中间件解藕了应用的处理过程,所以提高消息入队和处理的效率很容易。

        削峰:在访问剧增的情况下,应用仍然需要继续发挥作用,但这种突发的流量并不常见,如果以处理峰值的标准来投入资源,无疑是巨大的浪费,使用消息中间件支撑突发的流量,不会因为超负荷请求而完全奔溃。

        可恢复性:当系统的一部分组件失效时不影响整个系统。降低了应用间的耦合性,系统恢复后还能继续处理消息。

        顺序保证:大多数场景下,顺序处理数据很重要,大部分消息中间件支持一定程度上的顺序性。

        缓冲:在任何重要的系统中,都会存在需要不同处理时间的元素,消息中间件通过一个缓冲层来帮助任务最高效率的执行,写入消息中间件的处理尽可能的快。该缓冲层有助于控制和优化数据流经过系统的速度。

        异步通信:很多时候不需要立即处理消息,消息中间件提供了异步处理机制。

二、RabbitMQ

        RabbitMQ 是一个开源的消息中间件(Message Broker),遵循 Advanced Message Queuing Protocol (AMQP) 标准协议。它允许应用程序通过发送和接收消息来进行异步通信,从而实现系统之间的松耦合和解耦合。RabbitMQ 支持多种操作系统,广泛应用于分布式系统架构中,尤其是在微服务、异步处理、负载均衡、峰值负载处理、消息队列、事件驱动架构等领域。

        rabbitMQ整体上是一个生产者与消费者模型,主要负责接收、存储和转发消息。整体结构架构图如下:

        生产者:投递消息的一方。创建消息,然后投递到 RabbitMQ 中。消息一般包含两部分:消息体和标签(label)。消息体称为 payload,标签用来表述这条消息,比如一个交换器的名称和一个路由键。生产者把消息给 RabbitMQ,RabbitMQ 根据标签把消息发送给感兴趣的消费者。

        消费者:接收消息的一方。消费者消费一条消息的时候,只是消费消息的消息体(payload)。在消息路由的过程中,消息的标签会丢弃,存入到队列中的消息只有消息体,消费者也只会消费消息体。

        Broker:消息中间件的服务节点。一个 RabbitMQ Broker 可以简单地看作一个 RabbitMQ 服务节点,或者 RabbitMQ 服务实例。

        2.1 核心概念

        队列:用来存储消息,RabbitMQ 中消息只能存储在队列中。多个消费者可以订阅同一个队列,这时队列中的消息会被平均分摊(轮询)。

        交换器:生产者将消息发送给交换器,由交换器将消息路由到一个或者多个队列中。如果路由不到,会返给消费者,或者直接丢弃。

        RoutingKey:路由键,生产者将消息发送给交换器的时候,一般会指定一个 RoutingKey,用来指定这个消息的路由规则,而这个 RoutingKey 需要与交换器类型和绑定键(bindingKey)联合使用才能生效。RoutingKey 与 bindingKey 的值其实是同一个,但代表的意义不同

        BindingKey:通过绑定将交换器和队列关联起来,在绑定的时候一般会指定一个绑定键(BindingKey),这样 RabbitMQ 就知道如何正确将消息路由到队列了。

        RabbitMQ 中常用的交换器有四种,fanout、direct、topic、headers 这四种。AMQP 协议中还提到另外两种:system 和自定义。四种常用交换器如下:

        fanout交换器:把所有发送到该交换器的消息路由到所有与该交换器绑定的队列中。

        direct交换器:把消息路由到那些 BindingKey 和 RoutingKey 完全匹配的队列中。

        topic交换器:与 direct 相似,也是将消息路由到 BindingKey 和 RoutingKey 相匹配的队列中,但这里的匹配规则有些不同。有. * # 三个符号。

        headers交换器:交换器不依赖于路由键的匹配规则,而是根据发送的消息内容中的 headers 属性进行匹配。性能较差,应用不多。

        2.2 生产者发送消息过程

            RabbitMQ 中生产者(Producer)发送消息的过程可以概括为以下几个步骤:

  1. 生产者连接到 broker,建立一个连接(connection),开启一个信道(channel)
  2. 生产者声明一个交换器,并设置相关属性,如交换器类型、是否持久化。
  3. 生产者声明一个队列并设置相关属性
  4. 生产者通过路由键将交换器和队列绑定起来
  5. 生产者发送消息至 broker,其中包括路由键交换器等信息
  6. 相应的交换器根据接收到的路由键查找匹配的队列
  7. 如果找到,则将从生产者发来的消息存入相应的队列中。
  8. 如果没找到,则根据生产者的配置选择丢弃还是回退给生产者
  9. 关闭信道
  10. 关闭连接

        2.3 消费者接收消息过程

              消费者消费消息的过程如下:

  1. 消费者连接到 broker,建立一个连接(connection),开启一个信道(channel)
  2. 消费者向 broker 请求消费相应的队列中的消息,可能会设置相应的回调函数及一些准备工作。
  3. 等待 broker 回应并投递相应队列中的消息,消费者接收消息
  4. 消费者确认(ack)接收到的消息。
  5. RabbitMQ 从队列中删除相应已经被确认的消息
  6. 关闭信道,关闭连接。

        2.4 RabbitMQ 为何要引入信道(channel)

        客户端和 broker 建立的连接是 TCP 连接,一旦连接建立起来,客户端紧接着可以创建一个AMQP 信道,RabbitMQ 处理的每条 AMQP 指令都是通过信道完成的。

        我们可以完全通过 connection 来完成工作,为什么要引入信道呢?一个应用程序中有很多线程需要从 RabbitMQ 中消费,或者生产消息,那么必然需要建立很多连接。然而对于操作系统而言,建立和销毁 TCP 连接是非常昂贵的开销,如果遇到业务高峰,性能随之显现。RabbitMQ采用类似 NIO 的做法,选择 TCP 复用,不仅可以减少性能开销,同时也便于管理。

        每个线程把持一个信道,所以信道复用 connection 的 TCP 连接。同时 RabbitMQ 可以确保每个线程的私密性。就像拥有独立的连接一样。当每个信道流量不是很大时,复用单一的connection 可以在产生性能瓶颈情况下有效节省 TCP 资源。但是当信道本身的流量很大时,这时多个信道复用一个 connection 就会产生性能瓶颈,进而使整体的流量被限制。此时就需要开辟多个 connection,将这些信道均摊到这些 connection 中。

        2.5 消费模式

        RabbitMQ 的消费方式分为两种:推模式和拉模式。

        在推模式中,可以通过持续订阅的方式来消费消息。在投递模期间,RabbitMQ 会不断的推送消息给消费者,当然推送的个数还是会受到 Basic.Qos 的限制。如果只是想从队列获得单条消息而不是持续订阅可以选择拉模式。如果要实现高吞吐量,消费者应使用推模式。

        关于 RabbitMQ 的基础支持就介绍到这里,下篇文章将带你了解其高阶应用,欢迎关注。

往期经典推荐

走进 Mybatis 内核世界:理解原理,释放更多生产力-CSDN博客

一文掌握Java动态代理的奥秘与应用场景-CSDN博客

领航分布式消息系统:一起探索Apache Kafka的核心术语及其应用场景-CSDN博客

深入剖析Kafka生产者:揭秘消息从发送到落地的全过程-CSDN博客

Kafka消息流转的挑战与对策:消息丢失与重复消费问题_kafka发送消息生产者关闭了-CSDN博客

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

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

相关文章

刷题之贪心3

前言 大家好,我是jiantaoyab,这篇文章将给大家介绍贪心算法和贪心算法题目的练习和解析,贪心算法的本质就是每一个阶段都是局部最优,从而实现全局最优。加上这篇文章一共有30道贪心题目了,加油! 坏了的计算器 题目分析…

【学习】软件测试行业有哪些从业方向

从事任何一个行业,不论想入行的新人还是已经在职的从业人员,一定要系统化的掌握自身的学习路线和发展方向,随时对自身的优劣点掌握清楚。尤其是对于软件测试这个岗位。测试职业所涉及的技能范围比较广,测试流程、测试计划、缺陷管…

考研数学|《1800》《1000》《880》《660》最佳搭配使用方法

直接说结论:基础不好先做1800、强化之前660,强化可选880/1000题。 首先,传统习题册存在的一个问题是题量较大,但难度波动较大。《汤家凤1800》和《张宇1000》题量庞大,但有些题目难度不够平衡,有些过于简单…

财务收支系统怎么做,财务收支记账软件管理系统教程

财务收支系统怎么做,财务收支记账软件管理系统教程 一、前言 以下软件操作教程以 佳易王财务收支记账软件V17.0为例说明 件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 财务收支记账管理系统软件可按需定制 1、权限设置:管理员账…

【Java程序设计】【C00345】基于Springboot的船舶监造管理系统(有论文)

基于Springboot的船舶监造管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 项目获取 🍅文末点击卡片获取源码🍅 开发环境 运行环境:推荐jdk1.8; 开发工具:eclipse以及i…

第四届数字信号与计算机通信国际学术会议(DSCC 2024)

#高录用,稳检索# #高校背书,更可靠# DSCC 2024已通过SPIE出版社审核,ISSN号已确定:ISSN: 0277-786X,往届均已见刊EI检索! 第四届数字信号与计算机通信国际学术会议(DSCC 2024) 2024 …

智慧校园数据可视化有什么好处?怎么推进数字化校园方案?

在当今数字化时代,越来越多学校开始实施智慧校园计划,旨在为学生和教师提供更高效、便捷的学习和教学环境。智慧校园运用互联网、大数据、人工智能等技术,对校园内各信息进行收集、整合、分析和应用,实现教学、管理、服务等多方面…

python和Vue开发的RBAC用户角色权限管理系统

后端框架:python的FastAPI作为后端服务和python-jose作为JWT认证 前端框架:Vue3构建页面和Vue Router作为路由管理,Pinia作为数据存储,Vite作为打包工具 可以实现菜单控制和路由控制,页面里面有按钮权限控制&#xf…

java解决跨域问题

浏览器js在访问服务器中的资源时,会出现同一页面或者不同域名(协议,IP,端口)不可访问 例如:file://d://test.html页面(file协议)中通过ajax访问服务器api.test.com的接口(http协议),由于协议不同,此时会出现浏览器访问…

相对全面的四足机器人驱动规划MATLAB和Simulink实现方式(足端摆线规划,Hopf-CPG,Kimura-CPG)

许久没更新四足机器人相关的博客文章,由于去年一整年都在干各种各样的~活,终于把硕士毕业论文给写好,才有点时间更新自己的所学和感悟。步态规划和足端规划只是为了在运动学层面获取四足机器人各关节的期望角位移和速度信号,再由底…

Nacos部署(二)Linux部署Nacos2.3.x集群环境

😊 作者: 一恍过去 💖 主页: https://blog.csdn.net/zhuocailing3390 🎊 社区: Java技术栈交流 🎉 主题: Nacos部署(二)Linux部署Nacos2.3.x集群环境 ⏱️…

Xshell连接虚拟机非常慢

问题: 打开虚拟机连接时发现过了几分钟依然卡着在,但是主机可以ping通虚拟机,虚拟机也可以ping通主机感觉很奇怪,查询后得知需要修改ssh设置 打开配置 vim /etc/ssh/sshd_config 修改配置 找到 UseDNS,去掉前面的#号…

React中 类组件 与 函数组件 的区别

类组件 与 函数组件 的区别 1. 类组件2. 函数组件HookuseStateuseEffectuseCallbackuseMemouseContextuseRef 3. 函数组件与类组件的区别3.1 表面差异3.2 最大不同原因 1. 类组件 在React中,类组件就是基于ES6语法,通过继承 React.component 得到的组件…

面试八股文之JAVA基础

JAVA基础 DNS、CDN?如何实现对象克隆?父子类静态代码块, 非静态代码块, 构造方法执行顺序?String s new String("abc") 创建了几个对象, 分别放到哪里?OSI网络模型七层?应用层协议?http协议和https协议区别?传输层协…

蓝桥杯小白月赛3.23

题目描述&#xff1a; AC代码&#xff1a; #include <iostream> #include<cstring> #include<algorithm>using namespace std;const int N 2e510; string str[N]; //写上&会速度更快一些 bool cmp(const string &s1,const string &s2) {//例…

苹果App Store上架工具介绍

文章目录 摘要引言正文1. Xcode2. [appuploder](https://www.applicationloader.net/)3. [克魔助手](https://keymob.com/) 4.[ipa guard](https://www.ipaguard.com/)总结参考资料 摘要 苹果App Store作为iOS应用程序的主要分发渠道&#xff0c;上架应用程序需要遵守规定和通…

华为数通方向HCIP-DataCom H12-821题库(多选题:201-220)

第201题 以下关于BGP中Orginator ID属性的描述,正确的是哪些项? A、Originator ID属于公认任意属性 B、当其他BGP Speaker接收到这条路由的时候,将比较收到的0nginator ID和本地的Router ID,如果两个ID相同BGP Speaker会忽略掉这条路由,不做处理 C、当一条路由第一次被RR…

输入与输出

输入(Scanner类) Scanner是java5的新特性&#xff0c;在java.util包里&#xff0c;可以完成用户输入。步骤&#xff1a; 导入java.util包&#xff1b;构造Scanner对象&#xff0c;参数为u标准输入流System.in&#xff1b;使用next()方法系列接收数据 nextBoolean()接收一个布…

后端基础篇- 社区 IDEA 手动 Maven 创建 SpringBoot 项目、Maven 安装与配置环境变量、IDEA 集成 Maven

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 Maven 安装与配置环境变量 1.1 下载并解压安装包 1.2 配置本地仓库 1.3 配置阿里云私服 1.4 配置环境变量 2.0 IDEA 集成 Maven 2.1 首先创建一个新项目 2.2 开始…

电商系列之满减

> 插&#xff1a;AI时代&#xff0c;程序员或多或少要了解些人工智能&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家…