kafka 消息不重复消费,也不丢失

Kafka(十一) 如何保证数据的不重复和不丢失 Kafka 如何保证数据的不重复和不丢失 阅读详情

一、Kafka中怎么保证消息不会丢失和不重复消费?

从两个方面分析:消息推送和消息消费。也就是生产者和消费者两方面。

首先我们需要知道topic的概念。

Topic : 话题,可以理解为一个队列, 生产者和消费者面向的都是一个 topic。
一个topic又有多个partition,而每个分区都有若干个副本:一个 leader 和若干个 follower。
生产者在推送消息时,会确定topic和topic中的那个partition。

一个消费者组内每个消费者负责消费 一个topic中不同分区的数据,同一个分区同时只能由一个组内消费者消费

一、生产者推送消息时怎么保证消息不丢失和不重复
对于生产者,在推送消息的时候,有以下几种方式来确定topic、topic中的partition。

将 producer 发送的数据封装成一个 ProducerRecord 对象。
在这里插入图片描述

1.指明 partition 的情况下,直接将指明的值直接作为 partiton 值;
2.没有指明 partition 值但有 key 的情况下,将 key 的 hash 值与 topic 的 partition 数进行取余得到 partition 值;
3.既没有 partition 值又没有 key 值的情况下,第一次调用时随机生成一个整数(后面每次调用在这个整数上自增),将这个值与 topic 可用的 partition 总数取余得到 partition值,也就是常说的 round-robin 算法。

1.1、总体概况

为保证 producer 发送的数据,能可靠的发送到指定的 topic, topic 的每个 partition 收到producer 发送的数据后,并等待该分区中全部的follower同步完成,该分区的leader才向 producer 发送 ack(acknowledgement: 确认收到),如果producer 收到 ack, 就会进行下一轮的发送,否则重新发送数据。

而为了处理follower在同步数据时发生故障,导致leader一直等待下去的情况,新增了ISR的机制。

1.1.2、什么是ISR呢?

Leader 维护了一个动态的 in-sync replica set (ISR:同步副本),意为和 leader 保持同步的 follower 集合。当 ISR 中的 follower 完成数据的同步之后,leader 就会给 producer 发送 ack。如果 follower长时间未向leader同步数据,则该 follower 将被踢出 ISR,该时间阈值由replica.lag.time.max.ms参数设定。而如果Leader 发生故障,就会从 ISR 中选举出新的 leader。

1.1.3、ACK机制

对于某些不太重要的数据,对数据的可靠性要求不是很高,能够容忍数据的少量丢失,所以没必要等 ISR 中的 follower 全部接收成功,才返回ack。

所以 Kafka 为用户提供了三种可靠性级别,用户根据对可靠性和延迟的要求进行权衡,选择以下的配置。

acks 参数配置:

0: producer 不等待 broker(或者说是leader)的 ack,这一操作提供了一个最低的延迟, broker 一接收到还没有写入磁盘的数据就已经返回,当 broker 故障时有可能丢失数据;
1: producer 等待 broker 的 ack, partition 的 leader 落盘成功后返回 ack,如果在 follower同步成功之前 leader 故障,那么将会丢失数据;
-1(all) : producer 等待 broker 的 ack, partition 的 leader 和 ISR 里的follower 全部落盘成功后才返回 ack。但是如果在 follower 同步完成后, broker 发送 ack 之前, leader 发生故障,那么会造成数据重复。(假如ISR中没有follower,就变成了 ack=1 的情况)

1.1.4、三种语义

At Most Once 语义:

将服务器 ACK 级别设置为 0,可以保证生产者每条消息只会被发送一次,即 At Most Once 语义。
此语义可以保证数据不重复,但是不能保证数据不丢失。
At Least Once 语义:

将服务器的 ACK 级别设置为-1(all),可以保证 Producer 到 Server 之间不会丢失数据,即 At Least Once 语义。
此语义可以保证数据不丢失,但是不能保证数据不重复。
Exactly Once 语义:

At Least Once + 幂等性 = Exactly Once
幂等性:所谓的幂等性就是指 Producer 不论向 Server 发送多少次重复数据, Server 端都只会持久化一条。
要启用幂等性,只需要将 Producer 的参数中 enable.idempotence 设置为 true 即可(此时 ack= -1)。 Kafka的幂等性实现其实就是将原来下游需要做的去重放在了数据上游。原理:开启幂等性的 Producer 在初始化的时候会被分配一个 PID,发往同一 Partition 的消息会附带 Sequence Number。而Broker 端会对<PID, Partition, SeqNumber>做缓存,当具有相同主键的消息提交时, Broker 只会持久化一条。
但是 PID 重启就会变化,同时不同的 Partition 也具有不同主键,所以幂等性无法保证跨分区、跨会话的 Exactly Once。(也就是说它只解决单次会话、单个分区里的消息重复问题)

1.2、过程总结

总结以上,可以得知生产者在推送消息时,依靠的是ISR、ACK机制、以及三种语义来达到不同情况的消息准确性。

所以总的过程应该是这样的: producer 向指定的 topic和partition发送数据, topic 的每个 partition 收到producer 发送的数据后,(下一步是等待ISR的follower同步完成,这一步会根据ack的参数配置[0,1,-1],确定具体的ack返回时机),该分区的leader向 producer 发送 ack(acknowledgement: 确认收到),如果producer 收到 ack, 就会进行下一轮的发送,否则重新发送数据。

而如果要保证生产者推送到服务器里的消息数据即不重复又不丢失,就要使用Exactly Once语义:将ack参数配置为-1,并开启幂等性(enable.idempotence= true)。

1.3、follower与leader出故障,怎么保证数据的一致性

follower 和 leader 发生故障了,该怎么处理。
在这里插入图片描述

LEO:(Log End Offset)每个副本的最后一个offset;
HW:(High Watermark)高水位,指的是消费者能见到的最大的 offset, ISR 队列中最小的 LEO;
follower 故障和 leader 故障:

follower 故障:follower 发生故障后会被临时踢出 ISR,待该 follower 恢复后, follower 会读取本地磁盘记录的上次的 HW,并将 log 文件高于 HW 的部分截取掉,从 HW 开始向 leader 进行同步。等该 follower 的 LEO 大于等于该 Partition 的 HW,即 follower 追上 leader 之后,就可以重新加入 ISR 了。
leader 故障:leader 发生故障之后,会从 ISR 中选出一个新的 leader,之后,为保证多个副本之间的数据一致性, 其余的 follower 会先将各自的 log 文件高于 HW 的部分截掉,然后从新的 leader同步数据。
注意: 这只能保证副本之间的数据一致性,并不能保证数据不丢失或者不重复。ack是负责数据丢失的

二、消费者丢失消息和重复消费消息的情况

consumer 采用 pull(拉) 模式从 broker 中读取数据。这个过程只涉及到了服务器和消费者两方,那消费者是怎么保证不丢失和不重复的获取消息呢?

关键在于consumer会维护一个offset,该offset实时记录着自己消费的位置。同时消费者能见到的最大的 offset,是HW, 是ISR 队列中最小的 LEO【这一点看1.3】,所以只要保证offset不出错,那消息就不会丢失或者重复消费。但是offset的维护并不是那么简单,它分为好几种方式。

offset的维护方式:

自动提交

enable.auto.commit:是否开启自动提交 offset 功能,消费者只在启动的时候去访问offset的值,如果将该值配置为false,就要手动提交offset,否则offset就不会更新。
auto.commit.interval.ms:自动提交 offset 的时间间隔
手动提交

commitSync(同步提交)
commitAsync(异步提交)
两者的相同点是:都会将本次 poll 的一批数据最高的偏移量提交;
不同点是:commitSync 阻塞当前线程,一直到提交成功,并且会自动失败重试(由不可控因素导致,也会出现提交失败);而 commitAsync 则没有失败重试机制,故有可能提交失败。
无论是同步提交还是异步提交 offset,都有可能会造成数据的漏消费或者重复消费。先提交 offset 后消费,有可能造成数据的漏消费;而先消费后提交 offset,有可能会造成数据的重复消费。
自定义存储offset
offset 的维护是相当繁琐的, 因为需要考虑到很多东西,例如消费者的 Rebalace。

