Kafka 设计原理

news2024/9/23 21:28:07

文章目录

    • 1、Kafka 使用场景
    • 2、Kafka 架构
      • 2.1、工作流程
      • 2.2、副本机制
      • 2.3、生产者
        • 2.3.1、生产方式
        • 2.3.2、分区策略
          • Round-robin
          • Randomness
          • Key-ordering
      • 2.4、消费者
        • 2.4.1、消息队列模型
        • 2.4.2、消费方式
        • 2.4.3、分区策略
          • Range
          • RoundRobin
      • 2.5、消息可靠性

1、Kafka 使用场景

Kafka 是采用 Scala 语言开发的一个多分区、多副本且基于 ZooKeeper 协调的分布式消息系统。其定位是一个分布式流式处理平台,它以高吞吐、可持久化、可水平扩展、支持流数据处理等多种特性而被广泛使用。

kafka 本质是一个消息队列(MessageQueue,MQ)。消息队列就是存放消息的队列,用于不同服务、进程、线程间的通信。

消息队列使用场景 *

  • 异步处理:消息放入队列但不立即处理,快速返回,减少等待,实现并发处理
  • 流量控制(削峰):隔离网关和后端服务,消息队列能够顶住访问压力,后端不会崩溃。
  • 系统解耦:独立的扩展和修改队列两边的处理过程
  • 缓冲:解决生产和消费消息的处理速度不一致的问题
  • 高可用:数据持久化到磁盘,同时提供备份(冗余存储)

kafka 主要的功能有

  • 消息系统:与传统的消息中间件一样,具备异步通信、流量削峰、系统解耦、冗余存储、缓冲、扩展性、可恢复性等功能。此外,Kafka 还提供了其他消息系统难以实现的消息顺序性和回溯消费的功能
  • 存储系统:由于消息持久化功能(持久化到磁盘)和多副本机制,kafka 可以作为长期的数据存储系统来使用
  • 流失处理平台:为每个流行的流式处理框架提供可靠的数据来源和完整的流式处理类库。

2、Kafka 架构

一个典型的 Kafka 体系架构包括

  • Producer:生产者,发送消息到消息队列,push(队列 -> 消费者)
  • Consumer:消费者,从消息队列接收消息,pull(队列 <- 消费者)
  • Broker:服务代理节点。
  • ZooKeeper 集群:管理 Kafka 集群。

在这里插入图片描述

2.1、工作流程

在这里插入图片描述

**主题 topic:**逻辑概念,可以理解为队列。Kafka 中消息以主题分类,每条消息都要指定一个主题,生产者将消息发送到特定的主题(每条消息都要指定一个主题),而消费者负责订阅主题并进行消费。

**分区 partition:**物理概念,可以理解为日志。主题可以分为多个分区,同一主题在不同分区包含的消息不同。每个分区在存储层面可以看作一个可追加的日志文件,生产者生产的消息追加到分区日志文件的时候会分配一个特定的偏移量 offfset。offset 是消息在分区中的唯一标识,Kafka 通过 offset 保证消息在分区的顺序性。注意:Kafka只能保证分区消息的有序性,而不能保证主题消息的有序性

Kafka 的消息组织方式实际上是三级结构:主题 - 分区 - 消息。主题下的每条消息只会保存在某一个分区中,而不会在多个分区中被保存多份。

分区的作用主要提供负载均衡的能力,能够实现系统的高伸缩性(水平扩展)。不同的分区能够被放置到不同节点的机器上,而数据的读写操作也都是针对分区这个粒度而进行的,这样每个节点的机器都能独立地执行各自分区的读写请求处理。这样,当性能不足的时候可以通过添加新的节点机器来增加整体系统的吞吐量。

2.2、副本机制

副本 Replica:是指分布式系统对数据和服务提供的一种冗余方式。副本包括数据副本和服务副本。

  • 数据副本:在不同的节点上持久化同一份数据,当某一个节点上存储的数据丢失时,可以从副本上读取改数据,这是解决分布式系统数据丢失最有效的手段
  • 服务副本:多个节点提供同样的服务,每个节点都有能力接受来自外部的请求并进行响应的处理

