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

news2024/9/19 10:52:45

百日筑基第十九天-一头扎进消息队列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.coloradmin.cn/o/1922505.html

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

相关文章

AI网络爬虫023:用deepseek批量提取天工AI的智能体数据

文章目录 一、介绍二、输入内容三、输出内容一、介绍 天工AI的智能体首页: F12查看真实网址和响应数据: 翻页规律: https://work.tiangong.cn/agents_api/square/sq_list_by_category?category_id=7&offset=0 https://work.tiangong.cn/agents_api/square/sq_list_b…

MUR2060CTR-ASEMI无人机专用MUR2060CTR

编辑:ll MUR2060CTR-ASEMI无人机专用MUR2060CTR 型号:MUR2060CTR 品牌:ASEMI 封装:TO-220 批号:最新 最大平均正向电流(IF):20A 最大循环峰值反向电压(VRRM&#…

基于R语言的水文、水环境模型优化技术及快速率定方法与多模型案例

在水利、环境、生态、机械以及航天等领域中,数学模型已经成为一种常用的技术手段。同时,为了提高模型的性能,减小模型误用带来的风险;模型的优化技术也被广泛用于模型的使用过程。模型参数的快速优化技术不但涉及到优化本身而且涉…

Python 的 metaclass

文章目录 先说结论1. metaclass 的作用2. 主要的执行过程 1. metaclass.__new__2. metaclass.__call__关于 metaclass.__init__ 3. metaclass.__prepare__4. 自动创建 __slots__ 属性4.1 metaclass 的接口类4.2 metaclass conflict 5. Class metaprogramming 先说结论 1. meta…

【linux】服务器安装及卸载pycharm社区版教程

【linux】服务器安装及卸载pycharm社区版教程 【创作不易,求点赞关注收藏】 文章目录 【linux】服务器安装及卸载pycharm社区版教程1、到官网下载安装包2、通过终端wget下载安装包3、解压4、安装5、设置环境变量6、运行pycharm7、删除pycharm安装包、卸载pycharm …

Arcgis横向图例设置

想把这个图例改成横向的 点击图例的属性,找到样式

基于SpringBoot的校园疫情防控系统

你好,我是专注于计算机科学与技术的研究者。如果你对我的工作感兴趣或有任何问题,欢迎随时联系我。 开发语言:Java 数据库:MySQL 技术:SpringBoot框架,B/S架构 工具:Eclipse,Mav…

13 协程设计原理与汇编实现

协程的问题 为什么要有协程?协程的原语操作?协程的切换?协程的struct如何定义?协程的scheduler(调度)如何定义?调度策略如何实现?协程如何与posix,api兼容?协程多核模式?协程的性能如何测试?为什么要有协程 同步的编程方式,异步的性能。同步编程时,我们需要等待io就…

什么是STM32?嵌入式和STM32简单介绍

1、嵌入式和STM32 1.1.什么是嵌入式 除了桌面PC之外,所有的控制类设备都是嵌入式 嵌入式系统的定义:“用于控制、监视或者辅助操作机器和设备的装置”。 嵌入式系统是一个控制程序存储在ROM中的嵌入式处理器控制板,是一种专用的计算机系统。…

iPhone删除所有照片的高效三部曲

苹果手机用久了,系统缓存包括自己使用手机留下的内存肯定会越来越多。其中,相册中的照片数量可能会急剧增加,占据大量的存储空间。当用户们想要对相册进行彻底清理,实现iPhone删除所有照片时,不妨跟随以下详细的三部曲…

k8s核心操作_k8s中的存储抽象_基本概念与NFS搭建_Deployment使用NFS进行挂载---分布式云原生部署架构搭建028

然后我们继续开始看 如果我们使用容器部署,比如我们有三个节点,一个是master,一个node1 一个是node2 那么pod 中我们可以看到,容器中的 /data 等各个目录都映射了出来了,但是 如果比如上面红色的部分,有个pod,原来在node2上,最右边那个,但是这个pod宕机了 那么,k8s会在node…

【数据结构】--- 堆的应用

​ 个人主页:星纭-CSDN博客 系列文章专栏 :数据结构 踏上取经路,比抵达灵山更重要!一起努力一起进步! 一.堆排序 在前一个文章的学习中,我们使用数组的物理结构构造出了逻辑结构上的堆。那么堆到底有什么用呢&…

数据结构——考研笔记(一)绪论

目录 数据结构一、绪论1.1 数据结构的基本概念1.1.1 什么是数据?1.1.2 数据元素——描述一个个体1.1.3 什么是数据对象1.1.4 什么是数据机构 1.2 数据结构的三要素1.2.1 逻辑结构1.2.2 数据的运算1.2.3 物理结构1.2.4 数据类型、抽象数据类型1.2.5 知识回顾与重要考…

【C++】开源:paho-mqtt-cpp库配置与使用

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍paho-mqtt-cpp库配置与使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下&#xff…

echarts解决数据差异过大的问题

问题描述 使用echarts折线图和柱状图展示数据时,如果数据差异值较大,会导致显示图形差异过大,图表不美观。 如这一组数据[2000000, 200, 0.1, 20, 0, -10, -3000],渲染出来的效果如下图: 可以看到由于最大值和最小值差…

【经验总结】将markdown文档转换为word(swagger导出word)

工具准备: 任意markdown编辑器,以typora为例pandoc,官方下载地址 思路整理: 从swagger提取离线md文档将md文档转换为word格式 操作步骤: 一、安装pandoc (markdown编辑器安装略) 前往官网…

【学术会议征稿】第三届能源互联网及电力系统国际学术会议(ICEIPS 2024)

第三届能源互联网及电力系统国际学术会议(ICEIPS 2024) 2024 3rd International Conference on Energy Internet and Power Systems 能源互联网是实现新一代电力系统智能互动、开放共享的重要支撑技术之一,也是提升能源调度效率&#xff0…

大模型最新黑书:基于GPT-3、ChatGPT、GPT-4等Transformer架构的自然语言处理 PDF

今天给大家推荐一本丹尼斯罗斯曼(Denis Rothman)编写的关于大语言模型&#xff08;LLM&#xff09;权威教程<<大模型应用解决方案> 基于GPT-3、ChatGPT、GPT-4等Transformer架构的自然语言处理>&#xff01;Google工程总监Antonio Gulli作序&#xff0c;这含金量不…

常见的网络安全设备

一、防火墙 防火墙的核心任务&#xff1a;防护和控制&#xff0c;防火墙通过安全策略识别流量并做出相应的动作。 防火墙的安全策略在进行匹配时&#xff0c;自上而下逐一匹配&#xff0c;匹配成功则不向下进行匹配&#xff0c;末尾隐含拒绝所有规则。 1.包过滤防火墙 工作范围…

ChatGPT Mac App 发布!

2024 年 6 月&#xff0c;OpenAI 的大语言模型 ChatGPT 的 Mac 客户端与 ChatGPT-4o 一起发布了。ChatGPT Mac 户端可以让用户直接在 Mac 电脑上使用 ChatGPT 进行对话。它提供了一个简单易用的用户界面&#xff0c;用户可以在其中输入文本或语音指令&#xff0c;并接收模型生成…