MQ底层原理

news2025/4/23 14:23:25

RabbitMQ

概述

  • RabbitMQ 是⼀个开源的⾼性能、可扩展、消息中间件(Message Broker),实现了 Advanced Message
    Queuing Protocol(AMQP)协议,可以帮助不同应⽤程序之间进⾏通信和数据交换。
  • RabbitMQ 是由 Erlang 开发的,⽀持多种编程语⾔,包括 Java、Python、Ruby、PHP、C# 等。它的
    核⼼思想是将发送者(producer)与接收者(consumer)完全解耦,实现异步处理和低耦合度的系统架构。
    在这里插入图片描述
    RabbitMQ的消息消费链路
      消息会exchange复制,然后派发到多个不同的队列上。同⼀条消息需要占⽤多份存储空间,空间利⽤率不是很⾼。
    在这里插入图片描述

Broker

  在消息队列(Message Queue,MQ)系统中,Broker 是核心组件,负责消息的接收、存储、路由和传递。它作为消息中间件的服务器端,协调生产者(Producer)和消费者(Consumer)之间的通信,确保消息可靠传输。

Broker 的工作流程

  • 生产者将消息发送到 Broker。

  • Broker 根据配置的路由规则将消息存储到指定队列或主题。

  • Broker 将消息推送给消费者(Push 模式)或等待消费者拉取(Pull 模式)。

  • Broker 确认消息消费成功(ACK 机制),或重新投递未确认的消息。

Broker 的重要性

  • 解耦:分离生产者和消费者,允许系统异步通信。

  • 削峰填谷:应对流量高峰,避免服务过载。

  • 可靠性:通过持久化和重试机制确保消息不丢失。

  • 扩展性:通过集群横向扩展处理能力。

选择 Broker 的考量因素

  • 性能:吞吐量、延迟(如 Kafka 适合高吞吐,RabbitMQ 适合低延迟)。

  • 持久化机制:是否需要保证消息不丢失。

  • 协议支持:是否兼容现有系统。

  • 运维复杂度:集群管理、监控工具是否完善。

Exchange机制

Fanout类型

Fanout即⼴播模式
在这里插入图片描述

Direct类型

根据routing_key将消息投递到指定的队列上。
在这里插入图片描述

Topic类型

更加灵活的routing_key, ⽀持⽤通配符的⽅式处理消息的投递。
在这里插入图片描述

Header类型

  更为细粒度的匹配逻辑,在投递消息的请求头上,注⼊多个header参数,路由规则是根据header的参 数去决定要投递哪个队列。

消息错误处理

  • 消费异常的数据,会被投递到⼀条死信队列⾥⾯,后边重新再拉取消费。
  • 消费端消费消息,写⼊db。(db的连接池满了,数据写⼊失败。消息重试:晚点再消费⼀次消息,过 ⼀段时间再去消费。)
    在这里插入图片描述

消息顺序消费设计

RabbitMQ的顺序消费能⼒不⾏,消费者如果使⽤多线程消费,⽆法保证多线程的处理顺序。
在这里插入图片描述
多个消费者对应⼀条队列,也是会有顺序错乱的问题。

RocketMQ

组成部分

  • Broker
  • NameServer(注册中⼼)
    客⼾端和NameServer建⽴⻓链接,然后获取得到Broker的地址,再去访问Broker进⾏消息的投递和消费。
    在这里插入图片描述

长连接(Long Connection):客户端与服务器建立TCP连接后,在完成一次请求后不会立即关闭连接,而是保持连接状态,以便后续多次通信复用该连接。

RocketMQ的发送链路

  消息会先被发送到broker端存储,然后触发⼀个 dispatch 的动作,将消息的“索引信息”投递到不同的消费队列上边。最后每个消费者和具体的⼀条队列绑定关系后,便可以从队列中拉取最新 dispatch 过来的消息。
在这里插入图片描述
从RocketMQ和RabbitMQ的消息发送链路来看,会有⼀些出⼊:

• RocketMQ的消息主要都存放在了CommitLog⾥⾯,在消费队列存储的是消息的“索引”信息。
• RocketMQ的⼀条队列,⼀次只能允许被⼀个消费者占⽤,不能让多个消费者访问。

消费组

  RocketMQ⾥⾯会有消费组的概念,即同⼀个topic下会有多个消费者,多个消费者可以组成不同的组别。⽽同⼀个组别的多个消费者们所持有的队列是互斥的。
