IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> kafka如何保证消息交付可靠性以及避免消息重复 -> 正文阅读

[大数据]kafka如何保证消息交付可靠性以及避免消息重复

消息交付可靠性

什么是消息交付可靠性

??所谓的消息交付可靠性保障,是指Kafka为Producer和Consumer要处理的消息提供了什么样的承诺。常见的承诺右三种:

  • 最多一次:消息可能丢失,但绝不会被重新发送。
  • 至少一次:消息不会丢失,但有可能被重复发送。
  • 精确一次:消息不会丢失,也不会被重新发送。

?? kafka默认是使用第二种”至少一次”,因为只有Broker成功“提交”消息且Producer接到Broker的应答才会认为该消息成功发送。如果此时,消息提交成功了,但是Broker的应答没有成功返回Producer端(比如发生了网络抖动),那么Producer就无法确定是否发送成功。因此它只能选择重试,此时就会导致消息重复发送。
??kafka也可以提供最多一次交付保障,只需要让Producer禁止重试即可。通常情况下我们是不希望出现消息丢失的,但是有一些场景里偶尔的消息丢失是被允许的,不过消息重复是被绝对禁止的。此时使用最多一次交付保障就是比较好的。
??kafka是如何做到精确一次的?它是通过两种机制:幂等性和事务完成的。

什么是幂等性

??幂等性指:某些操作或函数能够执行多次,但每次的结果都是不变的。举例任何数乘以1就是一个幂等操作,因为一个数乘以1一次和任意次的结果相同。
在这里插入图片描述
??幂等性的最大优势在于我们可以安全的重试任何幂等性操作。

幂等性Producer

??在kafka中,Producer默认不是幂等性的,但我们可以创建幂等性的Producer。指定Producer幂等性的方法很简单,只需要设置一个参数:props.put(“enable.idempotence”,true)或props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG,true)。
??之后kafka会自动帮我们做消息去重,底层原理很简单,是经典的用空间换时间的优化思路,即在Broker端多保存一些字段。

幂等性Producer的作用范围

??首先:他只能保证单分区上的幂等性,即一个幂等性Producer能够保证某个主题的一个分区上不能出现重复,不能保证多个分区的幂等性。其次:他只能实现单会话上的幂等性,不能实现跨会话的幂等性。也就是重启Producer进程后幂等性保证就消失了。

如何实现多分区多会话的消息无重复?

??使用事务,或者依赖事务型Producer

kafka事务

??kafka主要在读已提交的隔离级别下工作。它能保证多条消息原子性的写入目标分区,也能保证Consumer只能看到事务成功提交的消息。

事务型Producer

??它能保证将消息原子性的写入多个分区中,并且不惧怕进程重启,重启之后还能保证发送消息的精确一次处理。
??设置事务Producer方法:

  • 设置enable.idempotence = true
  • 设置Producer端参数transactional.id
    代码使用:

producer.initTransactions();
try {
            producer.beginTransaction();
            producer.send(record1);
            producer.send(record2);
            producer.commitTransaction();
} catch (KafkaException e) {
            producer.abortTransaction();
}

使用了事务Producer之后就要有事务的开启,提交回滚等东西了。
之后Consumer端也需要做一些修改:设置Consumer端的参数isolation.level参数的值。
它的取值有:
1:read_uncommitted:读未提交
2:read_committed:读已提交

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-04-18 17:49:30  更:2022-04-18 17:51:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:11:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码