三、总结

在业务的运用中。

对于消息重复,这个影响不是很严重,无论是生产者重复推送数据,还是消费者重复拉取数据,只要在消费端落库时,手动做去重就可以了。

对于消息丢失:

consumer端丢失消息的情形比较简单:如果在消息处理完成前就提交了offset,那么就有可能造成数据的丢失。由于Kafka consumer默认是自动提交位移的,所以在后台提交位移前一定要保证消息被正常处理了,因此不建议采用很重的处理逻辑,如果处理耗时很长,则建议把逻辑放到另一个线程中去做。为了避免数据丢失,可以采用手动提交offset:(1)enable.auto.commit=false 关闭自动提交位移、(2)在消息被完整处理之后再手动提交位移

生产者丢失消息是最复杂的情形了。生产者(Producer) 使用 send 方法发送消息实际上是异步的操作,我们可以通过 get()方法获取调用结果,但是这样也让它变为了同步操作,但是一般不推荐这么做!可以采用为其添加回调函数的形式。这个回调函数会在 Producer 收到 ack 时调用,此处就和acks参数配置[1、0、-1]密切相关了

如何避免Kafka的重复消费 从Producer和Consumer两个角度分析重复消费的问题。 Producer端 消息重复场景 Producer的send()方法可能会出现异常,配合生产者参数retries>0,生产者会在出现可恢复异常的时候进行重试。 若出现不可恢复异常的时候,配合send()的异步发送方式,则可能在回调函数中进行消息重发。上述均可能导致消息重复。 解决方法 Kafka的幂等性就是为了避免出现生产者重试的时候出现重复写入消息的情况。 开启幂等性功能配置(该配置默认为false)如下: prop.put(Pro 阅读详情

相关推荐

【中间件设计 Kafka】Kafka Exactly-Once语义,Kafka如何保证消息不重不漏

本文深入解析Kafka如何实现消息传递的三种语义(At most once、At least once、Exactly once),重点剖析Exactly-Once语义的实现机制。Kafka从0.11.0版本开始通过幂等性生产者和事务性生产者来确保消息不丢失不重复。文章采用"问题→解决方案"的结构,首先分析如何保证消息不丢失(At Least Once),包括生产者确认机制、Broker多副本配置和消费者手动提交偏移量;然后详细阐述如何避免消息重复(Exactly-Once核心),分别从

MaoLin Tian's Blog 1077

Kafka怎么保证数据不丢失,不重复

Kafka是一个分布式消息队列系统,具有高可靠性、高性能和高扩展性等特点。在数据传输过程中,Kafka采用了多种措施来保证数据的可靠性,包括数据复制、数据持久化、数据备份等。本文将从各个阶段深入分析Kafka如何保证数据不丢失、不重复,并提供代码实例来验证过程。

weixin_45017098的博客 6013

kafka如何保证消息不丢失不被重复消费

文章目录kafka如何保证消息不丢失不被重复消费消息的发送机制消息的接受机制消息的重复消费如何解决 kafka如何保证消息不丢失不被重复消费 在解决这个问题之前,我们首先梳理一下kafka消息的发送和消费机制。 消息的发送机制 kafka的消息发送机制分为同步和异步机制。可以通过producer.type属性进行配置。使用同步模式的时候,有三种状态来保证消息的安全生产。可以通过配置request....

平台开发组技术博客 7567

kafka怎么保证不丢失消息和不重复消费消息

Leader 维护了一个动态的 in-sync replica set (ISR:同步副本),意为和 leader 保持同步的 follower 集合。当 ISR 中的 follower 完成数据的同步之后,leader 就会给 producer 发送 ack。如果 follower长时间未向leader同步数据,则该 follower 将被踢出 ISR,该时间阈值由replica.lag.time.max.ms参数设定。而如果Leader 发生故障,就会从 ISR 中选举出新的 leader。

yx444535180的专栏 6573

Kafka系列--Kafka如何保证「消息不丢失」,「顺序传输」,「不重复消费」,以及为什么会发送重平衡(reblanace)

Kafka消息可靠性保障机制主要包括: 消息不丢失:生产者端通过同步发送、回调重试和acks=-1配置;Broker端通过ISR副本机制和持久化配置;消费者端手动提交offset。 消息顺序性:通过单分区或指定分区发送消息,消费端单线程处理保证顺序。 防重复消费:采用幂等机制,为消息生成唯一标识并存储校验,同时优化消费性能避免触发Rebalance。 Rebalance触发条件包括消费者变动、分区变更等,过程会暂停消费、重新分配分区后恢复。

hubin1989的专栏 1016

Python实战:用jieba和WordCloud打造电商评论情感分析工具(附完整代码)

本文详细介绍了如何使用Python的jieba分词和WordCloud库构建电商评论情感分析工具,涵盖数据预处理、情感分析、可视化展示等关键步骤,并提供完整代码实现。通过该工具,开发者可以高效分析电商评论数据,挖掘消费者情感倾向,为产品改进和决策提供数据支持。

weixin_30316097的博客 415

七、kafka怎么保证不丢失消息和不重复消费消息

Kafka中怎么保证消息不会丢失和不重复消费?从两个方面分析:消息推送和消息消费。也就是生产者和消费者两方面。首先我们需要知道topic的概念。生产者在推送消息时,会确定topic和topic中的那个partition。一个消费者组内每个消费者负责消费 一个topic中不同分区的数据,同一个分区同时只能由一个组内消费者消费对于生产者,在推送消息的时候,有以下几种方式来确定topic、topic中的partition。将 producer 发送的数据封装成一个 对象。 1.指明 partition 的情况下

qq_37200262的博客 1万+

基于JAVA的GB28181实现之SIP服务核心组件解析

本文深入解析了基于JAVA的GB28181标准中SIP服务的核心组件实现,包括协议栈选择、消息处理引擎、事务管理器等关键技术点。通过实战案例分享海康威视、大华设备的特殊处理技巧,并提供性能优化和常见问题排查指南,帮助开发者高效构建稳定的视频监控系统。

weixin_30892037的博客 264

kafka如何保证消息不丢失 不重复消费 消息的顺序

1.生产者生产消息发送到broker,broker收到消息后会给生产者发送一个ack指令.生产者接收到broker发送成功的指令,这个时候我们就可以认为消息发送成功了.没有接收到ack指令我们就认为消息发送失败.这是最可靠的确认模式,在这种模式下,生产者发送消息后会等待所有的ISR(In-Sync Replicas,同步副本)确认。这种模式提供了一定程度的可靠性,因为生产者知道消息至少已经被领导者接收,但仍然可能丢失消息,因为它们可能还没有被复制到其他副本。这确保了消息的可靠性。

sswltt的博客 1429

用友U8其中一个账套提示演示期已到期-修复方法

【事件始末】 一朋友求助,反馈使用的用友U8,很多年了! 突然发现其中账套2021年的一个账套打不开,提示演示期限已到期! 但是其他账套完全正常,可以打开,没有任何问题。 不管是还原老旧备份,还是重装软件问题依旧,无法自己解决。 客户查询报表结算账期,情况比较紧急,于是求助我们。 经过多次反复琢磨和烟酒,终于于晚上23点59分给弄了出来,也总是圆满解决问题了。 【问题分析】 该用户打的是 U82X免狗补丁,估计是该补丁文件设置了 最大有效期,补丁到期了导致的。 也有可能是程序...

u010431289的博客 2万+

从零到一:Bioconductor新手入门与R包安装实战

本文详细介绍了Bioconductor在生物信息学中的重要性及其R包安装实战指南。从环境准备到BiocManager的使用,再到常见问题排查,帮助新手快速掌握这一强大工具。特别推荐org.Hs.eg.db等核心工具包,助力基因注释和功能分析,提升研究效率。

weixin_29061041的博客 418

Kafka如何保证「消息不丢失」,「顺序传输」,「不重复消费」,以及为什么会发生重平衡(reblanace)

上一篇文章总结了kafka为什么快,下面来总结一下,kafka高频的常见的问题。内容有点多,全部看完需要有一定的耐心。

Jimoer 1044

【人工智能】Claude Code 安装、配置及问题排查完整指南

建议使用IDE来启动 Claude,执行后,内容如下。(确保环境可正常运行 npm 命令)。

奶爸的编程之路,也就一周冷个三天 1215

kafka如何保证消息不丢失和不重复消费

消息不丢失:通过副本机制、生产者和 Broker 的配置来确保消息成功写入并持久。

weixin_39304656的博客 1602

华为面试手撕真题【判断是ipv4还是ipv6地址】

编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址。

MISAYAONE的博客 1万+

RAG面试内容整理-8. 文档分块策略(滑动窗口、语义切分)

RAG系统通常面对长文档或整篇知识库资料的检索需求,但大模型一次处理的文本长度有限,向量索引也需固定大小的文本片段。因此,将长文档拆分成合适片段是必不可少的步骤,被称为文档分块(chunking)策略。

不务正业的猿 691

Kafka消息不丢失,不重复消费,保证顺序消费

Kafka消息不丢失,不重复消费,保证顺序消费

明耀的博客 837

2025年GESP3月认证C++五级真题解析

小 A 有 2n 件物品,小 B 和小 C 想从小 A 手上买走这些物品。对于第 i 件物品,小 B 会以 bi 的价格购买,而小 C 会以 ci 的价格购买。对于所有测试点,保证 1 <= T <= 100, 2 <= g < p <= 10^9, g, p 为整数, p 为质数。对于所有测试点,保证 1 <= n <= 10^5, 0 <= bi, ci <= 10^9, bi, ci 为整数。对于另外 50 % 的测试点,保证 n <= 100000, 0 <= bi, ci <= 10^9。

lan_in的博客 1036

如何保证rabbitMQ/kafka消息不丢失,不重复消费,高可用

消息队列主要用来项目系统之间服务解耦,异步,削峰 消息模型:生产者,队列,消费者 RabbitMq: 高可用模式(镜像集群模式): 你创建的 queue,无论元数据还是 queue 里的消息都会存在于多个实例上,就是说,每个 RabbitMQ 节点都有这个 queue 的一个完整镜像,包含 queue 的全部数据的意思。然后每次你写消息到 queue 的时候,都会自动把消息同步到多个实例的 queue 上。 那么如何开启这个镜像集群模式呢?其实很简单,RabbitMQ...

qq_37722992的博客 958

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Kafka 如何保证不重复消费又不丢失数据?

在大数据时代,消息队列作为分布式系统中不可或缺的一部分,承担着数据传输和解耦的重要职责。Kafka 作为一款高性能、高吞吐量的消息队列系统,被广泛应用于日志收集、监控数据聚合、流处理等多个领域。然而,在实际应用中,如何保证消息的不重复消费且不丢失数据,成为了一个重要的问题。本文将深入探讨 Kafka 在这两个方面的机制和策略,并结合具体案例进行分析。

cda2024的博客 1942

VB摄像头监控

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

转载:kafka如何保证消息不丢失不被重复消费

原始链接:https://blog.youkuaiyun.com/weixin_42674359/article/details/101519394 kafka如何保证消息不丢失不被重复消费 文章目录 kafka如何保证消息不丢失不被重复消费 消息的发送机制 消息的接受机制 消息的重复消费如何解决 kafka如何保证消息不丢失不被重复消费 在解决这个问题之前,我们首先梳理一下kafka消息的发送和消费机制。 消息的发送机制 kafka的消息发送机制分为同...

黄道婆的专栏 560

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

上一篇: 华为云资源分区(二)
下一篇: nginx 概述
ajax_beijing_java
博客等级 码龄13年 605粉丝 264原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值