分布式技术导论 — 探索分析从起源到现今的巅峰之旅(消息队列)

news2024/6/29 14:09:31

探索分析从起源到现今的巅峰之旅

  • 分布式队列 - Kafka
    • 架构特性
      • 可扩展性
      • 磁盘优化与顺序访问
      • 大容量存储与历史数据利用
      • 高效数据封装与压缩
      • 智能内存管理与OS缓存利用
    • Kafka发布/订阅模型
    • Kafka架构分析
      • Producer和Consumer接口交互
        • Producer通过Topic发送数据
        • Consumer通过Topic消费数据(消费组)
          • 点对点模式
          • 发布/订阅模式下
    • Kafka设计的局限性
      • 1. 消费组的consumer数量不应少于Partition数量
      • 2. 消费组的consumer的服务器尽量保持配置相近
      • 3. 简单的数据路由无法真正实现对应的消费均衡
      • 4. 无法实现全局的消息的先进先出的顺序实现
    • Kafka的双R机制
      • Kafka的rebalance机制
      • Kafka的replication机制
    • Kafka网络ACK机制
      • 最多一次(at-most once)
      • 至少一次(at-least once)

分布式队列 - Kafka

Kafka作为分布式消息队列领域的杰出代表,已深深嵌入于各式流处理平台的核心,被广大用户广泛认可并采纳为关键性的数据供给渠道。其在多种技术栈中不可或缺的地位,有力地证明了Kafka在应对大规模、持续不断的实时数据流挑战时所展现出的卓越性能与高度适配性。

接下来,让我们深入剖析其服务架构与功能特性,揭示其背后蕴藏的设计精妙与技术实力,以理解其如何缔造如此出色的性能表现。

架构特性

Kafka通过运用其独特的分布式体系结构、精心设计的【磁盘利用机制】、【庞大的存储容量】、【先进的数据打包与压缩技术】,以及对【操作系统级缓存资源】的巧妙的运用,彰显出无与伦比的扩展潜能、存储经济性与数据处理效能。
在这里插入图片描述
经过精心优化的内核设计使得 Kafka 能够以极低的延迟处理大量消息,轻松支撑每秒百万级别的消息投递,满足大数据时代对实时性与处理速度的严苛要求。

可扩展性

Kafka 采用分布式集群部署,支持水平扩展以应对不断增长的数据量与处理需求,同时通过数据分区与副本机制确保数据的高可用性与容灾能力。这种弹性扩展能力使得Kafka能够在保持服务稳定的同时,轻松应对大规模数据流的挑战。
在这里插入图片描述

磁盘优化与顺序访问

Kafka巧妙利用磁盘空间,规避随机访问开销,消息以追加方式写入磁盘,并以分段日志形式存储。
在这里插入图片描述
确保了写入过程主要为顺序操作,极大提升了I/O效率,Kafka将消息持久化存储在磁盘上,不仅允许短暂的消息缓冲,还能作为长期数据存储,便于下游系统进行回溯消费或离线分析。
在这里插入图片描述
此外,Kafka巧妙管理日志段的生命周期,即使消息已被消费者消费,仍可保留一定时间,以供新加入的消费者回溯历史数据,或者用于离线分析与备份。

大容量存储与历史数据利用

通过高效利用磁盘存储资源,Kafka展现出强大的数据承载能力,能够从容应对大规模数据流。其设计允许即使在消息已被消费者处理后,仍可暂时保留在系统中。

  • 回溯消费:加入的消费者能够追溯并处理过去的历史数据,这对于实现无缝对接新消费者或恢复丢失状态至关重要。
  • 批量处理:Kafka允许一次性拉取大量数据,确保了批处理作业的高效执行,减少了网络交互次数,提升了整体处理吞吐。

高效数据封装与压缩

Kafka在数据封装方面采取轻量化策略,消息格式简洁且支持压缩,有效减少了传输和存储时的空间占用。
在这里插入图片描述
通过消除冗余对象包装,直接以接近原始数据的形态进行处理,降低了资源消耗。这种设计不仅加快了数据传输速度,还减少了中间环节的解码开销。

智能内存管理与OS缓存利用

Kafka巧妙利用操作系统级别的页面缓存(Page Cache),避免了应用程序层面额外缓存的引入,从而节省宝贵的内存资源。
在这里插入图片描述
直接操作文件数据,使得Kafka能够与OS缓存机制紧密协作,充分利用硬件缓存的优势,进一步提升数据读写的性能和效率,同时避免了多个组件间对内存资源的竞争。

Kafka发布/订阅模型