使用副本的好处是:

  • 提供数据冗余。高可用。节点宕机,系统仍能正常工作。
  • 提供高伸缩性。扩展节点数量,支撑跟高的读请求量。如 fastdfs、mongodb。
  • 改善数据局部性。将数据放入与用户地理位置相近的地方,降低系统延时。

目前 Kafka 的多副本机制只实现了第一点,通过增加副本数量来提升数据容灾能力,实现故障自动转移。

在这里插入图片描述

副本是相对于分区而言的,副本是特定分区的副本。

Kafka 采取的是基于领导者 leader-based 的副本机制 ,副本分成两类领导 leader 副本和追随者 follower 副本。每个分区在创建时选举一个 leader 副本,其余的副本为 follower 副本。副本之间是一主多从的关系,其中 leader 副本负责处理读写请求,follower 副本只负责与 leader 副本的消息同步,不对外提供服务。

各个副本处于不同的 broker 中,当 leader 副本出现故障,Kafka 依托于 ZooKeeper 提供的监控功能实时感知到,从 follower 副本中重新选举新的 leader 对外提供服务。Kafka 通过多副本机制实现了故障的自动转移,当 Kafka 集群中某个 broker 失效仍能保证服务可用。同时,消费者采用 pull 模式从服务端拉取消息,并且保存消费的具体位置 offset,消费者宕机恢复上线时可以根据之前保存的消费者位置重新拉取需要的消息进行消费,这样就不会造成消息丢失。

分区中的所有副本统称为 AR (Assigned Replicas)。所有与 leader 副本保持一定程度同步的副本(包括 leader 副本)组成 ISR(In-Sync Replicas),ISR 集合是 AR 集合中的一个子集合。消息首先发送到 leader 副本,然后 follower 副本才能从 leader 副本中拉取消息进行同步,同步期间内 follower 副本相对于 leader 副本而言会有一定程度的滞后(可以通过参数配置)。leader 副本负责维护跟踪 ISR 集合中所有 follower 副本的滞后状态。

2.3、生产者

2.3.1、生产方式

在这里插入图片描述

2.3.2、分区策略

分区策略:决定生产者将消息发送到某个分区的算法。

Round-robin

轮询策略,即顺序分配,默认策略,总能保证消息最大限度平均分配到所有分区上。

在这里插入图片描述

Randomness

随机策略,随意地将消息放置到任意一个分区上。

在这里插入图片描述

Key-ordering

Kafka 允许为每条消息定义消息键,简称 key。key 可以是一个有明确业务含义的字符串,也可以用来表征消息源数据。一旦消息被定义了 key,就可以保证同一个 key 的所有消息都进入到相同的分区里面,由于每个分区下的消息处理都是有顺序的,所以被称为按消息键保序策略。

2.4、消费者

2.4.1、消息队列模型

  • 点对点消息模型:1;1,消息一旦被消费,就会从队列中删除,而且只能被下游的一个消费者消费。例如:传统的消息队列。伸缩性差。

  • 发布订阅消息模型:1:n,允许同一消息被多个消费者重复消费。每个订阅者必须订阅主题的全部分区。伸缩性差,不灵活。

Kafka 采用消费者组机制,组内的消费者共用一个 group id,对订阅主题的所有分区进行消费,逻辑上消费者组等于订阅者。一个分区只能由组内一个消费者消费,消费者不一定要订阅主题的所有分区。消费者组间彼此独立,能够订阅相同的一组主题。当消息发布主题后,只会被投递给订阅它的每个消费组中的一个消费者。

Kafka 的消费者组机制,同时实现了传统消息系统的两大模型:如果所有实例属于同一个组,那么它实现的就是消息队列模型。如果所有实例分别属于不同的组,那它实现的就是发布订阅模型。

2.4.2、消费方式

Consumer 采用 pull 模式从 Broker 中读取数据,这样可以根据消费者的消费能力匹配消费信息的速率。但是因为消费者从 Broker 主动拉取数据,需要维护一个长轮询,这也造成若 Kafka 没有数据时,消费者可能会陷入循环中,一直返回空数据的情况发生。针对这一点,Kafka 消费者在消费数据是会传入 timeout 参数,当没有数据可供消费时,消费者等待 timeout 后再返回。

2.4.3、分区策略

消费者组订阅主体的分区 partition 交由组内哪个消费者 consumer 消费。

Range

按照主题划分,分区数量 / 组内消费者线程数量,决定每个消费者消费的分区数。

