Kafka知识体系

一、认识Kafka

1. kafka适用场景

消息系统:kafka不仅具备传统的系统解耦、流量削峰、缓冲、异步通信、可扩展性、可恢复性等功能,还有其他消息系统难以实现的消息顺序消费及消息回溯功能。

存储系统:kafka把消息持久化到磁盘上,以及多副本机制,极大的降低的数据丢失风险,可以把kafka当做长期的数据存储系统使用。

流式处理平台:kafka为主流的流式处理框架提供了完整的处理类库

2. kafka架构

producer、consumer、broker、zookeeper

其中broker可看做kafka服务节点/实例,一个服务器可以部署一个或多个broker,多个broker组成Kafka集群。

zookeeper集群负责管理broker集群元数据、控制器的选举等。

3.主题与分区

消息按主题(Topic)进行分类,一个主题可以有多个分区(partition),一个分区就是一个可追加的Log文件,每个消息都分配一个特定的offset。

但offset不跨分区,所以只能保证单个分区内消息的有序性。

一个主题的分区,可以在不同的broker上,这样就能实现水平扩展。

每个分区又有多副本机制,一主多从,这样就具备了一定的容灾能力。但一般主从数据有一定滞后性,所以理论上是有一定数据丢失风险。

可以设置参数控制主从副本的数据滞后范围,replica.lag.time.max.ms。该参数并不能保证从副本一定会在指定时间内赶上主副本,若是从副本未在设定时间内赶上主副本,则会被认定为“不同步”,提出ISR集合,不能参与选举(也可以设置参数OSR的也可以参与选举)。

4. 分区副本同步机制ISR、OSR、HW、LEO

Kafka分区leader节点选举一般是在ISR(in-sync replicas)集合中选择节点,该集合是在主从数据同步滞后范围内的节点,也就是滞后没那么多的节点。OSR则是滞后太多或失效的节点。

Kafka一个分区的所有副本,同步最少数据的分区的offset,就是HW(heigh watermark)高水位线。就是水桶原理,最低位置处就是这个水桶的最高的水位线。HW之前的消息才能被消费者可见。在消息同步复制机制下,HW之前的消息,才会被认为是消息发送成功,也就是所有副本都持久化到了该消息。异步消息复制机制下,leader副本持久化了该消息即返回消息接收成功的ack。

但同步复制会极大影响性能,所以在异步复制下,kafka依靠ISR机制,容忍一定的复制滞后范围,权衡了性能和数据可靠性之间的关系。

二、生产者

1. 消息发送三种模式

即发即忘(fire-and forget)、同步(sync)、异步(async)

KafkaProducer的send方法返回Future对象,使用get()方法实现同步发送。

通过指定Callback实现异步发送。

public Future send(ProducerRecord rescord,CallBack callback)

2. 分区器

分区器是Kafka为消息分配分区的功能,若发送消息时ProducerRecord中没有指定partition,则使用默认分区器,若有消息有key,则对key做hash,在可用分区中选择,若没有key,则轮询所有分区。

分区器可以自定义,实现Partitioner,在生产者props中配置即可。

3. 生产者架构

生产者有两个线程,主线程负责创建消息及对消息做拦截、序列化、设置分区,打包到缓存批次里,被sender线程拉取走。

sender线程负责创建消息请求,发送消息、缓存已发送还未响应的消息及响应消息。

4. 生产者重要参数

acks:指定分区中必须有多少副本接收到,才算消息接收成功。1-leader副本接收成功即认为成功。0-不需要等待服务端响应。-1/all-全部副本接收成功才算成功。该参数为0性能最佳,可靠性最低,为-1可靠性最佳,性能最低。为1则是性能与可靠性的这种方案。

max.request.size:请求消息的最大值,默认1MB。

retries、retry.back.off.ms:重试次数与重试间隔时间

linger.ms:生产者发送ProducerBatch之前,等待更多消息加入的时间。默认为0 不等待,放大则会降低消息时效性,但提升吞吐量。

request.timeout.ms:生产者等待消息响应的超时时间。

三、消费者

1.消费者组合和消费者

kafka一个主题可以有多个消费者组,每个消费者组可以有多个消费者。

各个消费者组之间是独立的,同一个消息可以被多个消费者组消费。

一个消息在一个消费者组中,只能被一个消费者消费。

每个消费者组group.id唯一。

2.消费者和分区

一个主题可以有多个分区,每个分区都按一定策略均衡的分配给消费者进行订阅。

消费者数量若等于分区数量,1对1均衡分配。消费者数量小于分区数量,则消费者会分配多个分区。

但若消费者数量大于分区数量,则多出来的消费者不会被分配任何分区。所以消费者数量应小于等于分区数量。

3.投递模式

