【Kafka技术内幕】(三):Kafka生产者:高可用Producer和ISR机制

Kafka中Producer与Broker之间的交互 分区策略 生产者放到broker中的数据为什么要分区存储? 1.方便在集群中扩展 2.更小的存储数据单元,可以提高并发 分区存储的原则 1.如果生产者指定放到broker的哪个partition中了,那就会按指定的分区存储 2.如果生产者没有指明partition但存储的内容含有key,则把key的hash值与broker的分区数进行取模,然后放到对应分区中 3.如果既没有指明partition也没有存储key,则第一次存储会随机生成一个整数,让这个整数和partitio... 阅读详情

我是少侠露飞。学习塑造人生,技术改变世界。

引言

上一篇我们介绍了Kafka的基本概念及工作流程,附传送门👇
【Kafka技术内幕】(二):Kafka简介
本节我们将侧重介绍Kafka的Producer,即生产者,将介绍Kafka是如何发送消息的,以及如何保证消息发送过程的可靠性的。

1 Producer的分区策略

说到Kafka的生产者,首先要想到的就是Producer的分区策略,为何要分区呢,大概有两点原因:

  1. 提高了消息队列在集群中的扩展性,一个Topic可以有多个Partition组成。
  2. 可以提高并发量,因为可以按照Partition为单位进行读写了。

那么Producer在发送消息的时候如何指定Partition呢?
所有要分区的数据都会被封装成一个ProducerRecord对象。然后会按照如下规则进行分区:

  • 指明partition时,直接将该值作为partition值。
  • 若未指明,但是有key的情况下,将key的hash值与该topic下可用的分区数取余得到partition值。
  • 若既未指明partition,也没有key时,在第一次调用时随机生成一个整数(后续每次调用都会在这个整数上自增),将该整数与topic下可用的分区数取余得到partition值,也就是常说的round-robin算法。

2 Producer的可靠性

生产者唯一的职责就是发送消息,但是既然有发送,可能就会出现消息丢失,那么Kafka是如何保证消息的不丢失呢?
Kafka为了保证数据的可靠性,在生产者层面做了两个实现,一是在存储层面,即为每个partition设置了副本,分leader和follower,发送的时候只发送到leader上,然后leader将消息数据同步到follower;二是在发送层面,Kafka要求只有当leader回复了ack确认收到之后才会完成该条消息的投递,否则会重试。

2.1 Producer的ISR机制

如下图所示,生产者把消息发送到服务器上的leader上,然后leader将消息同步给自己的所有follower。
在这里插入图片描述
Kafka默认当所有follower都完成同步消息后再返回给生产者ack。但考虑这样一种场景,当leader有若干个follower,其中每次同步的时候都有一个follower因为故障,迟迟不能与leader完成同步,那么leader就要一直等下去。这个问题如何解决呢?
事实上,leader通过一个同步副本ISR(in-sync replica set)机制解决了这个难题。ISR意味着和leader保持同步的follower集合,当follower从leader完成同步消息之后,leader就会向follower发送ack,如果follower长时间没有响应ack,则会被剔除ISR,该时间阈值由replica.lag.time.max.ms指定(默认10s)。当leader宕机之后,则会从ISR中选举出新的leader。

事实上,在更老版本的Kafka里,导致follower被踢出ISR,除了响应时间,还有和leader的差异信息条数。但是现在差异条数已经被取消了,原因主要是Kafka是按批次发送消息,假设一批次大小是12,然后差异条数的阈值是10,这样每次生产者给leader发送消息都会导致follower被踢出ISR,然后follower完成同步之后,又被重新选进ISR,这样往复很消耗Kafka和ZK的性能。

2.2 Producer的ACK机制

现在我们已经知道生产者发送消息有个确认的机制,那么Kafka里是何时确认呢?Kafka是通过配置acks的值确认机制的,这里一共提供了三种情况,对应不同的ACK机制:

  1. acks=0,生产者不等待broker的响应。这种情况下延迟最低,但是有可能丢失数据,比较适合高吞吐量、接受消息丢失的场景。
  2. acks=1,生产者发送消息等待broker的响应,等待leader落盘成功后响应确认。这种情况下,如果是在leader完成同步消息给follower前发生故障,则可能发生消息丢失。
  3. acks=-1,生产者发送消息等待broker的响应,直到leader和follower全部落盘成功后才会响应确认。此机制能严格保证不丢失数据。但当所有的follower同步完成之后,leader发送ack响应之前,leader发生了宕机,此时生产者会以为发送失败了,然后会重新发送数据给新的leader,因此该情况下会导致数据重复发送。

3 Producer的数据一致性

