RocketMQ Broker组件

Apache RocketMQ 是一款分布式消息中间件,具有高性能、低延迟、高可靠等特点。RocketMQ 的核心组件之一是 Broker,它负责消息的存储、过滤、事务处理以及定时/延时消息的管理。在本文中,我们将详细探讨 RocketMQ Broker 的这些关键功能。

消息存储

存储架构

RocketMQ 使用文件系统进行消息存储,主要包括 CommitLog 和 ConsumeQueue 两个部分。

  • CommitLog:这是 RocketMQ 的核心存储文件,所有的消息都会先存储在 CommitLog 中。CommitLog 采用追加写的方式,这样可以极大地提高写入性能。

  • ConsumeQueue:ConsumeQueue 是针对不同 Topic 和不同 Consumer Group 的消费队列。它其实是 CommitLog 的索引文件,记录了消息在 CommitLog 中的物理位置,便于快速定位消息。

存储机制
  1. 消息写入:当 Producer 发送消息到 Broker 时,Broker 会将消息写入到 CommitLog 中。写入操作是顺序进行的,确保了高效的写入性能。

  2. 异步刷盘:为了保证高效,RocketMQ 默认采用异步刷盘的策略。消息先写入内存映射文件,然后由后台线程异步将数据刷到磁盘。用户可以根据需求配置同步刷盘,以提高数据的可靠性。

  3. 消息索引:ConsumeQueue 作为消息的消费索引,当消息写入 CommitLog 后,Broker 会在 ConsumeQueue 中为每条消息创建索引,以加速消息的消费。

消息过滤

RocketMQ 支持多种消息过滤方式,以满足不同场景下的需求。

Broker 端过滤

在 Broker 端进行消息过滤是 RocketMQ 的一大特色。Broker 会根据 Consumer 的订阅表达式(例如 SQL92 表达式)对消息进行过滤。这种方式可以减少 Consumer 接收到无用消息,提高消费效率。

Consumer 端过滤

Consumer 端过滤是最常见的过滤方式。Consumer 接收到消息后,会根据订阅表达式对消息进行过滤处理。这种方式实现简单,但会增加 Consumer 的负担。

Tag 过滤

Tag 过滤是 RocketMQ 提供的另一种过滤方式。Producer 发送消息时可以指定消息的 Tag,Consumer 在订阅消息时也可以指定需要的 Tag,Broker 会根据 Tag 对消息进行简单的过滤。这种方式高效且实现成本低。

事务消息

RocketMQ 支持事务消息,确保了消息的最终一致性。事务消息的处理过程主要包括以下几个阶段:

  1. 准备阶段:Producer 发送半消息(Half Message)到 Broker,消息在这个阶段不会被 Consumer 消费。

  2. 提交事务:Producer 执行本地事务,根据事务执行结果向 Broker 提交事务状态(提交或回滚)。

  3. 事务确认:Broker 根据 Producer 提交的状态,决定将半消息转换为正式消息或删除半消息。如果在一定时间内未收到事务确认,Broker 会主动询问 Producer 事务状态。

定时/延时消息

RocketMQ 支持定时和延时消息,用户可以指定消息的延迟级别(例如 1 秒、5 秒、1 分钟等)。Broker 会根据指定的延迟级别存储消息,并在合适的时间将消息投递给 Consumer。

实现机制

RocketMQ 的延时消息是通过特殊的 Topic 实现的。Broker 会根据消息的延迟级别,将消息存储到对应的延时队列中。当延迟时间到达后,Broker 会将消息重新投递到目标 Topic 中,供 Consumer 消费。

总结

RocketMQ Broker 是 RocketMQ 系统中至关重要的组件,负责消息的存储、过滤、事务处理以及定时/延时消息的管理。其高效的存储架构、灵活的消息过滤机制、可靠的事务消息处理以及方便的定时/延时消息支持,使得 RocketMQ 成为分布式消息系统中的佼佼者。在实际应用中,合理配置和使用这些功能,可以极大地提高系统的性能和可靠性。

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

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

相关文章

在Spring Boot中使用自定义过滤器和MDC实现高级日志记录

在现代Web开发中,日志记录是必不可少的。通过记录日志,开发者可以追踪请求的流程、定位问题并进行性能调优。本文将介绍如何在Spring Boot项目中使用自定义过滤器结合MDC(Mapped Diagnostic Context)技术,实现高级日志…

三子棋小程序

一.自定义头文件(game.h) 放入源文件需要用到的标准库头文件和函数的声明 ROW 和COL为棋盘的行和列&#xff0c;三子棋嘛&#xff0c;肯定为3啦 #pragma once #include<stdio.h> #include<String.h> #include<stdlib.h> #include<time.h> #define ROW…

Redis(三)事务、管道、主从复制

事务 事务是可以执行一个命令&#xff0c;也可以执行多个命令&#xff0c;事务本质上是一组命令的集合。一个事务中的所有命令都会序列化&#xff0c;按顺序地串行化地执行而不会被其他命令插入 Redis事务和传统数据库的区别 单独的隔离操作&#xff1a;Redis的事务仅仅是保证…

Robot Operating System——深度解析监控Parameters修改的底层实现

大纲 AsyncParametersClientParameterEventHandler监控全部Parameters监控Node上Parameters的变动触发 总结 在《Robot Operating System——AsyncParametersClient监控Parameters的增删改行为》和《Robot Operating System——ParameterEventHandler监控Parameters的增删改行为…

《Java初阶数据结构》----10.<Map和Set---TreeSet和TreeMapHashSet和HashMap >