Kafka作为一款高度工程化的分布式消息传递系统,其内在价值体现在它精心构筑了一个坚如磐石的基础架构,该架构深度融合了容错性、扩展性和卓越的吞吐性能,旨在为大规模分布式环境中的数据流转提供无可挑剔的安全性与效率保障。
在这里插入图片描述
提供灵活的消息发布与订阅机制,多个生产者可以向同一Topic发送消息,而多个消费者可以根据自己的消费速率独立地订阅并处理这些消息,实现了数据流的解耦与异步处理。

Kafka架构分析

接下来,我们将详尽解析Kafka的基本架构以及Kafka系统的核心组件及其交互方式。

Kafka 在分布式消息传递体系中扮演着至关重要的中介角色,其核心功能体现为一个高度可扩展且高容错性的 broker 系统。作为一个消息代理,Kafka 有效地联结了消息的生产者(producers)与消费者(consumers),在二者之间建立起可靠的通信桥梁。
在这里插入图片描述
实际上,Kafka 构建于一个由多个节点组成的集群(cluster)之上,这种集群架构赋予了系统卓越的吞吐能力、数据冗余以及故障恢复能力。

Producer和Consumer接口交互

Kafka 集成了专属的 producer API 与 consumer API,这两套接口构成了与系统进行交互的标准接入层。无论开发者选择直接利用官方提供的客户端库对接这些 API。基于 API 规范自主研发符合业务需求的访问逻辑,producer 和 consumer 客户端均需遵循这些接口规范以确保与 Kafka broker 的顺畅通讯与数据交换。

Producer通过Topic发送数据

在Kafka中,数据流被组织成一系列被称为topic 的集合,为有效管理和控制单个topic 内的数据规模,topic 可以进一步划分为多个 Partition,并尽可能地分布在不同的节点上以实现负载均衡和水平扩展。为了确定数据写入哪个 Partition,Producer 需要执行一项决策过程。
在这里插入图片描述
在 Kafka 的 Producer API 设计中,提供了允许用户指定 Partition 键的参数机制。当用户指定了 Partition 键后,Producer API 会采用哈希算法对该键值进行计算,从而得出相应的 Partition 编号,以此来实现数据的定向发送和均匀分布。

Consumer通过Topic消费数据(消费组)

Kafka 灵活支持点对点(point-to-point)和发布/订阅(pub/sub)这两种消息队列模式,其关键在于引入了 Consumer Group 的概念。每个 Consumer Group 虽然被视为一个逻辑上的虚拟消费者,但实际上它可以包含多个实际的 consumer 实例。

点对点模式

所有 consumer 被配置为隶属于同一 Consumer Group,确保消息在组内严格有序且仅消费一次。
在这里插入图片描述

发布/订阅模式下

来自不同发布者的订阅者会被划分到不同的 Consumer Group 中,任何给定的 partition 在同一时间只能被所属 consumer group 中的一个 consumer 进行消费。
在这里插入图片描述

注意,每个 Consumer 实例在同一时刻仅与一个 partition 进行绑定,这意味着每个 consumer 只从分配给它的唯一一个 partition 中拉取消息进行处理。这样的设计保证了消息的有序消费及并行处理能力,同时也确保了 Consumer Group 内部的消息均衡分发。

Kafka设计的局限性

在这里插入图片描述

1. 消费组的consumer数量不应少于Partition数量

若 Consumer Group 内的实际 consumer 数量小于 Partition 数量,且没有正确地配置分区分配策略,则可能导致部分 Partition 中的数据无法得到对应 consumer 的消费处理。为了确保 Consumer Group 中的每个 Partition 均能够有 consumer 进行数据消费,Consumer Group 内的 consumer 数量不应少于 Partition 数量,否则将会面临某些 Partition 数据无人处理的现象。

2. 消费组的consumer的服务器尽量保持配置相近

若各consumer 消费数据的速度存在差异,那么 Partition 的消费进度可能会出现不均衡状况。具体表现为,部分 Partition 已经迅速消费至最新产生的数据,而其他Partition则仍停留在较早阶段的数据消费过程中,从而导致整个系统的消费进度不一致。

3. 简单的数据路由无法真正实现对应的消费均衡

  • Producer必须自行选择将数据投递至哪一个 Partition,因此,由于 Partition 的选择权在于 Producer,故由 Producer 端调整数据分布以改善消费不均衡的问题并不现实。
  • Consumer 同时只能与一个 Partition 绑定,通过简单的轮询策略(round-robin)在 Producer 或 Consumer 端均无法有效解决消费进度不均衡的问题。

4. 无法实现全局的消息的先进先出的顺序实现

每个Partition 实质上可视为一个消息子队列,它们各自维护消息顺序。尽管 Partition 机制存在,但 Kafka 并不保证跨 Partition 的全局顺序一致性;相反,它确保的是每个 Partition 内部消息的局部有序性。消息在单一 Partition 内遵循严格的先入先出(FIFO)原则,而不同 Partition 之间的消息顺序则不予保证。

