kafka基础

news2024/12/24 2:06:53

文章目录

  • 1、什么是消息队列?
  • 2、基础架构
  • 3、Kafka为什么快
  • 4、零拷贝
  • 5、Rebalance机制
  • 6、kafka如何避免重复消费
  • 7、避免消息丢失
  • 8、Kafka怎么实现消息的顺序消费
  • 9、什么是ISR
  • 10、Kafka文件存储机制


1、什么是消息队列?

kafka是一个消息队列的中间件,那什么是消息队列?消息队列是应用间异步通信的中间件,它由三部分组成:

  1. 生产者:负责生产消息,将消息发送给broker,是全部消息的发起者。
  2. broker:是消息的服务端,负责消息的存储、投递等功能,是最核心的部分。
  3. 消费者:负责消息的消费,根据消息承载的信息处理对应逻辑。
    它的应用场景有:
  4. 消息的异步处理:比如用户注册发送验证码,服务端只需要把协商好的消息发送至消息队列,不需要等待消费者回应,让消费者在空闲时去消息队列读取消息进行消费即可。
  5. 应用解耦:可以将一些不同源的应用管理起来,应用只需要将消息发送给消息队列,其它应用即可进行消费,无需在意应用是用什么语言开发的、是怎么开发的,某个应用宕机了也不会阻碍阻碍的运行,在其重启时,继续发送或者消费消息队列中消息即可。
  6. 流量削峰:生产者短时间把大量的任务发送至消息队列,消费者根据其消费能力平稳的消费消息。能够防止消息过多导致消费者宕机。

2、基础架构

如图所示,Kafka是一个分布式消息队列,它的核心包括:

  • Broker:kafka集群中的服务器节点,也就是一台服务器。
  • Topic:主题,用于存储同一种消息类型,一个主题的消息分布式的存储在多个服务器上。
  • Partition:分区,将Topic分区的存储在不同的Broker中,能提高处理消息的并发度。
  • 生产者:生产者生产消息,将其负载均衡的放入对应Broker的Topic分区中。
  • 消费者:消费者从Broker中消费消息,同一个分区只能被一个消费者消费。
  • 为了保证高可用,每个Partition数据都有从节点保存数据,主节点挂了,从节点补上。

Kafka集群中的一些状态信息,例如节点的在线信息、主题分区的主从信息会存储在Zookeeper中(2.8版本以前,以后可以选择不用)。

image.png

3、Kafka为什么快

  • 使用了零拷贝技术,减少了数据的拷贝和上下文环境的切换。
  • 使用了多个服务器分区的存储了同一个Topic,提高了吞吐量。
  • 磁盘顺序读写:磁盘中文件的顺序读写能让其速度接近内存的操作。
  • 批量删除和复制数据:数据被消费者消费后,并不会马上删除,而是等达到一定量后统一批量删除。
  • 使用页缓存:避免使用了JVM,不需要GC垃圾回收,节省了垃圾回收的开销。

4、零拷贝

  • 传统拷贝技术:以主机读取数据并将其通过套接字发送给其它服务器为例。流程如下:
    1. 发起读操作请求,CPU收到请求后给DMA发起调度命令,由DMA将磁盘数据写入内存缓冲区(第一次拷贝)取完成后给CPU发送读取完成消息。
    2. CPU再将内存缓冲区数据写入到用户缓冲区(第二次拷贝)。
    3. 将用户态数据写入Socket缓存区(第三次拷贝)。
    4. 完成后,CPU调度DMA,让DMA将Socket缓存区数据写入网卡缓存区(第四次拷贝),发送数据。

DMA技术是在主板上安装了一个DMA芯片,用于IO设备和内核之间的数据传输,以降低CPU的压力。

image.png

  • 零拷贝技术:零拷贝并不是指没有拷贝过程,而是指用户态上没有拷贝过程。它使用了sedfile()函数去实现的。流程如下:
    1. 发起sedfile()请求,首先会在PageCache查找数据,若存在则直接开始滴2步,不存在则使用DMA将数据从磁盘上拷贝至PageCache缓存区。
    2. 读取完成后,DMA给CPU发送信号,CPU将内存地址和页内偏移量传输给Socket。
    3. DMA将PageCache中的缓存数据写入网卡设备中。
    4. DMA发送写完信号给Socket,返回Seedfile()调用结束。

image.png

5、Rebalance机制

Rebalance是kafka中的负载均衡机制。用于控制消费者均衡的消费消息。当有新的消费者加入或退出、订阅的改变、broker宕机等原因,会触发再平衡机制。

6、kafka如何避免重复消费