在这里插入图片描述

消息回溯

  在RocketMQ官⽅提供的控制台上,是具备这⽅⾯能⼒的。
在这里插入图片描述

RocketMQ 的消息回溯功能允许消费者将消费进度(Offset)重置到过去的某个时间点或指定的消息位置,从而重新消费历史消息。

事务消息

  RocketMQ在4.3.0版中开始⽀持分布式事务消息,RocketMQ采⽤了2PC的思想来实现了提交事务消息,同时增加⼀个补偿逻辑来处理⼆阶段超时或者失败的消息。

延迟消息

  RocketMQ会在broker端,将需要延迟的消息都放在⼀个备份区域中(按照延迟的level放到不同的 queue⾥⾯去),然后有⼀个定时任务,扫描到期的数据,到期之后就将消息重新放⼊到对应队列⾥⾯。

RocketMQ的⾼性能原理

  • 读写磁盘⾼性能的本质原因MMap技术

  将磁盘空间映射到了内存区域,接着所有的写操作都是直接写⼊到了该块内存区域,然后根据策略同步/异步持久化到了磁盘中,这相对于传统的io磁盘性能要更⾼效。
在这里插入图片描述

RocketMQ对mmap技术的⼀些优化
• 预映射 + 内存锁定 (系统内核的api调⽤)
在RocketMQ启动阶段,会先提前预先锁定内存映射模块,避免映射的内存被操作系统给置换了出去。

Kafka

Kafka与Zookeeper

  Kafka早期版本和zookeeper其实是需要组合使⽤的,不过后边的架构设计中,在逐渐的解除和zk的耦合。早期的Kafka架构设计⾥⾯,Zookeeper主要是负责管理起具体的broker机器信息。
在这里插入图片描述

  • Broker启动的时候,把地址注册到broker上,也就是/kafka/broker/ids⽬录下写⼊broker的id。
  • 然后多个broker争先抢占zk的⼀个节点,在/kafka/controller⽬录下,抢占到该节点的broker是
    Controller⻆⾊(分布式锁思路),主要负责后续的topic编辑,分区管理等作⽤。这台Broker上会保存集群中最全的Broker数据信息,其他的Broker节点需要定期往这台机器上报⾃⼰的信息。
  • zk的临时节点消失,其他Broker重新抢锁,选出新的 Controller⻆⾊
    在这里插入图片描述
    摒弃了zk依赖之后,其实后边Kafka使⽤了⾃研的 Controller Quorum 替换了之前zk的⻆⾊。

Kafka的消息发送和消费链路

  Kafka的消息发送和消费架构其实和前边两款MQ的架构有点类似:
在这里插入图片描述
  当producer发送消息抵达Broker之后,Broker会将发送过来的消息存放在不同的partition模块中,这⾥要注意,Kafka的partition你可以理解为类似于RocketMQ⾥⾯的CommitLog,存储实际消息的⼀个结构,但是它和RocketMQ的commitlog不同,Kafka不会把所有的topic信息都往⼀个commitlog⾥ ⾯去顺序写⼊,⽽是按照topic为粒度去写⼊。

  这样设计的好处在于:多个主题,多个partition模块管理,可以让多核cpu的计算机充分发挥其性能。
在这里插入图片描述
  在Kafka的集群架构⾥⾯,不同的Partition⽂件会被分散到不同的Broker上存放,这样可以让不同的机器负责不同的Partition⽂件写⼊,可以保证同⼀个Topic下的消息写⼊不会只单单受限于单台机器的硬件性能。
在这里插入图片描述

Kafka的消息存储原理

  topic下的消息存储结构如下图所⽰,在⼀个segment下边会有.log,.index,.timestamp⽂件存在, Kafka⾥⾯的消息存储实际上是存在⼀个个不同的segment⾥⾯的。
在这里插入图片描述
所谓的segment其实也是⼀个虚拟的概念,实际映射到物理磁盘上,分成了.log,.index,.timestamp⽂件的组合。

• .log⽂件实际的数据存储⽂件,顺序写⼊存储。
• .index⽂件索引⽂件,⾥⾯保存了具体消息存在于.log的地址信息。
• .timestamp⽂件⽤于记录哪些消息是7天以内的,如果超过了7天,⼀般消息默认会被删除。

Kafka读写数据的⾼性能原理

  • 写⼊数据⽤了MMap技术