前言&#xff1a; 大家好&#xff0c;我目前在学习java。我准备利用这个暑假&#xff0c;来复习之前学过的内容&#xff0c;并整理好之前写过的博客进行发布。如果博客中有错误或者没有读懂的地方。热烈欢迎大家在评论区进行讨论&#xff01;&#xff01;&#xff01; 喜欢我文…

Linux守护进程daemon与服务service及systemctl命令的作用

在 Linux 系统的服务管理中会经常提到 daemon&#xff08;守护进程&#xff09; 与 service&#xff08;服务&#xff09;&#xff0c;守护进程 daemon 是指后台运行的进程&#xff0c;随系统启动而为应用程序提供支持&#xff0c; 而服务 service 则用于提供某种功能。 简单的…

C/C++大雪纷飞代码

目录 写在前面 C语言简介 EasyX简介 大雪纷飞 运行结果 写在后面 写在前面 本期博主给大家带来了C/C实现的大雪纷飞代码&#xff0c;一起来看看吧&#xff01; 系列推荐 序号目录直达链接1爱心代码https://want595.blog.csdn.net/article/details/1363606842李峋同款跳…

C#实现数据采集系统-Mqtt实现采集数据转发

在数据采集系统中,通过ModbusTcp采集到数据之后,再通过MQTT转发到其他应用 MQTT操作 安装MQTT mqtt介绍和环境安装 使用MQTT 在C#/Net中使用Mqtt MQTT类封装 MQTT配置类 public class MqttConfig{public string Ip {get; set;

每日任务:网络协议对比:HTTPS/HTTP与TCP/UDP

1.HTTPS和HTTP有哪些区别 HTTP 是超文本传输协议&#xff0c;信息是明文传输&#xff0c;存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷&#xff0c;在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议&#xff0c;使得报文能够加密传输。HTTP 连接建立相对简单&#x…

【LeetCode】141.环形链表、142. 环形链表 II(算法 + 图解)

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;数据结构 &#x1f4da;本系列文章为个人学…

网站如何从0-1搭建部署蓝图介绍

第一步&#xff1a;网站规划 确定网站目的&#xff1a;明确网站的目标和预期的受众。内容规划&#xff1a;决定网站将包含哪些内容和功能。技术需求分析&#xff1a;确定所需的技术栈&#xff0c;例如前端和后端技术。 第二步&#xff1a;设计 草图和布局&#xff1a;绘制网…

AI学习记录 - 本地知识库实现的相关知识

在公司内部实现了个知识库&#xff0c;但这里只介绍在实现知识库的过程中用到的知识。 1、分词器 先分词&#xff0c;中文可以使用jieba分词 2、构造数据集 将词汇向量化是自然语言处理中的重要任务&#xff0c;它可以将文本数据转化为计算机能够理解和处理的向量形式。以…

在react中如何计算本地存储体积

1.定义useLocalStorageSize钩子函数 // 计算localStorage大小 function useLocalStorageSize() {const [size, setSize] useState(0);useEffect(() > {const calculateSize () > {let totalSize 0;for (let key in localStorage) {//过滤掉继承自原型链的属性if (loc…

抄作业-跟着《React通关秘籍》捣鼓React-playground-上集

文章目录 前言1. 搭建react 开发环境2、react hooks 知识3. 目标&#xff1a;跟着小册实现 react-playground3.1 整体布局初始化项目使用Alloment 来实现左右分屏的拖拉功能 3.2 代码编辑器Monaco Editor 3.3 实现了多文件的切换用 useContext 来共享数据。优化 tab的样式&…

扫雷游戏小程序

目录 一.文件 1.头文件 2.源文件 二.游戏界面和执行(test.c) 三.函数实现(void game部分,源文件game.c) 1.定义雷二维数组和展示二维数组 2.初始化地雷数组 3.初始化显示的数组 4.显示当前的情况 5.随机放置地雷 6.排雷 ps:深度优先遍历数组 四.结束 一.文件 1.头…

接口测试工具:yapi和postman、Apifox 对比选型

在接口测试工具领域&#xff0c;YApi、Postman和Apifox都是备受推崇的工具&#xff0c;它们各有特点&#xff0c;适用于不同的测试场景和需求。以下是对这三款工具的详细对比选型分析&#xff1a; 一、YApi 1. 概述 YApi是一个可本地部署的、打通前后端及QA的、可视化的接口…

《Single-Stage Extensive Semantic Fusion for multi-modal sarcasm detection》

系列论文研读目录 文章目录 系列论文研读目录文章题目含义ABSTRACTKeywords1. Introduction2. Related work3. Method3.1. Multi-modal projection 多模态投影3.2. Extensive Semantic Fusion Multiway Transformer 可拓语义融合多路Transformer3.3. Multi-objective optimizat…

GO-学习-04-基本数据类型-浮点型

浮点型&#xff1a;float32和float64 %f -3.4e38——3.4e38 package main //import "fmt" //import "math" import ("fmt""unsafe""math" )func main(){//1.定义float类型var a float32 3.12fmt.Printf("值&#xff…

LeetCode 热题 HOT 100 (011/100)【宇宙最简单版】

【图论】No. 0200 岛屿数量 【中等】&#x1f449;力扣对应题目指路 希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&#xf…

DjangoRF-10-过滤-django-filter

1、安装pip install django-filter https://pypi.org/ 搜索django-filter基础用法 2、进行配置 3、进行内容调试。 4、如果碰到没有关联的字段。interfaces和projects没有直接关联字段&#xff0c;但是interface和module有关联&#xff0c;而且module和projects关联&#x…