Kafka的双R机制

Kafka的rebalance机制

Consumer group 内部动态调整,例如新增Consumer时,会自动触发重新平衡过程。这一过程旨在重新配置 partition 与 consumer 之间的映射关系,从而有效地均衡各 consumer 的数据负载。

下图是一个借鉴图,基本描述了整个rebalance的流程和过程:
在这里插入图片描述
通过这样的动态调整,原本可能存在的数据消费不均状况得以缓解,提升了整体系统的处理效率与资源利用率。

Kafka的replication机制

Kafka 实现复制的核心在于以Partition为基本单位,采取直接而高效的方式,让复制节点(Replicas)订阅并追踪目标 Partition,利用队列的天然订阅机制来简化复制流程。

每个复制集(Replica Set)内置一个主节点(Leader),专职处理所有读写操作,而其余跟随节点(Followers)作为热备,处于待命状态。

  1. 主节点之外的跟随节点集体构成了ISR(In-Sync Replicas)列表,该列表记录了与主节点数据同步状况良好的副本,确保了高可用性。ISR成员并非固定不变,而是根据同步状况动态调整。

  2. 数据写入流程中,尽管操作首先通过主节点执行,但系统默认要求数据必须被复制到ISR中的所有副本方视为提交成功(committed),之后方可供消费者检索。

这一策略确保了数据的持久性和一致性,即使在主节点故障时,也能从ISR中选举出新的主节点无缝接替,保障服务连续性,无需担忧数据丢失或不一致问题。

Kafka网络ACK机制

分布式系统因网络通信的介入,使得消息传递的可靠性成为一大挑战。网络环境如同其本身性质所示,有时能够容忍数据包丢失,而有时则要求数据包的可靠传输并具备重传及去重机制。

最多一次(at-most once)

Kafka消费者而言,其确认(ack)消息的时机直接关乎消息传递语义的界定。若消费者在接收到消息但尚未进行处理时即刻发送确认,一旦消费者在数据处理前遭遇故障,数据处理便无法确保完成,这种情况下,消息传递体现为“最多一次”(at-most once)语义。

至少一次(at-least once)

若消费者选择在消息接收并处理完毕后再发送确认信号,尽管确保了数据被处理,但在确认发送前的任何故障都将导致消息被重传,进而产生重复处理的情形,这对应着“至少一次”(at-least once)语义。

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

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

相关文章

【Ubuntu】--- 创建用户 删除用户 及其他用户操作大全 持续更新中

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。 【Ubuntu】--- 创建用户 删除用户 及其他…

React常用方法汇总【更新中】

文章目录 前言创建项目启动命令列表渲染useEffect 异步函数使用方法useEffect 异步函数清除方法控制组件显示隐藏axios 安装使用 前言 运行 react 需要先安装 node.js,具体安装步骤可以参考这篇文章 https://blog.csdn.net/weixin_43721000/article/details/134284…

C++ 57 之 静态联编和动态联编

#include <iostream> #include <string> using namespace std;// 动态多态产生条件: // 1.要有继承关系 // 2.父类中有虚函数、子类要重写父类的虚函数 // 3.父类的指针或引用指向子类的对象class Animal{ public:virtual void speak(){ // 虚函数 父类中的vir…

大数据—“西游记“全集文本数据挖掘分析实战教程

项目背景介绍 四大名著&#xff0c;又称四大小说&#xff0c;是汉语文学中经典作品。这四部著作历久不衰&#xff0c;其中的故事、场景&#xff0c;已经深深地影响了国人的思想观念、价值取向。四部著作都有很高的艺术水平&#xff0c;细致的刻画和所蕴含的思想都为历代读者所…

计算机网络实验(9):路由器的基本配置和单臂路由配置

一、 实验名称 路由器的基本配置和单臂路由配置 二、实验目的&#xff1a; &#xff08;1&#xff09;路由器的基本配置&#xff1a; 掌握路由器几种常用配置方法&#xff1b; 掌握采用Console线缆配置路由器的方法&#xff1b; 掌握采用Telnet方式配置路由器的方法&#…

Linux之网络编程

Linux之网络编程 TCP协议 TCP(Transmission ControlProtocol) : 传输控制协议&#xff0c;是一个 面向连接的、可靠的、基于字节流的传输层的协议。TCP 协议建立的是一种点到点的&#xff0c;一对一的可靠连接协议 特点&#xff1a; 数据无丢失数据无失序数据无错误数据无重…

gitblit git pycharm 新建版本库及push备忘

在终端l中输入ssh,如果有消息弹出说明安装成功。 // 在任意路径打开GIT BASH,执行以下命令,期间所有询问可以直接Enter跳过 ssh-keygen -t rsa -C "注册Gitlab的邮箱" “”之内可以任何文字,备注提示作用。 设置用户名和邮箱 已经设置的可以检查一下。 #设置用…

