Kafka实现精确一次(exactly once)发送消息的原理

**Exactly-once(精确一次):**即使生产者重复发送消息,消息也只被传递一次给最终消费者。需要消息传递系统本身与产生者和消费者之间的合作。如果在成功消费了一条消息后,你将你的Kafka消费者回滚到之前的偏移量,你将再次收到从该偏移量到最新偏移量的所有消息。Exactly-once提交也必须考虑到客户端失败。broker应该丢弃由僵尸机发送的消息。对于消费者来说也是如此;一旦启动了新的客户端实例,它必须能够从失败实例遗留的任何状态恢复,并从安全点开始处理。这意味着消耗的偏移量必须始终与产生的输出保持同步。

Kafka中的持久性依赖于生产者从代理接收到的ack。当关闭ack机制,生产者发送消息后就不管了,也就是只发送一次消息,可能会因为网络等原因造成数据丢失。

如何实现精确一次处理语义

============

幂等的producer

在创建producer客户端的时候,添加配置props.put(“enable.idempotence”, ture),producer就变成幂等的了。底层实现就是对每条消息生成一个id值,broker会根据这个id值进行去重,从而实现幂等,这样一来就能够实现精确一次的语义了。

幂等的producer有两个主要是缺陷:

幂等性的producer仅做到单分区上的幂等性,即单分区消息不重复,多分区无法保证幂等性。

只能保持单会话的幂等性,无法实现跨会话的幂等性,如果producer挂掉再重启,无法保证两个会话间的幂等(新会话可能会重发)。因为broker端无法获取之前的状态信息,所以无法实现跨会话的幂等。

事务的producer

当遇到上述幂等性的缺陷无法解决的时候,可以考虑使用事务了。事务可以支持多分区的数据完整性,原子性。并且支持跨会话的exactly once处理语义,即使producer宕机重启,依旧能保证数据只处理一次。

开启事务首先需要开启幂等性,即设置enable.idempotence为true。然后对producer消息发送做事务控制。

//初始化事务

producer.initTransactions();

try {

//开启一个事务

producer.beginTransaction();

producer.send(record1);

producer.send(record2);

//提交

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
86)

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 19
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值