Kafka里数据有副本,那么必然会出现leader和follower不一致的情况,那么Kafka又是如何保证数据一致性的呢?如下图所示,这里先介绍两个概念:

  • LEO:Log end offset,即每个副本中的最后一个offset。
  • HW:High Watermark,所有副本中最小的LEO。
    在这里插入图片描述
  1. follower故障
    此时follower会被临时踢出ISR,待到恢复时,会读取本地磁盘里的HW,将log文件里高于HW的消息截断掉并从leader开始同步数据,直到follower赶上leader时会重新加入ISR。
  2. leader故障
    此时会从ISR选举出新的leader,然后会将所有副本里的log文件高于HW的消息截断,从新的leader重新同步数据。

注意,LEO和HW是保证数据一致性的机制,并不能保证数据不丢失或者数据不重复。

4 Producer的ExactlyOnce

聊完上面的,相信大家对Kafka生产者的可靠性、数据一致性有了一定的认识。这里再抛出一个比较深入的问题:Kafka能保证ExactlyOnce(即精准一次性)么,如果能,又是如何保证呢?
实际上,在交易业务里,对于精准一次性要求是比较高的,我们绝不能丢失交易数据,也不应该发起重复交易,这就是ExactlyOnce语义。
Kafka本身可以保证两种语义,根据上面的ack机制,我们可以明显的得到:当ack=0时,消息可能丢失,此时对应的是At most once语义;当ack=-1时,消息不会丢失但可能重复消费,此时对应的At least once语义。此时我们应该想到,要想保证ExactlyOnce,应该在At least once语义的基础上保证幂等性即可。

幂等性:用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。

但Kafka如何保证消息发送的幂等性呢?
Kafka在0.11新增的功能,对于每个producer会分配一个唯一 的PID,发往同一个broker的消息会附带一个Sequence Number,broker端会对<PID,partitionId,Sequence Number>做一个缓存,当具有相同主键的消息提交时,Kafka只会持久化一条。

但是PID会随着生产者重启而发生变化,并且不同的partition对应的partitionId也不相同,所以Kafka的幂等性无法保证跨会话、跨分区的ExactlyOnce。

点点关注,不会迷路

Kafka之Producer原理 本文主要是介绍了kafka生产者端的一些原理,先是从源码出发,介绍了生产者发送消息到Broker经历的一系列过程:先是创建了一个sender线程,然后在发送消息的过程中一次经过拦截器、累加器、分区器最后根据分区的批量消息是否新建或者满了来触发sender线程发送到Broker服务器中。 阅读详情

相关推荐

Kafka 之 生产者(Producer) 配置

Kafka Producer 是 Kafka 集群的发送消息的客户端,主要就是向某个 Topic 的某个分区发送一条消息。Partitioner 决定向哪个分区发送消息。用户指定 Key,默认的分区器会根据 Key 的哈希值来选择分区,如果没有指定 Key 就以轮询的方式选择分区。也可以自定义分区策略。Kafka Producer 的配置中,bootstrap.servers、key.serializer、value.serializer 这三个是必须的。

流华追梦的专栏 2743

Kafka的消息确认及ISR队列

Kafka的消息确认方式有3中 ,可以在生产者的配置文件中配置: ##0:不保证消息的到达确认,只管发送,低延迟但是会出现消息的丢失,在某个server失败的情况下,有点像 TCP ##1:发送消息,并会等待leader 收到确认后,一定的可靠性 ## -1:发送消息,等待leader收到确认,并进行复制操作后,才返回,最高的可靠性 request.required.acks =0 kafka的ISR队列,在leader的节点维护的一个follower列表 根据配置文件的参数 会把满.

代码搬运工 860

find命令

命令是 Linux/Unix 系统中用于搜索文件和目录的强大工具,支持多种搜索条件组合,并能对搜索结果执行各种操作。以下是其详细说明、常用参数及示例: 搜索路径:指定起始目录(如 、 或 表示当前目录)。 查找条件:基于文件名、类型、大小、时间等属性过滤。 处理动作:对匹配结果执行操作(如打印、删除、执行命令等)。 常用参数及示例 1. 按名称查找 :区分大小写匹配文件名。 :不区分大小写匹配文件名。 2. 按文件类型查找 :指定文件类型。 文件类型: :普通文件 :目录 :符号链接

qiao2458的博客 1136

Kafka简单入门02——ISR机制

kafka简单入门

Elaine2391的博客 6893

Emotion-LLaMA实战指南:从零构建多模态情感识别系统(附Python代码)

本文提供了Emotion-LLaMA多模态情感识别系统的实战指南。通过详细的步骤,指导读者从零搭建开发环境、运行本地Demo、理解模型架构,并完成数据处理与模型训练。该创新模型融合视觉、听觉与文本信息,实现更精准、接近人类理解的情感分析与推理,并附有完整的Python代码实现。

weixin_29094775的博客 416

PaddleOCR多进程GPU推理实战:200万图片高效处理方案

