百日筑基第十九天-一头扎进消息队列2

百日筑基第十九天-一头扎进消息队列2

在这里插入图片描述

消息队列的通讯协议

目前业界的通信协议可以分为公有协议和私有协议两种。公有协议指公开的受到认可的具有规 范的协议,比如 JMS、HTTP、STOMP 等。私有协议是指根据自身的功能和需求设计的协 议,一般不具备通用性,比如 Kafka、RocketMQ、Puslar 的协议都是私有协议。

大多数消息队列为了自身的功能支持、迭代速度、灵活性考虑,在核心通信协议的选择上 不会选择公有协议,都会选择自定义私有协议

从技术上来看,私有协议设计一般需要包含三个步骤。

  1. 网络通信协议选型,指计算机七层网络模型中的协议选择。比如传输层的 TCP/UDP、应用 层的 HTTP/WebSocket 等。 从功能需求出发,为了保证性能和可靠性,几乎所有主流消息队列在核心生产、消费链路的协 议选择上,都是基于可靠性高、长连接的 TCP 协议。
  2. 应用通信协议设计,指如何约定客户端和服务端之间的通信规则。比如如何识别请求内容、 如何确定请求字段信息等。 从应用通信协议构成的角度,协议一般会包含**协议头(数据源信息)和协议体(业务数据)**两部分。
  3. 编解码(序列化 / 反序列化)实现,用于将二进制的消息内容解析为程序可识别的数据格式(或反过来用于传输)。

消息队列的网络模块

网络模块:对消息队列来说,网络模块是核心组件之一,网络模块的性能很大程度上决定了消息传输的能力和整体性能。

消息队列是需要满足高吞吐、高可靠、低延时,并支持多语言访问的基础软件,网络模块最需要解决的是性能、稳定性、开发成本三个问题。

从技术上来看,高性能网络模块的设计可以分为如何高效管理大量的 TCP 连接如何快速处理高并发的请求如何提高稳定性和降低开发成本等三个方面。

  1. 高效处理大量 TCP 连接:在消息队列中主要有**单条 TCP 连接的复用(RabbitMQ)IO多路复用(Kakfa、RocketMQ、Pulsar )**两种技术思路。
  2. 快速处理高并发的请求:Reactor 模型是一种处理并发服务请求的事件设计模式,当主流程收到请求后,通过多路分离处理的方式,把请求分发给相应的请求处理器处理。
  3. 提高稳定性和降低开发成本:在消息队列的网络编程模型中,为了提高稳定性或者降低成本,选择现成的、成熟的 NIO 框架是一个更好的方案(kafka如是)。

消息队列的存储模块

存储模块作为消息队列高吞吐、低延时、高可靠特性的基础保证,可以说是最核心的模块。

消息队列中的数据一般分为元数据消息数据。元数据是指 Topic、Group、User、ACL、Config 等集群维度的资源数据信息,消息数据指客户端写入的用户的业务数据。

  1. 元数据信息的存储:元数据信息的特点是数据量比较小,不会经常读写,但是需要保证数据的强一致和高可靠,不允许出现数据的丢失。基于第三方组件来实现元数据的存储是目前业界的主流选择。比如 Kafka ZooKeeper 版本、 Pulsar、RocketMQ 用的就是这个思路,其中 Kakfa 和 Pulsar 的元数据存储在 ZooKeeper 中,RocketMQ 存储在 NameServer 中。另一种思路,集群内部实现元数据的存储是指在集群内部完成元数据的存储和分发。也就是在 集群内部实现类似第三方组件一样的元数据服务,比如基于 Raft 协议实现内部的元数据存储 模块或依赖一些内置的数据库。目前 Kafka 去 ZooKeeper 的版本、RabbitMQ 的 Mnesia、 Kafka 的 C++ 版本 RedPanda 用的就是这个思路。

  2. 数据消息的存储:第一个思路,每个分区对应一个文件的形式去存储数据(kafka如是)。因为消息队列在大部分情况下的读写是有序的,所以这种机制在读写性能上的表现是最高的。第二种思路,每个节点上所有分区的数据都存储在同一个文件中,这种方案需要为每个分区维护一个对应的索引文件,索引文件里会记录每条消息在 File 里面的位置信息,以便快速定位到具体的消息内容。(目前 RocketMQ、RabbitMQ 和 Pulsar 的底层存储 BookKeeper 用的就是这个方案)

数据分段的规则一般是根据大小来进行的,比如默认 1G 一个文件,同时会支持配置项调整分段数据的大小。

从技术上来看,当数据段到达了规定的大小后,就会新创建一个新文件来保存数据。