如图所示:topic A | topic B 有 3 个分区,消费者组有 2 个消费者,可能存在分区不均匀的问题。

在这里插入图片描述

RoundRobin

将所有分区作为整体进行 hash 排序,解决多消费者分配不均的问题,可能造成消费混乱。

在这里插入图片描述

2.5、消息可靠性

  • 持久化,保存到本地磁盘
  • 高可用,提供冗余服务,副本(冗余数据)
  • 一致性,ACK

为保证生产者发送的数据能可靠地发送到指定的主题,主题的每个分区收到生产者发送的数据后,都需要向生产者发送 ACK。当生产者收到 ACK,就会进行下一轮的发送,否则重发数据。确保有 follower 与 leader 同步完成,leader 再发送 ACK。

在这里插入图片描述

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

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

相关文章

图书馆座位预约管理系统毕业设计,图书馆座位管理系统设计与实现,图书馆座位预约系统毕业论文毕设作品参考

项目背景和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于web网页的教室图书馆座位预约系统&#xff0c;整个网站项目使用了B/S架构&#xff0c;基于python的Django框架下开发&#xff1b;管理员通过后台录入信息、管理信息&#xff0c;设置网站信息&#xff0c…

CUDA入门和网络加速学习(一)

0. 简介 最近作者希望系统性的去学习一下CUDA加速的相关知识&#xff0c;正好看到深蓝学院有这一门课程。所以这里作者以此课程来作为主线来进行记录分享&#xff0c;方便能给CUDA网络加速学习的萌新们去提供一定的帮助。 1. GPU与CPU区别 处理器指标一般主要分为两大类&…

异构体之间通信

一、WIFI通信 1、网络配置 IP地址 网络地址 主机地址 假设IP地址是192.168.100.1&#xff0c;这个地址中包含了很多含义。如下所示&#xff1a; 网络地址(相当于街道地址)&#xff1a;192.168.100.0 主机地址(相当于各户的门号)&#xff1a;0.0.0.1 IP地址(相当于住户地址…

【Java进阶篇】第七章 多线程

文章目录一、多线程概述1、进程与线程2、进程与线程的关系二、多线程并发的实现1、线程的实现方式一2、线程的实现方式二三、线程的生命周期1、线程的五个生命周期2、常用方法3、线程的sleep4、终止线程的睡眠状态5、强行终止线程的执行6、合理终止一个线程的执行四、线程的调度…

apache html调用bash脚本案例

首先安装apache服务,采用yum的方式即可&#xff0c;因为用到的都是apache的基本功能&#xff0c;不需要编译安装 yum -y install httpd 然后准备html页面&#xff0c;这个页面其实就是调用bash脚本的页面&#xff0c;提供页面操作然后调用服务器上的脚步文件 网页布局建议用…

【嵌入式UI框架:LVGL】使用恩智浦GUI设计工具,像Qt一样开发MCU界面

LVGL是一个免费的开源嵌入式图形库&#xff0c;它提供创建嵌入式GUI所需的功能&#xff0c;具有易于使用的图形元素、精美的视觉效果和低内存占用。完整的图形框架包括供您在创建GUI时所用的各种小部件&#xff0c;并支持更高级的功能&#xff0c;例如动画和抗锯齿。 一、工具&…

springcloud入门

微服务架构介绍 微服务架构&#xff0c; 简单的说就是将单体应用进一步拆分&#xff0c;拆分成更小的服务&#xff0c;每个服务都是一个可以独 立运行的项目。 微服务架构的常见问题 一旦采用微服务系统架构&#xff0c;就势必会遇到这样几个问题&#xff1a; 这么多小服务…

MYSQL——毫秒值和日期类型数据的转换,DATE_SUB的用法

MYSQL——毫秒值和日期类型数据的转换&#xff0c;DATE_SUB的用法一、毫秒值转换成日期数据类型二、日期数据类型转换成毫秒值三、DATE_SUB的用法一、毫秒值转换成日期数据类型 语法&#xff1a;FROM_UNIXTIME(毫秒值字段,‘%Y-%m-%d %h:%i:%s’) 举例&#xff1a; select id…

spring-boot-starter-aop及其使用场景说明

