【RocketMQ问题总结-2】

RocketMQ 消息持久化

在这里插入图片描述

Broker通过底层的Netty服务器获取到一条消息后,会把这条消息的内容写入到一个CommitLog文件里去(一个Broker进程就只有一个CommitLog文件,也就是说这个Broker上所有Topic的消息都会写入这个文件)。
同时,Broker还会异步地把消息写入到ConsumeQueue文件里去,每一个MessageQueue都对应了一个ConsumeQueue文件。
最后,Broker还会异步地把消息写入一个IndexFile文件里,该文件中保存着消息的key以及消息在CommitLog中的offset偏移量(会自动关联并建立索引),这样后续如果要查询消息,只需要根据消息key从IndexFile中索引出偏移量,就可以立刻在CommitLog文件中找到消息了。
RocketMQ正式通过磁盘文件顺序写+OS PageCache写入+OS异步刷盘的策略来保证消息写入的性能。
在上述这种异步刷盘的模式下,Producer将消息发送给Broker,Broker将消息写入OS PageCache中,就会直接返回ACK给生产者,生产者收到ACK消息就认为写入成功了。
有异步刷盘就有同步刷盘,同步刷盘主要的不同点就是,只有Broker强制把这条消息刷入底层的磁盘文件后,才会返回ACK给生产者。
在异步刷盘的模式下,如果Broker将消息写入PageCahe并响应给生产者后突然宕机,此时消息在缓存中没有写入底层的磁盘文件,就会造成消息丢失——生产者认为发送成功,实际上消息写入失败。

MQ中的零拷贝应用

在这里插入图片描述
用户应用进程调用read函数,向操作系统发起IO调用,上下文从用户态转为内核态(切换1)
DMA控制器把数据从磁盘中,读取到内核缓冲区。
CPU把内核缓冲区数据,拷贝到用户应用缓冲区,上下文从内核态转为用户态(切换2),read函数返回
用户应用进程通过write函数,发起IO调用,上下文从用户态转为内核态(切换3)
CPU将应用缓冲区中的数据,拷贝到socket缓冲区
DMA控制器把数据从socket缓冲区,拷贝到网卡设备,上下文从内核态切换回用户态(切换4),write函数返回

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

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

相关文章

贪心算法----最大数

今日题目:leetcode179------点击跳转题目 分析: 要把这些数组组成最大的数,首先我们把数字转化为字符串,根据自定义的排序规则把这些字符串字数排列,再用一个字符串接受这些字符串数字拼接成最大的字符串数字 排序规则…

Gradient发布支持100万token的Lllama3,上下文长度从8K扩展到1048K

前言 近日Gradient公司在Crusoe Energy公司的算力支持下,开发了一款基于Llama-3的大型语言模型。这款新模型在原Llama-3 8B的基础上,将上下文长度从8000 token大幅扩展到超过104万token。 这一创新性突破,展现了当前SOTA大语言模型在长上下…

while 习题

while 结构 习题 1.计算1到100所有整数和 2.提示用户输入一个小于100的整数,并计算从1到该数之间所有整数的和 3.求从1到100所有整数的偶数和、奇数和 echo -e \n 可以实现换行 4.用户输入密码,脚本判断密码是否正确,正确密码为123456&am…

章十二、数据库(1) —— 概述、MySQL数据库、SQL、DDL、DML、DQL、多表设计

为什么学习数据库: ● 实现数据持久化到本地; ● 使用完整的管理系统统一管理,可以实现结构化查询,方便管理; 一、 数据库概述 ● 数据库 数据库(DataBase)为了方便数据的 存储 和 管理 &…

01、vue+openlayers6实现自定义测量功能(提供源码)

首先先封装一些openlayers的工具函数,如下所示: import VectorSource from ol/source/Vector; import VectorLayer from ol/layer/Vector; import Style from ol/style/Style; import Fill from ol/style/Fill; import Stroke from ol/style/Stroke; im…

【Linux】项目自动化构建工具make/makefile

🎉博主首页: 有趣的中国人 🎉专栏首页: Linux 🎉其它专栏: C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好,本片文章将会讲解Linux中项目自动化构建工具make/makefile的相关内容。 如果看到最后…

单链表经典oj题(2)

前言 这次将要把剩下的oj题将以图解和自己的理解把它讲解完,希望对大家有所帮助,这次的讲解也是干货 第一题 21. 合并两个有序链表 - 力扣(LeetCode) ok这次就简单点,大家自己去看题目了 将两个升序链表合并为一个…

Ubuntu18.04--虚拟机配置Samba并从Windows登录

前言: 本文记录我自己在Windows上安装 Virtualbox ,并在Virtualbox中安装 Ubuntu-18.04 虚拟机,在Ubuntu-18.04虚拟机里安装配置Smaba服务器,从 Windows 宿主系统上访问虚拟机共享samba目录的配置命令。 引用: N/A 正文 虚拟…

​​​【收录 Hello 算法】5.1 栈

目录 5.1 栈 5.1.1 栈的常用操作 5.1.2 栈的实现 1. 基于链表的实现 2. 基于数组的实现 5.1.3 两种实现对比 5.1.4 栈的典型应用 5.1 栈 栈(stack)是一种遵循先入后出逻辑的线性数据结构。 我们可以将栈类比为桌面上的一摞盘子…

Linux diff命令(比较两个文件或目录的内容差异)

文章目录 Linux diff 命令详解教程基本用法比较文件输出解释 递归比较(-r)示例代码 控制输出格式统一格式(-u)上下文格式(-c) 高级选项忽略所有空白差异(-w)仅报告文件是否不同 Linu…

SVN 合并到 Git 时有文件大于 100 M 被限制 Push

如果有文件大小大于 100M,GitHub 是会被限制推送到仓库中的,大概率情况会显示下面的错误: remote: Resolving deltas: 100% (3601/3601), done. remote: error: Trace: aea1f450da6f2ef7bfce457c715d0fbb9b0f6d428fdca80233aff34b601ff59b re…

RobbitMQ基本消息队列的消息发送过程

RabbitMQ: One broker to queue them all | RabbitMQ RabbitMQ官网 SpringAmqp的官方地址:Spring AMQP 代码示例:对着代码看应该能看明白 publisher:消息发送者的代码示例 package cn.itcast.mq.helloworld;import com.rabbitmq.client.Channel; import com.rabb…