如果进行了分段,消息数据可能分布在不同的文件中。所以我们在读取数据的时候,就需要先 定位消息数据在哪个文件中。为了满足这个需求,技术上一般有根据偏移量定位或根据索引定位两种思路。

  1. 根据偏移量(Offset)来定位消息在哪个分段文件中,是指通过记录每个数据段文件的起始偏 移量、中止偏移量、消息的偏移量信息,来快速定位消息在哪个文件。
  2. 如果用索引定位,会直接存储消息对应的文件信息,而不是通过偏移量来定位到具体文件。(RabbitMQ 和 RocketMQ 如是)

消息数据存储格式一般包含消息写入文件的格式和消息内容的格式两个方面。

  1. 消息写入文件的格式指消息是以什么格式写入到文件中的,比如 JSON 字符串或二进制。从 性能和空间冗余的角度来看,消息队列中的数据基本都是以二进制的格式写入到文件的。
  2. 消息内容的格式是指写入到文件中的数据都包含哪些信息。对于一个成熟的消息队列来说,消 息内容格式不仅关系功能维度的扩展,还牵涉性能维度的优化。(如Kafka 的消息内容包含了业务会感知到的消息的 Header、Key、Value,还包含了时间戳、偏移量、协议版本、数据长度和大小、校验码等基础信息,最后还包含了压缩、事 务、幂等 Kafka 业务相关的信息)

消息队列中的数据最终都会删除,时间周期短的话几小时、甚至几分钟,正常情况一天、三 天、七天,长的话可能一个月,基本很少有场景需要在消息队列中存储一年的数据

消息队列的数据过期机制一般有手动删除和自动删除两种形式。从实现上看主要有三种思路: 消费完成执行 ACK 删除、数据根据时间和保留大小删除、 ACK 机制和过期机制相结合。

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

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

相关文章

数学建模·熵权法

熵权法 一种计算评价指标之间权重的方法。熵权法是一种客观的方法,没有主观性,比较可靠。 具体定义 熵权法的核心在于计算信息熵,信息熵反映了一个信息的紊乱程度,体现了信息的可靠性 具体步骤 Step1正向化处理 将所以评价指标转…

智能家居装修怎么布线?智能家居网络与开关插座布置

打造全屋智能家居。计划的智能家居方案以米家系列为主,智能家居联网方案以无线为主。装修前为了装备智能家居做了很多准备工作,本文深圳侨杰智能分享一个智能家居装修和布线方面的心得与实战知识。希望能对大家的装修有所帮助。 ​1.关于网络 如果房子比…

HTML基本标签(二)

HTML基本标签&#xff08;二&#xff09; 表格标签 table媒体元素audio 音频vido 视频 form 表单元素 表格标签 table <!-- caption 代表表格标题相关属性border 边框cellpadding 设置单元格内填充cellspacing 设置单元格间空隙width 设置表格宽度&#xff0c;默认是内容撑…

结合实体类型信息1——基于本体的知识图谱补全深度学习方法

1 引言 1.1 问题 目前KGC和KGE提案的两个主要缺点是:(1)它们没有利用本体信息;(二)对训练时未见的事实和新鲜事物不能预测的。 1.2 解决方案 一种新的知识图嵌入初始化方法。 1.3 结合的信息 知识库中的实体向量表示&#xff0b;编码后的本体信息——>增强 KGC 2基…

