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