点对点(p2p):利用消费者组概念,所有消费者都在一个组内,实现一个消息只有一个消费者。

发布/订阅(pub/sub):利用消费者组概念,所有消费者在不同组中,实现广播效果。

4.消息消费及位移提交

使用poll(Duration)方法批量拉取到ConsumerRecords消息,此时主题中会记录最新消息被消费的位置lastConsumedOffset,以及下一个被拉取的位置position。当前拉取批次消息被消费完,则自动提交消费位移commited offset。

lastConsumedOffset到position之间的消息,就是正在被消费但还没提交位移的消息。消息消费完提交位移commitedOffset,则lastConsumedOffset变为最新位置

消费完成,位移提交

消费位移不仅可以自动提交,也可以手动提交。同步、异步,有参无参。commitSync、commitAsync方法。

5.消息重复及丢失

正是因为需要消费端提交位移,所以就可能出现某种原因导致未提交位移,消费者再次拉取,还是从上次拉取的位置开始,造成消息重复消费。所以用户需要做好幂等措施,kafka无法保证消息不重复。

又如果消费端拉取消息和处理消息是不同线程,或者异步提交位移。在已提交位移,但应用突然挂掉,导致消息丢失。所以需要在消息提交位移前用户自行缓存消息内容及消息处理状态,处理消息丢失后的重新消费逻辑。

6.消息回溯

若消息丢失,可以使用seek方法,指定分区及offset进行消息回溯,重新消费。

或者设置auto.offset.reset参数,从某个位置重新开始消费。

但有时候消息丢失了,也不一定依赖消息中间件处理。比如转账指令,指令消息发送方发送完转账消息,会对进行对账处理,也就是查询消息指令对应的业务指令状态,是否为已受理,过了一天转账指令仍然未被受理,则认为该消息未被消费、消费异常或者消息携带的业务数据有问题,则重新发起转账指令(消费端需做幂等校验)。

7.再均衡

再均衡是增减分区和消费者时,分区和消费者订阅关系再分配的行为。实现分区和消费者的可扩展性。

再均衡期间消费者是被暂停拉取到消息的,也不能提交位移。所以会导致消息重复消费问题。应当尽量避免。

或做好消息幂等。

再均衡有监听器:

1、再均衡开始前消费者停止拉取消息之后监听,可用于提交消费位移。

2、再均衡结束后,消费者拉取之前监听,可用于

8.拦截器

拦截消息消费之前(过滤过期消息)、位移提交之前(记录位移)

未完待续...

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

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

相关文章

JVM调优篇之JVM基础入门AND字节码文件解读

目录 Java程序编译class文件内容常量池附录-访问标识表附录-常量池类型列表 Java程序编译 Java文件通过编译成class文件后,通过JVM虚拟机解释字节码文件转为操作系统执行的二进制码运行。 规范 Java虚拟机有自己的一套规范,遵循这套规范,任…

@sun.misc.Contended

某个类有以下两个属性 volatile int a; volatile int b; int为4字节,两个int为8字节,一个缓存行大小为64字节 故一旦缓存行a失效了,但是b没失效,会连带着b一起失效,因为失效最小的单位就是一个缓存行 这样子会导致效率…

【Petri网导论学习笔记】Petri网导论入门学习(十一) —— 3.3 变迁发生序列与Petri网语言

目录 3.3 变迁发生序列与Petri网语言定义 3.4定义 3.5定义 3.6定理 3.5例 3.9定义 3.7例 3.10定理 3.6定理 3.7 有界Petri网泵引理推论 3.5定义 3.9定理 3.8定义 3.10定义 3.11定义 3.12定理 3.93.3 变迁发生序列与Petri网语言 对于 Petri 网进行分析的另一种方法是考察网系统…

Flink--API 之Transformation-转换算子的使用解析

目录 一、常用转换算子详解 (一)map 算子 (二)flatMap 算子 (三)filter 算子 (四)keyBy 算子 元组类型 POJO (五)reduce 算子 二、合并与连接操作 …

解锁Scala编程:深入文本分析与数据处理的艺术

引言: 在数据科学的世界里,Scala以其强大的并发能力和简洁的语法,成为处理大规模数据集的理想选择。本文将带您踏上一段Scala编程的探索之旅,从基础的文本分析到复杂的数据处理,每一步都精心设计,让您在实…

Top 10 Tools to Level Up Your Prompt Engineering Skills

此文章文字是转载翻译,图片是自已用AI 重新生成的。文字内容来自 https://www.aifire.co/p/top-10-ai-prompt-engineering-tools 供记录学习使用。 Introduction to AI Prompt Engineering AI Prompt Engineering 简介 1,Prompt Engineering 提示工程…

【RK3588 Linux 5.x 内核编程】-内核线程与读写自旋锁