基于AT89C51单片机超声波水位液位控制系统设计(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于AT89C51单片机的1616点阵LED显示器字符滚动显示设计的详情介绍&#xff0c;如果对您有帮助的话&#xff0c;还请关注一下哦&#xff0c;如果有资源方面的需要可以联系我。 目录 设计任务与要求 原理图 仿真图 代码 系统论文 资源下载 设计任务与要求…

IDEA的JAVA版本没有8怎么办

问题&#xff1a; 很多小伙伴会出现如下的情况&#xff0c;java的版本很高&#xff0c;没有8 解决 更换IDEA内置的Server URL的镜像地址 就是这个 把其中的地址换成 https://start.aliyun.com/ https://start.aliyun.com/ 我们可以看到JAVA 8就出现了

Python-PLAXIS自动化建模技术与典型岩土工程案例

有限单元法在岩土工程问题中应用非常广泛&#xff0c;很多软件都采用有限单元解法。在使用各大软件进行数值模拟建模的过程中&#xff0c;岩土工程中的各种问题&#xff08;塑性、渗流、固结、动力、稳定安全、热力TM&#xff09;&#xff0c;一步一步地搭建自己的Plaxis模型&a…

dm-verity hashtree的结构

参考了&#xff1a;实现 dm-verity | Android Open Source Project (google.cn)。基于这个添加了一层原始数据&#xff0c;便于理解。 结构图如下&#xff1a; 对hashtree结构图的解释&#xff1a; dev data&#xff1a;表示我们的分区数据。这里我们将dev data按照指定的大…

【C++进阶学习】第六弹——set和map——体会用C++来构建二叉搜索树

set和map基础&#xff1a;【C进阶学习】第五弹——二叉搜索树——二叉树进阶及set和map的铺垫-CSDN博客 前言&#xff1a; 在上篇的学习中&#xff0c;我们已经学习了如何使用C语言来实现二叉搜索树&#xff0c;在C中&#xff0c;我们是有现成的封装好的类模板来实现二叉搜索树…

Python 爬虫:使用打码平台来识别各种验证码:

本课程使用的是 超级鹰 打码平台&#xff0c; 没有账户的请自行注册&#xff01; 超级鹰验证码识别-专业的验证码云端识别服务,让验证码识别更快速、更准确、更强大 使用打码平台来攻破验证码难题&#xff0c; 是很简单容易的&#xff0c; 但是要钱&#xff01; 案例代码及测…

React18+Redux+antd 项目实战 JS

React18Reduxantd 项目实战 js Ant Design插件官网 Axios官网 (可配置请求拦截器和响应拦截器) JavaScript官网 Echarts官网 一、项目前期准备 1.创建新项目 hotel-manager npx create-react-app hotel-manager2.安装依赖 //安装路由 npm i react-router-domnpm i aixos /…

CentOS搭建邮件服务器:DNS配置方法技巧?

CentOS搭建邮件服务器的流程&#xff1f;如何高效使用CentOS&#xff1f; 在当今数字化时代&#xff0c;邮件服务器的需求日益增加。为了确保邮件能够顺利送达&#xff0c;正确的DNS配置是必不可少的一环。AokSend将详细介绍在CentOS搭建邮件服务器过程中&#xff0c;如何进行…

SpringBoot新手快速入门系列教程7:基于Redis的一个简单存取数据的例子

我的教程都是亲自测试可行才发布的&#xff0c;如果有任何问题欢迎留言或者来群里我每天都会解答。 新手可能有这样的疑问&#xff0c;有了数据库的存取方式&#xff0c;我们为什么还要使用Redis这种缓存数据库读取方式呢&#xff1f; 原因主要有以下几点&#xff1a; 1. 性能…

亚马逊中小型店铺如何开店?

对于想要在亚马逊平台上开设店铺的中小型卖家来说&#xff0c;这是一个非常值得关注的话题。作为亚马逊上的一个重要参与者&#xff0c;中小型店铺有着广阔的发展空间和无限的可能性&#xff0c;但也由于成本预算与规模限制&#xff0c;无法与大型店铺的策略相提并论&#xff0…

字符串模板被噶了,JDK 23 删除了预览功能“字符串模板”

之前出了一个视频&#xff0c;介绍 JDK 23 中的新特性。之后我才发现&#xff0c;在 JDK 21 和 22 中的预览功能“字符串模板&#xff08;String Templates&#xff09;”&#xff0c;在 JDK 23 中已经没有了。字符串模板的相关代码&#xff0c;已经被全部删除了。 字符串模板的…

Unity免费领场景多人实时协作地编2人版局域网和LAN联机类似谷歌文档协同合作搭建场景同步资产设置编辑付费版支持10人甚至更多20240709

大家有没有用过谷歌文档、石墨文档、飞书文档等等之类的协同工具呢&#xff1f; Blender也有类似多人联机建模的插件&#xff0c; Unity也有类似的多人合作搭建场景的插件啦。 刚找到一款免费插件&#xff0c;可以支持2人局域网和LAN联机地编。 付费的版本支持组建更大的团队。…

详解如何通过稀疏向量优化信息检索

在信息检索方法的发展历程中&#xff0c;我们见证了从传统的统计关键词匹配到如 BERT 这样的深度学习模型的转变。虽然传统方法提供了坚实的基础&#xff0c;但往往难以精准捕捉文本的语义关系。如 BERT 这样的稠密检索方法通过利用高维向量捕获文本的上下文语义&#xff0c;为…

烟雾识别技术在火灾预防中的应用:思通数科大模型的力量

引言 火灾是导致生命财产损失的重大灾害之一。早期检测和快速响应是预防火灾和减少损失的关键。结合思通数科大模型的烟雾识别技术&#xff0c;为实时检测和精确定位烟雾来源提供了一种高效的解决方案。本文将探讨这一技术如何有效预防火灾并保障人员安全。 烟雾识别技术概述 …

注册自定义总线

1、在/sys/bus下注册一个自定义总线 #include<linux/module.h> #include<linux/init.h> #include<linux/kernel.h> #include<linux/kobject.h> #include<linux/slab.h> #include<linux/sysfs.h> #include<linux/device.h> #include…

0601STM32TIM

TOC 分为四部分&#xff0c;八小节 一部分&#xff1a;主要讲定时器基本定时的功能&#xff0c;也就是定一个事件&#xff0c;让定时器每隔这个时间产生一个中断&#xff0c;来实现每隔一个固定时间来执行一段程序的目的&#xff0c;比如做一个时钟、秒表&#xff0c;或者使用一…