【中间件】kafka

news2024/12/24 2:46:41

目录

  • 一、概述
  • 二、生产者
    • 1. 发送原理
    • 2. 生产者分区 Partition
      • 分区好处
      • 分区策略
    • 3. 生产者如何提高吞吐量
    • 4. 数据可靠性
      • ACK应答级别
      • 数据不丢失:ACK + ISR
      • 数据不重复:幂等性
      • 数据有序
  • 三、broker
    • 1. 工作流程
    • 2. 副本相关
    • 3. 底层存储
    • 4. 高效读写数据
  • 四、消费者
    • 1. 工作流程
    • 2. 分区分配和重平衡
    • 3. offset 位移

一、概述

  1. 定义:是一个分布式的基于发布/订阅模式的消息队列(MessageQueue),主要应用于大数据实时处理领域

  2. 三大功能

    • 削峰: 高峰期的消息可以积压到消息队列中,随后平滑地处理完成,避免突发访问压力压垮系统
    • 解耦: 消息队列避免模块之间的相互调用,降低各个模块的耦合性,提高系统的可扩展性
    • 异步: 发送方把消息放在消息队列中,接收方无需立即处理,可以等待合适的时间处理
  3. 基础架构:

在这里插入图片描述

组件作用
Producer消息生产者,就是向 Kafka broker 发消息的客户端
Consumer消息消费者,向 Kafka broker 取消息的客户端
Consumer Group(CG)消费者组,由多个 consumer 组成。组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费;消费者组之间互不影响。消费者组是逻辑上的一个订阅者
Broker一台 Kafka 服务器就是一个 broker。一个集群由多个 broker 组成。一个broker 可以容纳多个 topic
Topic消息主题(逻辑概念) ,生产者和消费者面向的都是一个 topic
Partition一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列
Replica副本。每个分区都有若干个副本,一个 Leader 和若干个Follower
Leader一组副本中的“主”,只有主和生产者消费者交互
Follower一组副本中的“从”,实时从 Leader 中同步数据,保持和Leader 数据的同步
SegmentPartition 物理上被分成多个 Segment,每个 Segment 1个G
Zookeeper保存元信息,现已废除

二、生产者

1. 发送原理

在这里插入图片描述

涉及到了两个线程——main 线程和 Sender 线程

  • 在 main 线程中创建了一个双端队列 RecordAccumulator。main 线程将消息发送给消息队列
  • 当消息队列内的消息达到一定大小,或者达到时间限制,会通知sender线程
  • Sender 线程不断从消息队列中拉取消息发送到 Kafka Broker
    • 可以选择是异步还是同步(同步就是sender等待收到broker的ack后,再去发送新消息)

2. 生产者分区 Partition

分区好处

  1. 便于合理使用存储资源,可以把海量的数据按照分区切割成一块一块数据存储在多台Broker上。合理控制分区的任务,可以实现负载均衡的效果
  2. 提高并行度,生产者可以以分区为单位发送数据;消费者可以以分区为单位进行消费数据

分区策略

在这里插入图片描述

生产者生产消息的时候:

  1. 指明partition的情况下,直接将指明的值作为partition值;例如partition=0,所有数据写入分区0

  2. 没有指明partition值但有key的情况下,将key的hash值与topic的partition数进行取余得到partition值

    例如:key1的hash值=5, key2的hash值=6 ,topic的partition数=2,那么key1 对应的value1写入1号分区,key2对应的value2写入0号分区

  3. 既没有partition值又没有key值的情况下,Kafka采用Sticky Partition(黏性分区器),会随机选择一个分区,并尽可能一直使用该分区,待该分区的batch已满或者已完成,Kafka再随机一个分区进行使用(和上一次的分区不同)。

    例如:第一次随机选择0号分区,等0号分区当前批次满了(默认16k)或者linger.ms设置的时间到, Kafka再随机一个分区进行使用(如果还是0会继续随机)

  4. 自定义分区:定义类实现 Partitioner 接口,重写 partition()方法,方法返回分区号

3. 生产者如何提高吞吐量

  • 提高main线程创建的消息队列大小:缓存大一点
  • 提高batchsize大小:多等一些数据再传
  • 调整等待时间:双刃剑,太短一次传的消息太少,太长有延迟
  • 对传输数据做压缩:能传更多的消息

4. 数据可靠性

ACK应答级别

0:生产者发送过来的数据,不需要等数据落盘应答
1:生产者发送过来的数据,Leader收到数据后应答
-1:生产者发送过来的数据,Leader和ISR队列里面的所有节点收齐数据后应答