本文详细介绍了PaddleOCR多进程GPU推理在高效处理200万张图片OCR任务中的实战方案。通过优化GPU利用率、多进程并发和关键参数调优,实现了从单进程3000张/小时到8进程3万张/小时的性能飞跃,为大规模OCR处理提供了可靠解决方案。

prometheus9mon的博客 261

聊聊Kafka的生产者消费者确认机制

消息从生产者客户端发送至broker服务端topic,需要ack确认。acks与min.insync.replicas是两个配置参数.其中acks是producer的配置参数,min.insync.replicas是Broker端的配置参数,这两个参数对于生产者不丢失数据起到了很大的作用

Z__7Gk的博客 1338

工程制图习题集张大庆课后习题答案解析

所以,我想向大家求助,希望能得到一些学习资料、学习方法和学习经验,帮助我更好地理解和掌握这门课程。在寻找学习资料的过程中,我发现了一款叫做资小料的APP,它里面有很多关于工程制图的学习资料,包括视频教程、习题解答和考试真题等。通过使用资小料,我逐渐掌握了工程制图的基本理论和方法,解决了很多学习中遇到的问题。在这里,我想推荐给和我一样在学习《工程制图习题集》这门课的同学们,希望大家也能从这款APP中受益,共同进步。上传者: 『Consentesdei』蒼迷穀。出版社: 清华大学出版社。

weixin_58833001的博客 925

Kafka生产者同步和异步的JavaAPI代码演示

导入Maven的pom依赖 <dependencies> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>1.0.0</version> </dependen

zxr0130的博客 1354

车载以太网入坑指南,从小白到懂哥的进阶之路【技术分享】

各位技术大佬们好!最近公司项目涉及到车载以太网,刚开始完全懵逼,花了大半个月时间各种查资料、测试设备,总算是摸清了门道。想着互联网上卧虎藏龙,肯定有不少大佬对这个技术感兴趣,所以写个帖子分享一下,顺便求各位大佬指点。

starelink的博客 1261

STM8S全解析之系列文章4---STM8S芯片项目升级引导程序(使用中断接收升级数据)

STM8S全解析之系列文章4—STM8S芯片项目升级引导程序(使用中断接收升级数据) 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 文章目录STM8S全解析之系列文章4---STM8S芯片项目升级引导程序(使用中断接收升级数据)前言一、Flash划分boot和App二、使用步骤1.引入库2.读入数据总结 前言 用过STM8S都知道它没有中断向量重定向,也就意味着STM8S的中断向量没办法指向其他的位置,间接说明升级的引导

weixin_39853312的博客 1031

Kafka 如何保证高可用?

开启 Unclean 领导者选举可能会造成数据丢失,但好处是,它使得分区 Leader 副本一直存在,不至于停止对外提供服务,因此提升了高可用性,反之,禁止 Unclean 领导者选举的好处在于维护了数据的一致性,避免了消息丢失,但牺牲了高可用性。Leader 将等待 ISR 中的所有副本确认后再做出应答,因此只要 ISR 中任何一个副本还存活着,这条应答过的消息就不会丢失。ISR 中的副本都是与 Leader 同步的副本,相反,不在 ISR 中的追随者副本就被认为是与 Leader 不同步的。

CoderChronicle的博客 708

affymatrix探针转换 | GPL5175探针对应的基因转换

一般情况下,有一些比较成熟的对应平台的注释数据集的R包。但是这个注释平台,我在Bioconductor上找了一圈都没有找到。只能通过最原始也最可靠的方法,从GEO数据集上去下载这部分的注释文件。以下展示全过程。 我要检查的数据平台是:GPL5157。 数据集的注释集链接为:https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GPL5175 这个注释数据集比较难弄的地方在于,它的基因集注释的不太好。没有比较直接的可供提取的genesample的信息;在ge.

weixin_40640700的博客 7124

Kafka - ISR机制是什么?数据可靠性的核心保障

**Kafka ISR机制是保障数据可靠性的核心,通过动态维护与Leader同步的副本集合(ISR),确保消息持久化和故障恢复。关键点包括:1) ISR判定基于副本LEO是否≥Leader HW及活跃状态;2) acks=all需所有ISR副本确认;3) HW机制防止数据丢失;4) 合理配置min.insync.replicas平衡可靠性与可用性。该机制直接影响Kafka的吞吐量、故障恢复速度及Exactly-Once语义实现。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

移植Google Gemini Nano到RK3588 NPU,实现高效边缘推理