MMap虚拟内存映射,能够实现⾮常⾼效的⽂件读写能⼒。

  • 消费者拉取数据使⽤了SendFile技术

⽽ Linux 2.4+ 内核通过 sendfile 系统调⽤,提供了零拷⻉。磁盘数据通过 DMA 拷⻉到内核态 Buffer 后,直接通过 DMA 拷⻉到 NIC Buffer(socket buffer),⽆需 CPU 拷⻉。这也是零拷⻉这⼀说法的来源。除了减少数据拷⻉外,因为整个读⽂件 - ⽹络发送由⼀个 sendfile 调⽤完成,整个过程只有两次上下⽂切换,因此⼤⼤提⾼了性能。

Consumer -> broker 读数据(⽹络)(⽹卡接收consumer数据->broker读取数据(mmap定位数据)-> 通过⽹络发送给到consumer)

• 传统数据在⽹卡上的发送链路
在这里插入图片描述
• 使⽤SendFile技术后,数据在⽹卡端的发送链路
在这里插入图片描述

SendFile 是一种高效的文件传输技术,通过操作系统提供的系统调用(如 Linux 的 sendfile())实现数据直接从文件系统传输到网络套接字,避免数据在用户空间和内核空间之间的多次拷贝,从而显著提升传输性能。这种技术属于“零拷贝(Zero-Copy)”优化的一种实现。

三种消息队列对⽐

RabbitMQRocketMQKafka
语言erlangjavaScala/Java
性能一般非常强
消息存储按照topic区别存储,消息复制到多个queue中。所有topic的消息统一存储在一份commitlog里面。按topic粒度分散在不同的partition中,底层以segment的.log文件为粒度进行存储。
运维难度简单简单
适用场景- 可靠性要求高的消息传递场景
- 广告推送,用户状态变更等
- 可以覆盖RabbitMQ的场景
- 支持事务消息,结合最终一致性思想来用于解决分布式事务
- 支持延迟消息能力
- 实时计算,电商秒杀
- 高性能,高可用计算
- 实时计算,大数据分析
- 日志采集
- 事件总线
失败重试支持支持需要手动实现
性能30mb/s650mb/s650mb/s

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

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

相关文章

本地部署DeepSeek-R1模型接入PyCharm