单纯用0或1都会导致丢数,而单纯用-1会导致多数重复

数据不丢失:ACK + ISR

ACK = -1 + 副本 >= 2 + ISR最小副本数量 >= 2

数据不重复:幂等性

  1. 数据语义

    • 最多一次:ACK = 0
    • 至少一次:ACK = -1 + 副本 >= 2 + ISR最小副本数量 >= 2
    • 精确一次:幂等性 + 至少一次
  2. 重复数据的判断标准:具有 <PID, Partition, SeqNumber> 相同主键的消息提交时,Broker只会持久化一条

    • PID是Kafka每次重启都会分配一个新的Producer ID
    • Partition 表示分区号
    • Sequence Number是单调自增的

    所以幂等性只能保证的是在单分区单会话内不重复

    全局不重复需要开启事务

数据有序

  • 生产者有序发送消息
    • 一个一个消息的发:一个 Topic 下的同一个 Partition 一定是有序的
    • 不是一个一个发:需要开启幂等性且一次发不能超过5个,这样如果乱序到达的话,broker会自己排序
  • 消费者有序消费
    • 一个分区只让一个消费者来消费,即能保证

三、broker

1. 工作流程

  1. 生产者将消息发送给分区 Leader
  2. Leader 将消息写入本地文件
  3. 对应的 Follower 从 Leader 拉取消息并写入本地文件
  4. Follower 向 Leader 发送 ACK
  5. Leader向生产者回复
  • leader的维护由保存在paitition内的Controller来做,Controller也是分布式的,他会监听brokers节点的变化,在节点挂掉的时候辅助选举新leader,选举规则:在ids列表内按顺序选择

2. 副本相关

  1. 定义:每个partition都有多份,叫副本,来提高可靠性

    • 副本分为Leader和Follower,只有Leader和生产者和消费者交互
    • 副本AR = ISR + OSR
  2. Leader 和 Follower 故障处理

    • Follower故障:被踢出ISR,恢复后再加入ISR
    • Leader故障:从ISR中选出一个新的Leader,恢复后去除旧数据,和新Leader进行同步(只能保证副本之间的数据一致性,并不能保证数据不丢失或者不重复)
  3. 副本分区分配

    尽可能的把Leader散开,否则会对某一个broker产生很大的压力

3. 底层存储

partition下进一步将数据分为Segment,每个1G

  • Segment分为

    • log:存具体数据,以追加的方式
    • index:索引,稀疏索引,4KB记一条索引
    • 时间戳:过期删除用的
      在这里插入图片描述
  • 删除方法

    • 删除:直接删除
    • 压缩:相同key只保留最新的

4. 高效读写数据

  • Kafka 本身是分布式集群,可以采用分区技术,并行度高
  • 读数据采用稀疏索引,可以快速定位要消费的数据
  • 顺序写磁盘
  • 页缓存 + 零拷贝技术
    • 页缓存PageCache:重度依赖底层操作系统提供的PageCache功能,写的时候直接交给页缓存,读的时候先读页缓存,没有再读磁盘
    • 零拷贝:消息从磁盘里读出来之后不走应用层代码,直接走网卡,不占用CPU
      在这里插入图片描述

四、消费者

1. 工作流程

在这里插入图片描述

  • 消费者可以分组,一个分区只能由组内的一个消费者消费,消费者组是逻辑上的一个订阅者
  • 用offset标识消费的位置,由消费者提交,保存在主题内,由coordinator管理,这也是个分布式

在这里插入图片描述
主要就是从broker里拉取数据

2. 分区分配和重平衡

分区分配问题:一个consumer group中有多个consumer组成,一个 topic有多个partition组成,问题是,到底由哪个consumer来消费哪个partition的数据

  • 分区分配策略

    • Range:对每个 topic 而言, partitions数/consumer数来决定,会产生数据倾斜
    • RoundRobin:针对集群中所有Topic而言,所有的 partition轮询分配
    • Sticky:尽量均匀地分配分区,根据上次的分配结果尽量减少变动

3. offset 位移

  1. 位移保存方式:存在__consumer_offsets里,采用 key 和 value 的方式存储数据。key 是 group.id+topic+分区号,value 就是当前 offset 的值

  2. 位移的提交方式

    • 自动提交(可能造成重复消费)

      重复消费:已经消费了数据,但是 offset 没提交
      比如每隔5s,下一轮过了2s挂了,会重复消费这2s的内容

    • 手动提交(可能造成漏消费)

      漏消费:先提交 offset 后消费,有可能会造成数据的漏消费
      比如消费者取了,还在内存里,刚提交还没来得及落盘就挂了,没落盘的就漏消费了

    不管是重复消费还是漏消费,都是提交和落盘的间隙出现宕机的情况,可以开启事务,把这两个动作原子绑定

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

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