内核线程与读写自旋锁 文章目录 内核线程与读写自旋锁1、读写自旋锁介绍2、Linux内核中的读写自旋锁2.1 初始化2.1.1 静态方法2.1.2 动态方法3、读写自旋锁加锁与解锁3.1 在用户上下文之间锁定3.1.1 读锁3.1.2 写锁3.2 下半部分之间的锁定3.3 在用户上下文和下半部分之间锁定3.…

Rust语言俄罗斯方块(漂亮的界面案例+详细的代码解说+完美运行)

tetris-demo A Tetris example written in Rust using Piston in under 500 lines of code 项目地址: https://gitcode.com/gh_mirrors/te/tetris-demo 项目介绍 "Tetris Example in Rust, v2" 是一个用Rust语言编写的俄罗斯方块游戏示例。这个项目不仅是一个简单…

Spring Boot 与 Spring Cloud Alibaba 版本兼容对照

版本选择要点 Spring Boot 3.x 与 Spring Cloud Alibaba 2022.0.x Spring Boot 3.x 基于 Jakarta EE,javax.* 更换为 jakarta.*。 需要使用 Spring Cloud 2022.0.x 和 Spring Cloud Alibaba 2022.0.x。 Alibaba 2022.0.x 对 Spring Boot 3.x 的支持在其发行说明中…

Oracle, PostgreSQL 字符串排序不一致及调整

有一个使用了不同数据库的应,Oracle 和 PostgreSQL,数据库中的记录完全相同,相同的查询语句(相同的排序,至少从字面上来说是的)取到的记录排序却不同,从而产生了 Bug。 简单演示一下默认排序各自在这两种数据库中的行为…

(免费送源码)计算机毕业设计原创定制:Java+ssm+JSP+Ajax SSM棕榈校园论坛的开发

摘要 随着计算机科学技术的高速发展,计算机成了人们日常生活的必需品,从而也带动了一系列与此相关产业,是人们的生活发生了翻天覆地的变化,而网络化的出现也在改变着人们传统的生活方式,包括工作,学习,社交…

Ubuntu Opencv 源码包安装

说明: ubuntu20.04 建议 使用 opencv-4.6.0版本 ubuntu18.04 建议 使用 opencv-4.5.2-版本 安装包准备 1、下载源码包 OpenCV官网 下载相关版本源码 Sources # 克隆方式 OpenCV 源码git clone https://github.com/opencv/opencv.gitcd opencvgit checkout 4.5.2 …

Linux 下自动化之路:达梦数据库定期备份并推送至 GitLab 全攻略

目录 环境准备 生成SSH 密钥对 数据库备份并推送到gitlab脚本 设置定时任务 环境准备 服务器要有安装达梦数据库(达梦安装这里就不示例了),git 安装Git 1、首先,确保包列表是最新的,运行以下命令: …

极狐GitLab 17.6 正式发布几十项与 DevSecOps 相关的功能【一】

GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…

<项目代码>YOLOv8 停车场空位识别<目标检测>

YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如Faster R-CNN),YOLOv8具有更高的…

【智能制造-46】人机工程(工厂自动化)

工作空间设计 设备布局规划 根据人体测量学数据,合理安排自动化设备、生产线和工作区域的布局。例如,考虑工人的操作空间和活动范围,确保他们能够舒适地接近和操作设备。在汽车装配车间,机器人和工人的工作区域应划分明确&#…

Spring Boot 集成 Knife4j 的 Swagger 文档

在开发微服务应用时,API 文档的生成和维护是非常重要的一环。Swagger 是一个非常流行的 API 文档工具,可以帮助我们自动生成 RESTful API 的文档,并提供了一个友好的界面供开发者测试 API。本文将介绍如何在 Spring Boot 项目中集成 Knife4j …

一线大厂面试集锦

String 为什么要设计成不可变的 String被设计成不可变的有以下几个原因: 线程安全:由于String是不可变的,多个线程可以同时访问同一个String对象而无需担心数据被修改。这使得String在多线程环境下是线程安全1. 的。 2.缓存Hash值:由于String是不可变的,它的hashcode可以…

JavaScript:遍历一个对象数组,获取每个对象中 mainKeyId 对应的值,并以这个值作为新属性的键名,给该对象添加一个新属性。

假设我们有一个对象数组,每个对象包含一个 mainKeyId 字段,以 mainKeyId 的值作为新的键名,并给它添加一个新的属性。可以通过以下代码实现: 示例代码: const arr [{ mainKeyId: key1, name: Item 1, value: 10 },{…

php CURL请求502

增加 pm.max_children 的值 当前值为 50,如果并发请求较多,可能会耗尽子进程资源,导致 502。增加到 100 或更高(根据服务器内存和负载能力调整)。 2. 调整 request_terminate_timeout 当前为 100 秒,适合…