以下是DeepSeek-R1本地部署及接入PyCharm的详细步骤指南,整合了视频内容及官方文档核心要点: 一、本地部署DeepSeek-R1模型 1. 安装Ollama框架 ​下载安装包 访问Ollama官网(https://ollama.com/download)Windows用户选择.exe文件,macOS用户选择.dmg包。 ​安装验证 双击…

Java基于SpringBoot的企业车辆管理系统,附源码+文档说明

博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…

进阶篇 第 2 篇:自相关性深度解析 - ACF 与 PACF 图完全指南

进阶篇 第 2 篇:自相关性深度解析 - ACF 与 PACF 图完全指南 (图片来源: Negative Space on Pexels) 欢迎来到进阶系列的第二篇!在上一篇,我们探讨了更高级的时间序列分解技术和强大的指数平滑 (ETS) 预测模型。ETS 模型通过巧妙的加权平均捕…

鸿蒙移动应用开发--渲染控制实验

任务:使用“对象数组”、“ForEach渲染”、“Badge角标组件”、“Grid布局”等相关知识,实现生效抽奖卡案例。如图1所示: 图1 生肖抽奖卡实例图 图1(a)中有6张生肖卡可以抽奖,每抽中一张,会通过弹层显示出来&#xf…

安宝特分享|AR智能装备赋能企业效率跃升

AR装备开启智能培训新时代 在智能制造与数字化转型浪潮下,传统培训体系正面临深度重构。安宝特基于工业级AR智能终端打造的培训系统,可助力企业构建智慧培训新生态。 AR技术在不同领域的助力 01远程指导方面 相较于传统视频教学的单向输出模式&#x…

SpringCloud组件—Eureka

一.背景 1.问题提出 我们在一个父项目下写了两个子项目,需要两个子项目之间相互调用。我们可以发送HTTP请求来获取我们想要的资源,具体实现的方法有很多,可以用HttpURLConnection、HttpClient、Okhttp、 RestTemplate等。 举个例子&#x…

模型 螃蟹效应

系列文章分享模型,了解更多👉 模型_思维模型目录。个体互钳,团队难行。 1 螃蟹效应的应用 1.1 教育行业—优秀教师遭集体举报 行业背景:某市重点中学推行绩效改革,将班级升学率与教师奖金直接挂钩,打破原…

符号速率估计——小波变换法

[TOC]符号速率估计——小波变换法 一、原理 1.Haar小波变换 小波变换在信号处理领域被成为数学显微镜,不同于傅里叶变换,小波变换可以观测信号随时间变换的频谱特征,因此,常用于时频分析。   当小波变换前后位置处于同一个码元…

每日算法-250422

每日算法 - 250422 1561. 你可以获得的最大硬币数目 题目 思路 贪心 解题过程 根据题意,我们想要获得最大的硬币数目。每次选择时,有三堆硬币:最大的一堆会被 Alice 拿走,最小的一堆会被 Bob 拿走,剩下的一堆&#xf…

【MATLAB第116期】基于MATLAB的NBRO-XGBoost的SHAP可解释回归模型(敏感性分析方法)

【MATLAB第116期】基于MATLAB的NBRO-XGBoost的SHAP可解释回归模型(敏感性分析方法) 引言 该文章实现了一个可解释的回归模型,使用NBRO-XGBoost(方法可以替换,但是需要有一定的编程基础)来预测特征输出。该…

微信公众号消息模板推送没有“详情“按钮?无法点击跳转

踩坑!!!!踩坑!!!!踩坑!!!! 如下 简单说下我的情况,按官方文档传参url了 、但就是看不到查看详情按钮 。如下 真凶&#x…

电动单座V型调节阀的“隐形守护者”——阀杆节流套如何解决高流速冲刷难题

电动单座V型调节阀的“隐形守护者”——阀杆节流套如何解决高流速冲刷难题? 在工业自动化控制中,电动单座V型调节阀因其精准的流量调节能力,成为石油、化工等领域的核心设备。然而,长期高流速工况下,阀芯与阀座的冲刷腐…

自动驾驶与机器人算法学习

自动驾驶与机器人算法学习 直播与学习途径 欢迎你的点赞关注~

【网络编程】TCP数据流套接字编程

目录 一. TCP API 二. TCP回显服务器-客户端 1. 服务器 2. 客户端 3. 服务端-客户端工作流程 4. 服务器优化 TCP数据流套接字编程是一种基于有连接协议的网络通信方式 一. TCP API 在TCP编程中,主要使用两个核心类ServerSocket 和 Socket ServerSocket Ser…

从零开始配置 Zabbix 数据库监控:MySQL 实战指南

Zabbix作为一款开源的分布式监控工具,在监控MySQL数据库方面具有显著优势,能够为数据库的稳定运行、性能优化和故障排查提供全面支持。以下是使用Zabbix监控MySQL数据库的配置。 一、安装 Zabbix Agent 和 MySQL 1. 安装 Zabbix Agent services:zabbix…

Java学习手册:RESTful API 设计原则

一、RESTful API 概述 REST(Representational State Transfer)即表述性状态转移,是一种软件架构风格,用于设计网络应用程序。RESTful API 是符合 REST 原则的 Web API,通过使用 HTTP 协议和标准方法(GET、…

读一篇AI论文并理解——通过幻觉诱导优化缓解大型视觉语言模型中的幻觉

目录 论文介绍 标题 作者 Publish Date Time PDF文章下载地址 文章理解分析 📄 中文摘要:《通过幻觉诱导优化缓解大型视觉语言模型中的幻觉》 🧠 论文核心动机 🚀 创新方法:HIO(Hallucination-In…

IOT项目——物联网 GPS

GeoLinker - 物联网 GPS 可视化工具 项目来源制作引导 项目来源 [视频链接] https://youtu.be/vi_cIuxDpcA?sigMaOKv681bAirQF8 想要在任何地方追踪任何东西吗?在本视频中,我们将向您展示如何使用 ESP32 和 Neo-6M GPS 模块构建 GPS 跟踪器——这是一…

Java学习手册:HTTP 协议基础知识

一、HTTP 协议概述 HTTP(HyperText Transfer Protocol)即超文本传输协议,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传输协议。它是一个应用层协议,基于请求-响应模型…

【含文档+PPT+源码】基于微信小程序的健康饮食食谱推荐平台的设计与实现

课程目标: 教你从零开始部署运行项目,学习环境搭建、项目导入及部署,含项目源码、文档、数据库、软件等资料 课程简介: 本课程演示的是一款基于微信小程序的健康饮食食谱推荐平台的设计与实现,主要针对计算机相关专…