如今&#xff0c;AOP&#xff08;Aspect Oriented Programming&#xff09;已经不是什么崭新的概念了&#xff0c;在经历了代码生成、动态代理、字节码增强甚至静态编译等不同时代的洗礼之后&#xff0c;Java 平台上的 AOP 方案基本上已经以 SpringAOP 结合 AspectJ 的方式稳固…

基于独立分量分析进行模态分解(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

[附源码]计算机毕业设计基于Springboot在线教育系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Mysql详细安装步骤

目录 1、解压服务端Mysql安装包 2.复制改变my.ini文件 3、安装MySQL服务 4、启动mysql服务 6.记录初始密码&#xff0c;利用初始密码登录 &7.改变MySQL链接密码 1、解压服务端Mysql安装包 解压之后的目录就是以上这样的。 2.复制改变my.ini文件 把my.ini文件添加…

【计算机图形学入门】笔记3:变换Transformation(二维与三维)

第三章.Transformation变换&#xff08;二维与三维&#xff09;1.为什么要学习变换&#xff1f;2.变换的几种形式1.缩放2.相对于y轴翻转3.Shear Matrix 切片4.旋转3.齐次坐标1.平移变换2.齐次坐标的引入3.使用齐次坐标表示上述变换4.组合变换5.分解变换6.三维空间中的变换1.三维…

QT 系统学习 day03 了解各种控件,文件操作,消息框,windows应用界面的 生成菜单栏, 状态栏,中心部件,工具栏,

1. 控件&#xff0c; 旋钮 &#xff0c;进度条&#xff0c; 我也不知道叫啥&#xff0c; 相关的代码&#xff1b; 首先是函数 1.旋钮函数 &#xff08;槽函数都有说明&#xff09;&#xff08;Dial&#xff09; ui->dial->setRange(0,100);//设置旋钮的范围ui->di…

Three.js一学就会系列:01 第一个3D网站

文章目录前言一、Three.js是什么&#xff1f;官网官网示例效果尝鲜二、使用步骤1.引入three.js库2.使用方法创建一个场景创建一个透视摄像机将渲染器添加到页面上创建一个立方体渲染场景立方体动起来效果总结前言 最近开始入坑前端3D建站&#xff0c;跟大家一起慢慢深入three.…

Android 面试拒收Offer篇,这样做对吗?

作者&#xff1a;如梦 如梦朦胧 朋友们的劝说下&#xff0c;有了换工作的躁动,然后投了某度的Android岗位,本以为像我这种非211、985没工作经验的渣渣只能被直接pass,结果却意外的收到了电话,真是受宠若惊.经过电面,技术三面,然后就是等通知到最后拿到了OFFER,如梦一般,真是挺…

性能优化:Redis使用优化(1)

参考资料&#xff1a; 《Redis为什么变慢了&#xff1f;一文讲透如何排查Redis性能问题 | 万字长文》 相关文章&#xff1a; 《Redis&#xff1a;内存淘汰机制》 《Redis&#xff1a;持久化RDB与AOF》 《Redis&#xff1a;主从复制》 写在开头&#xff1a;本文为学习后的总…

Spring中事务失效的场景

文章目录1 抛出检查异常导致事务不能正确回滚1.1 异常演示1.2 解决办法2 业务方法内自己 try-catch 异常导致事务不能正常回滚1.1 异常演示1.2 解决办法3 aop切面顺序导致事务不能正确回滚3.1 异常演示3.2 解决办法4 非 public 方法导致事务的失效4.1 异常演示4.2 解决办法5 父…

深度学习-全卷积神经网络(FCN)

1. 简介 全卷积神经网络&#xff08;Fully Convolutional Networks&#xff0c;FCN&#xff09;是Jonathan Long等人于2015年在Fully Convolutional Networks for Semantic Segmentation一文中提出的用于图像语义分割的一种框架&#xff0c;是深度学习用于语义分割领域的开山之…

【目标检测】【DDPM】DiffusionDet:用于检测的概率扩散模型

文章目录摘要一、Introduction二、相关工作三、方法1.准备工作2.架构3、训练4.预测过程四. 实验1.训练策略2.main property3.消融实验五、代码分析1.测试 demo.py2.训练 train-net.py总结摘要 我们提出了扩散det&#xff0c;一个新的框架&#xff0c;将目标检测作为一个从噪声…