Kafka在消费分区中的消息时,会维护offset(偏移量)值,去避免重复消费的问题。默认情况下,消息消费完成后,会在下一次消费时,自动提交offset值,去避免重复消费,但是如果在消费者消费的过程中,应用程序挂掉了,可能会导致offset值设置失败,导致消息被重复的消费。此外,kafka有个再平衡(rebalance)机制,如果消费者在默认的5分钟内不能处理完分区中消息时,会触发再平衡机制,导致offset自动提交失败,而新的消费端还是会从没有提交的offset位置开始消费,从而导致重复消费的问题。

  • 解决办法:
    1. 提高消费端消费性能,从而避免触发rebalance机制。
    2. 将rebalance时间拉长一些。
    3. 减少一次性从broker中获取的消息条数。
    4. 把每个消息生成一个hash值,存储在redis中,消费时查询该消息是否已经被消费,该方法使用的是幂等性的思想实现的。

7、避免消息丢失

消息丢失包括:

  • 生产者消息丢失:指生产者发送消息到Kafka的broker中,这期间因为网络问题或者broker故障发送失败,而因为这个过程是异步进行的,生产者并不知道该消息发送失败。所以生产端避免消息丢失的核心是让生产者即时知道该消息发送失败,然后重新发送,具体做法有两种,一种是在发送消息的函数中设置回调函数,当消息发送失败时,通过回调函数及时通知生产者或者直接进行重试;另一种是将异步改为同步。此外kafka的生产者本身也提供了重试参数叫retires,如果消息发送失败会自动重试。
  • 消费者消息丢失:一般不会出现,除非消费者消费失败了,但提交了offset,这样将会导致消息丢失。可以通过重新设置offset去恢复数据。
  • Kafka内部消息丢失:ack=0时,生产者会不等待broker的响应,就认为消息发送成功了,这样可能会导致消息丢失。ack=1时,broker中的leder会不管follow是否同步完成,就返回给生产者成功的响应,若这时leader挂了,可能会导致消息丢失。ack=-1,broker中的leder会等待ISR中的follow全部同步完成,再返回响应给生产者,这样将不会出现消息丢失。

8、Kafka怎么实现消息的顺序消费

在Kafka中,生产者生产的同一个Topic的消息,会根据key值分布式的存储在不同的服务器的分区中,消费者消费时,同一个Topic不同分区的消息可能被多个消费者消费,而使得消息的消费顺序和生产者生产的顺序不一致。解决办法是:

  • 自定义路由算法,将消息放入同一个服务器的同一个分区中,让一个消费者去消费该分区的消息,以实现顺序消费。

9、什么是ISR

Kafka为了保证高可能,对于分区的数据存储采用了主从机制,其中主分区leader负责事务的处理,从分区follow负责同步主分区数据状态,当leader挂了后,从follow列表中挑选与主分区最一致作为新的leader。ISR主要就是为了解决怎么挑选新的leader而设计的,在ISR中记录了和leader保持一定程度同步的follow,从中就可以挑选最接近的follow作为新的leader。

AR:记录了分区中的所有副本,包括某个Partition所有的主分区,从分区。
OSR: 记录了滞后leader过多的follow,当其跟上leader的脚步和其保持同步了,将会移至ISR中。

10、Kafka文件存储机制

Kafka中的每个分区的数据将会被分为多个segement进行存储。每个segement文件中包含.index、.log、.timeindex文件,其中:

  • .index:存储了每条数据对应在.log文件中的切片。例如偏移量为28的数据,对应的存储在.log文件的第[29,102]个字节。
  • .log文件:真正存储数据的文件。
  • .timeindex文件:记录了时间戳和对应的偏移量。用于根据时间戳快速的查找消息。

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

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

相关文章

ProGuard混淆及R8优化

前言:使用java编写的源代码编译后生成了对于的class文件,市面上很多软件都可以对class文件进行反编译,况且Android开发的应用程序是用Java代码写的,为了很好的保护Java源代码,我们需要对编译好后的class文件进行混淆。…

切底掌握Android中的Kotlin DSL

前言 在这篇文章中,我们将学习如何在您的 Android 项目中编写 Kotlin DSL。 这个文章会很长,所以花点时间,让我们一起来写你的 DSL。我们将讨论以下主题, 什么是简单英语中的 DSL?您使用任何 DSL 吗?为什…

微服务的文件配置

1 基于本地文件配置的痛点 ①修改本地配置文件 需要重启服务 ②viper能监听本地配置文件变动 修改内存中变量的值 貌似可以满足需求 痛点如果实例过多 手动改极有可能出错 很多服务都依赖一个配置 运维可以写脚本批量修改 出问题运维不想背锅 ③ 多语言开发的实例 使用…

ThreadX在mdk(AC5)中的移植

1.ThreadX简介 Threadx是由 Express Logic 公司开发的一款实时操作系统(RTOS),2019年被微软收购,成为了微软的一款Azure RTOS。在2020年,ThreadX也加入了开源大军,将ThreadX内核及其各大组件开源免费。 Th…

电赛汇总(一):微控制器以其外围电路模块设计

电赛汇总(一):微控制器以其外围电路模块设计 这一章节主要详细记录各种常用的微控制器的引脚功能、外围的电路模块等,以便随时查看翻阅。这部分内容出自黄智伟等学者著的《全国大学生电子设计竞赛教程–常用电路模块制作》一书中,感兴趣的朋…