相关文章

常见误区,你可曾踩过?深度剖析WEB自动化测试实施问题与解决方案

目录 摘要&#xff1a; 一、WEB自动化测试实施的步骤 1.测试计划 2.测试用例设计 3.环境搭建 4.脚本编写 5.执行测试 6.缺陷管理 二、WEB自动化测试常见误区 1.选择不合适的自动化测试工具和框架 2.忽略测试环境的影响 3.. 缺乏对页面元素的理解 三、示例代码 结论…

学顶教育:一级消防师资格证发放问题分享

1、为什么证书不申请没加注就可以下载&#xff1f; 2021年12月17日前由相关行业协会、学会或有关部门指定的机构出具的电子证书&#xff0c;目前无需申请加注&#xff0c;可直接查看、下载。 2、如何查询“证书查询验证范围”&#xff1f; 进入中国人事考试网首页&#xff0…

体验 Google Bard

环境 windows 10 64bitGoogle Bardpython 3.8 简介 本篇介绍一个开源的 Google 聊天机器人Bard 的 API 逆向工程&#xff0c;使用它&#xff0c;可以免费的使用 Bard 服务&#xff0c;项目地址&#xff1a;https://github.com/acheong08/Bard 安装及使用 通过 pip 来安装 pip &…

内网渗透的一些tips

声明&#xff1a;文中涉及到的技术和工具&#xff0c;仅供学习使用&#xff0c;禁止从事任何非法活动&#xff0c;如因此造成的直接或间接损失&#xff0c;均由使用者自行承担责任。 每周不定时持续分享各种干货。 众亦信安&#xff0c;中意你啊&#xff01; 一.密码抓取 平…

CVPR 2023 | 一键去除视频闪烁,该研究提出了一个通用框架

该论文成功提出了第一个无需额外指导或了解闪烁的通用去闪烁方法&#xff0c;可以消除各种闪烁伪影。 高质量的视频通常在时间上具有一致性&#xff0c;但由于各种原因&#xff0c;许多视频会出现闪烁。例如&#xff0c;由于一些老相机硬件质量较差&#xff0c;不能将每帧的曝光…

字符函数和字符串函数(二)

目录 1.strncpy 2.strncat 3.strncmp 4.strstr 5.strchr 6.strtok 7.strerror 1.strncpy ok,在上一篇博客的讲解中&#xff0c;我们谈到了strcpy这个函数&#xff0c;并且了解到了这个函数的功能是将源字符串的内容复制到目标字符串里&#xff0c;并且我们还知道了在C语…

字符函数和字符串函数(三)

1.字符分类函数 在我们的日常代码生活中&#xff0c;经常会遇到一类问题&#xff0c;比如说判断一个字母的大小写&#xff0c;或者标点符号等。因此&#xff0c;我们需要用到一些字符分类函数 函数 如果他的参数符合下列条件就返回真 iscntrl 任何控制字符 isspace 空白字符&…

使用GPT4做Leetcode第 102 场双周赛

虽然一次周赛的几个题目说明不了太多问题&#xff0c;比如这个周赛的Hard题目就是板子题&#xff0c;算不上Hard&#xff0c;也许把第三题和第四题的顺序换一下比较合适。但是&#xff0c;GPT4的表现已经严重超出了我的预期。对于这次周赛的四个题目&#xff0c;GPT4的表现如下…

说走就走的接口自动化测试脚本:快速提高测试效率的秘密武器

目录 摘要&#xff1a; 环境准备 编写测试用例 运行测试脚本 总结 摘要&#xff1a; 作为一名测试工程师&#xff0c;我们常常需要进行接口测试&#xff0c;目的是验证接口是否符合规范并且稳定可靠。然而&#xff0c;手动测试难免会出现疏漏和人为错误&#xff0c;因此…

K_A35_003 基于STM32等单片机采集矩阵按键模块值 串口与OLED0.96双显示

K_A35_003 基于STM32等单片机采集矩阵按键模块值 串口与OLED0.96双显示 所有资源导航一、资源说明二、基本参数引脚说明 三、驱动说明模块工作原理:对应程序: 四、部分代码说明1、接线引脚定义1.1、STC89C52RC矩阵按键模块1.2、STM32F103C8T6矩阵按键模块 五、基础知识学习与相…