Aiflow中,代码逻辑中明明不该触发的方法但是却触发了。

图中这个红圈的task&#xff0c;是我更新error记录的task&#xff0c;是某些特定的task特定情况会触发的。正常情况走的最下面的箭头的路径。但是现在就是就算只走了下面箭头的路径&#xff0c;红圈那个task依然被触发了。检查了半天才发现&#xff0c;它的TriggerRule设置的是…

Git记录 上传至Gitee

1.GitHub拉去的代码需要上传至自己的Gitee需要清除原有remote服务器信息 查看原始远程服务器信息&#xff0c;后删除远程服务器信息 git remote -v git remote rm origin 2.Gitee新建软件仓库 法1&#xff09;不用初始化仓库&#xff0c;初始化会自动生成.git。如果本地.git…

【Linux Vim的保姆级教程】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

MongoDB和AI 赋能行业应用:零售

欢迎阅读“MongoDB 和 AI 赋能行业应用”系列的第三篇。 本系列重点介绍 AI 应用于不同行业的关键用例&#xff0c;涵盖制造业和汽车行业、金融服务、零售、电信和媒体、保险以及医疗保健行业。 利用生成式 AI 技术&#xff08;Gen AI&#xff09;&#xff0c;零售商可以创造…

内网横向渗透篇

目录 一.什么是内网横向渗透 二.域环境搭建 一.什么是内网横向渗透 内网横向渗透是指攻击者在成功进入企业或组织的内部网络之后&#xff0c;试图扩展其访问权限和影响力&#xff0c;以便获取更多敏感信息或执行更深入的攻击。 拓扑图: 以下是内网横向渗透的简要步骤和策略&…

C++ 68 之 类模版作函数的参数

#include <iostream> // #include <cstring> #include <string> using namespace std;template<class T1, class T2> // 可以设置默认的类型值&#xff0c;后面在使用的时候&#xff0c;就不用再指定类型了 class Students08{ public:T1 m_name;T2 m_a…

mybatis框架相关问题总结(本地笔记搬运)

1、背景 2、运行启动问题 问题一 运行spring boot项目时报错&#xff1a;‘factoryBeanObjectType‘: java.lang.String 解决一 版本问题&#xff0c;springframework版本和mybatis/mybatis-plus版本不兼容。现spring-boot使用3.3.0版本&#xff0c;mybatis-plus使用3.5.7…

0618_QT4

练习&#xff1a; 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和…

骁龙662_高通SM6115主要参数_高通模块方案定制

骁龙662&#xff08;SM6115&#xff09;采用了全新的44 Kryo 260 CPU架构&#xff0c;由四核Cortex-A73(高达2.0 GHz)和四核Cortex-A53(高达1.8 GHz)组成。这种架构的设计使得骁龙662在性能上相较于上一代产品有了显著的提升&#xff0c;为用户提供了更快的运行速度和更流畅的使…

【机器学习300问】123、什么是GRU?GRU网络的基本结构是怎样的?

在之前的文章中&#xff0c;我们谈到了标准RNN所面临的诸多困境&#xff0c;你也可以理解为RNN的缺点。其中最让人苦恼的就是梯度消失问题&#xff0c;正是由于梯度消失问题的存在&#xff0c;导致RNN无法获得上下文的长期依赖信息。那么就没有办法解决了吗&#xff1f;非也&am…

查看服务器端口,如何查看服务器端口是多少并修改

查看服务器端口并修改内容是一个涉及网络管理和系统配置的专业任务。以下是一个详细的步骤说明&#xff0c;用于查看和修改服务器端口。 一、查看服务器端口 1. 使用命令行工具&#xff1a; - 对于Linux或Unix系统&#xff0c;可以使用netstat、lsof或ss等命令来查看端口状…

深度神经网络——什么是降维?

引言 什么是降维&#xff1f; 降维是用于降低数据集维度的过程&#xff0c;采用许多特征并将它们表示为更少的特征。 例如&#xff0c;降维可用于将二十个特征的数据集减少到仅有几个特征。 降维通常用于无监督学习任务 降维是一个用于降低数据集维度的过程&#xff0c;采用许…

JupyterLab使用指南(四):JupyterLab的Magic 命令

1. 什么是 Magic 命令 Magic 命令是 JupyterLab 中的一类特殊命令&#xff0c;用于简化和增强代码的执行。它们以 % 或 %% 开头&#xff0c;可以进行各种操作&#xff0c;如时间测量、环境设置、文件操作等。Magic 命令分为行 Magic 命令和单元 Magic 命令两种。 行 Magic 命…