PS2022版本修复打开闪退问题

前言 windows 11 系统最近换了一台电脑,重新装了一批摄影剪辑软件,在使用过程中发现 PS2022 版本一但导入图片就卡死闪退。起初我以为是版本不兼容问题,但是问了一下对应的朋友他们并未出现这种情况。后面我就从百度中开始捞答案&#xff0c…

适用于平坦草原的近地层以上风廓线推算方法

目录 引言1 数据观测和处理1.1 观测实验和仪器1.2 数据处理 引言 本文研究平坦草原近地层之上的风廓线特征,尤其是不同稳定度情况下风随高度的变化;得到适用于本地的粗糙度、边界层高度和地转风的估测方法。 在上述研究的基础上,本文用上述…

如何快速的阅读一本书

B站:【读书方法】读不进?记不住?5分钟教你如何快速高效读书 | 读书会犯的5大错误! 1 看着书皮,思考一下自己为什么读这本书,是为了解决什么问题。 2 要看目录,根据目录看一下这本书能不能解决…

0002Java程序设计-SSM协同过滤算法的新闻推荐系统

摘 要 “互联网”的战略实施后,很多行业的信息化水平都有了很大的提升。但是目前很多行业的管理仍是通过人工管理的方式进行,需要在各个岗位投入大量的人力进行很多重复性工作,使得对人力物力造成诸多浪费,工作效率不高等情况&am…

FPGA时序约束--实战篇(读懂Vivado时序报告)

目录 一、新建工程 二、时序报告分析 1、打开时序报告界面 2、时序报告界面介绍 3、时序路径分析 三、总结 FPGA开发过程中,vivado和quartus等开发软件都会提供时序报告,以方便开发者判断自己的工程时序是否满足时序要求。 本文将详细介绍如何读懂…

VLAN基础知识3_VLAN间三层通信(VLANIF接口)

目录 1.VLAN间三层通信简介 2.VLAN间三层通信方式 3.VLANIF接口介绍 4.基于VLANIF接口VLAN间三层通信原理 5.VLAN间三层通信实验 5.1 常用配置命令 5.2 配置步骤 5.3 实验效果 1.VLAN间三层通信简介 VLAN间三层通信是指在VLAN网络中,不同VLAN之间进行IP通信…

python也可以使用克里金插值算法吗?

挪威大陆架的声学压缩慢度测量的空间变化 在处理地质和岩石物理数据时,我们通常希望了解这些数据在我们的地区是如何变化的。我们可以做到这一点的方法之一是对我们的实际测量值进行网格化,并推断这些值。 进行这种外推的一种特殊方法是克里金法&#xf…

三阶魔方有多少种状态

魔方有 3 种不同的方块,分别为角块(8 个,每个角块有三种颜色),棱块(12 个,每个棱块有两种颜色)与中心块(6 个,每个中心块有一种颜色)。 魔方总共…

每天学一点知识有用吗

在探索如何学习的路上,我注意到了基于微习惯的学习方式,比如每天在用十分钟的时间练习下普通话,或者每天写500字的总结。 我简单回顾一下: 这种方法虽然颇受欢迎,但是它限制了你可以尝试的活动种类,有时候…

深度学习(24)——YOLO系列(4)

深度学习(24)——YOLO系列(4) 文章目录 深度学习(24)——YOLO系列(4)1. dataset准备(1)数据详解(2)dataset(3)…

广告数仓:全流程调度

系列文章目录 广告数仓:采集通道创建 广告数仓:数仓搭建 广告数仓:数仓搭建(二) 广告数仓:全流程调度 文章目录 系列文章目录前言一、ClickHouse安装1.修改环境2.安装依赖3.单机安装4.修改配置文件5.启动clickhouse6.创建需要的数…

012-从零搭建微服务-接口文档(二)

写在最前 如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址(后端):https://gitee.com/csps/mingyue 源码地址(前端):https://gitee.com/csps…

统一拦截--过滤器Filter

1.过滤器Filter 1. 概述 概念: Filter过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一。过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。过滤器一般完成一些通用的操作,比如:登录校验、统一编码处理、敏感字符处理等…

Tcp协议的十大特性详解+示例

前言 之前我们简单了解了一下Tcp是什么及它的套接字如何使用:基于UDP和TCP套接字实现简单的回显客户端服务器程序_Crystal_bit的博客-CSDN博客 因为要给大家介绍Tcp的十大特性,所以这里给出Tcp报头结构: 目录 1. 确认应答 2. 超时重传 3. 连接管理 3…

【Android复习笔记】Parcelable 为什么速度优于 Serializable ?

Q:Parcelable 为什么速度优于 Serializable ? 首先,抛开应用场景谈技术方案都是在耍流氓,所以如果你遇到有面试官问这样的题目本身就是在给面试者挖坑。 序列化 将实例的状态转换为可以存储或传输的形式的过程。 Serializable 实现方式: Serializable 是属于 Java 自带的…