在嵌入式 AI 开发中,大家常常会遇到模型在硬件平台上运行时出现性能瓶颈的问题,比如推理速度慢、功耗过高,这严重影响了应用的实时性和稳定性 ,导致性能瓶颈,无法满足如智能安防、工业检测等场景的实时性需求。为了解决这些问题,我们可以将轻量模型移植到具有强大算力的硬件平台上。本文将手把手教你将 Google Gemini Nano(或类似轻量模型)移植到 RK3588 NPU,充分发挥 RK3588 NPU 的 6Tops 算力,实现高效的模型推理,提升嵌入式系统的 AI 处理能力。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 295

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【Kafka基础篇】Kafka高可用核心:ISR机制与ACK策略详解,吃透可靠性与吞吐量权衡

本文深入解析Kafka高可用机制中的ISR(同步副本集合)与Producer ACK策略。首先厘清核心概念:AR(所有副本)、ISR(同步副本)和OSR(非同步副本)的关系与判定标准。随后详细拆解ISR动态调整机制,包括副本加入/剔除条件及Leader切换影响。重点分析Producer的三种ACK配置(0、1、all)在可靠性、吞吐量方面的差异及适用场景,强调acks=all能确保最高可靠性但会降低吞吐量。文章通过Java代码示例展示配置方法,为开发者平衡性能与可靠性提供实用指导。

m0_58782205的博客 1908

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【Kafka】生产者Producer详解

详细讲解kafka的生产者

qq_43745578的博客 3121

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

2、Kafka Replica机制与ISR、HW、LEO、AR、OSR详解

本文系统梳理了 Kafka 副本机制及其核心概念,包括 AR、ISR、OSR、HW、LEO 等。重点解析了副本同步、消息提交、ack 配置、offset 管理等原理,阐明了 Kafka 如何在高可用与高性能之间取得平衡。理解这些机制,有助于更好地设计和运维高可靠的分布式消息系统。

梦想飞舞的专栏 1346

Kafka Producer之ACKS应答机制

无论哪一种,有一个关键的步骤叫做回调,也就是ACKS应答机制。异步发送的效率高,但是不安全,同步发送安全,但是效率低。其中ACKS也分为3个等级。

m0_51390969的博客 1338

Kafka: 生产者(Producer)核心机制

Kafka Producer核心机制与实践指南 本文系统解析Kafka Producer的核心概念与配置要点: 核心作用:作为Kafka数据写入入口,通过批处理、压缩等机制保障高性能 关键配置:必须显式定义bootstrap.servers、序列化器、重试机制等参数 发送模式:提供纯异步、异步阻塞和异步回调三种方式,满足不同场景需求 高级特性:包括分区负载均衡、消息持久化优化及Offset语义说明 性能优化:通过批处理(Batching)和缓冲区(Buffer)机制提升吞吐量 最佳实践建议根据业务场景平衡可

Wang的专栏 1248

Kafka 生产者(Producer)详解

Producer : 消息生产者,就是向Kafka broker 发消息的客户端。 下面将从producer的分区策略,数据可靠性保证、Exactly Once、Producer API 来进行介绍。 1、分区策略 1)分区原因 方便在集群中扩展(相当于负载) :每个Partition 可以通过调整以适应它所在的机...

qianyulin 7287

[消息队列 Kafka] Kafka 架构组件及其特性(二)Producer原理

这边整理下Kafka三大主要组件Producer原理。

harryptter的专栏 2106

kafka学习笔记(三、生产者Producer使用教程——原理及最全配置参数解析)

生产者就是负责向kafka发送消息的应用程序。消息在通过send()方法发往broker的过程中,有可能需要经过和的一系列作用后才能被真正的发往broker。key用来指定消息的键,不仅是附加消息还可以用来计算分区号而可以让消息发往特定的分区。byte[]

Timmer的博客 4033

Kafka~消息发送过程与ISR机制了解

同步发送时,可以在发送消息后,通过get方法等待消息结果,这种情况能够准确的拿到消息最终的发送结果,要么是成功、要么是失败。而异步发送,是采用了callback的方式进行回调的,可以大大的的提升消息的吞吐量,也可以根据回调来判断消息是否发送成功。

Shangxingya的博客 1485

Kafka 技术内幕笔记

功能的使用上是基于消费订阅模式设计的,在配置变更的维护上采用监听者模式实现的,其中ZK作为监听者模式的 context 存在的。

qq_42270334的博客 872

Kafka - Producer消息发送失败重试机制优化

本文深入探讨了Kafka Producer的消息发送失败重试机制,从基本概念、关键配置到优化策略进行了系统讲解。文章首先分析了重试机制的必要性及其触发条件,随后详细解读了retries、retry.backoff.ms等核心配置参数。通过流程图清晰展示了重试机制的工作流程,并提供了Java代码示例演示基础配置方法。此外,文章还介绍了幂等性、事务等高级特性,以及自定义重试策略的实现方式,为构建高可靠的Kafka消息系统提供了实用指导。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+
上一篇: 【Kafka技术内幕】(二):Kafka简介
下一篇: 【HTTP】cookies和session的爱恨情仇
少侠露飞
博客等级 码龄9年 214粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值