把一个长方形平均分为4份,我想了几十种方法,不服来挑战

这是学习笔记的第 2455篇文章 这个事情的源头是在前几天哄孩子睡觉前&#xff0c;我和她聊分数的事情&#xff0c;一般为了便于理解我会拿披萨来举例&#xff0c;比如把一个披萨分成2份&#xff0c;分成3份&#xff0c;分成4份等&#xff0c;似乎顺着圆心我们可以想到既定的方案…

2023/4/25总结

刷题&#xff1a; 第一周任务 - Virtual Judge (vjudge.net) 1.这一题的思路就是先排除前面和后面相等的&#xff0c;然后找到不等的情况&#xff0c;不等情况的下标开始前后都走&#xff0c;看看是不是和b数组构成了一个升序数组即可。 #include<stdio.h> #define Ma…

50+常用工具函数之xijs更新日志(v1.2.4)

xijs 是一款开箱即用的 js 业务工具库, 聚集于解决业务中遇到的常用函数逻辑问题, 帮助开发者更高效的开展业务开发. 接下来就和大家一起分享一下v1.2.4 版本的更新内容以及后续的更新方向. 1. dom分类添加xss函数 该模块主要由 Kevin 贡献, 具体介绍如下: 使用方式: import { …

游戏有延迟?如何获得一个好的Ping

在多人游戏世界中,玩家要想获得良好的游戏体验,需要做很多事情——尤其是如果这种良好的体验取决于你的想法。 在线多人游戏,如FPS(第一人称射击游戏)、赛车和一些MMORPG类型的游戏,尤其取决于玩家对游戏反馈的及时有效反应。这个反馈和反应链有很多环节,其中一个环节是…

【Python】matplotlib画散点图,并根据目标列的类别来设置颜色区间(含源代码及参数解释)

最近在进行绘图时&#xff0c;遇到了matplotlib画散点图&#xff0c;并根据目标列的类别来设置颜色区间的问题&#xff0c;但是实现的过程较为艰辛。 文章目录 一、数据准备二、第一次尝试&#xff08;失败及其原因&#xff09;2.1 失败2.2 原因 三、第二次尝试&#xff08;成功…

详解客户关系管理系统

一、客户关系管理系统的重要性 客户关系管理系统&#xff0c;是指利用软件、硬件和网络技术&#xff0c;为企业建立一个客户信息收集、管理、分析和利用的信息系统。以客户数据的管理为核心&#xff0c;记录企业在市场营销和销售过程中和客户发生的各种交互行为&#xff0c;以…

Multisim电路仿真与实验:包含连续时间系统的模拟、周期信号频谱分析、组合逻辑电路:竞争冒险、数字锁

Multisim电路仿真与实验&#xff1a;包含连续时间系统的模拟、周期信号频谱分析、组合逻辑电路&#xff1a;竞争冒险、数字锁 文章目录 Multisim电路仿真与实验&#xff1a;包含连续时间系统的模拟、周期信号频谱分析、组合逻辑电路&#xff1a;竞争冒险、数字锁连续时间系统的…

JVM内存区域划分,类的加载过程 以及 双亲委派模型总结

目录 JVM内存区域划分 Java类的加载过程 双亲委派模型 JVM内存区域划分 JVM中的内存区域共划分为五大部分&#xff0c;分别为虚拟机栈、堆、程序计数器、本地方法栈和方法区&#xff0c;如下边这张图所示&#xff1a; 其中&#xff0c;每个内存区域主要存放的数据及功能如下…

Visual Studio C# WinForm开发入门(4):概述

目录 一.Winform入门1.WinForm项目结构2.窗口设计与控件布局3.窗口事件4.时间显示器小练习 二.WinForm布局开发1.手动布局解决自适应问题2.WinForm布局属性3.WinForm布局器 三.WinForm常用控件1.界面展示2.实体类 Student(封装信息)3.逻辑事件代码Form.cs 四.图片框与项目资源1…

大数据电商数仓相关脚本

文章目录 前言一、群起集群1. sc 脚本2. cluster 脚本3. myhadoop 脚本4. zk.sh 脚本5. kf.sh 脚本6. f1.sh 脚本7. f2.sh 脚本 二、简便使用脚本1. xsync 脚本2. jpsall 脚本3. xcall.sh 脚本4. lg.sh 脚本 三、数据传输相关脚本1. mysql_to_hdfs.sh 脚本2. hdfs_to_ods_db.sh…