登 录
注 册
< 大 数 据
Flink
Hadoop
Spark
Hive
HBase
Kafka
其他框架
分布式消息队列
Kafka命令行操作
生产者与幂等性
ExactlyOnce与事务
分区消费策略
手动提交offset
Kafka对接Flume
热门推荐>>>
中台架构
中台建设与架构
Hadoop
源码分析-NN启动(三)
HBase
HBased对接Hive
Linux
Nginx高可用
Python
数据导出工具
Flink
3分钟搭建Flink SQL测试环境
深度学习
卷积神经网络
数据结构与算法
选择合适的算法
MySQL
数据备份恢复
计算机系统
信号量同步线程
Hive
Hive调优参数大全
其他框架
Azkaban Flow1.0与2.0
ClickHouse
表引擎-其他类型
技术成长
最好的职业建议
精选书单
技术成长书单—机器学习
技术资讯
数据在线:计算将成为公共服务
开发工具
IntelliJ IDEA 20年发展回顾(二)
系统工具
Mac命令行工具
虚拟化
内存虚拟化概述
云原生
云原生构建现代化应用
云服务
一文搞懂公有云、私有云...
Java
Spring Boot依赖注入与Runners
Go
Go函数与方法
SQL
SQL模板
安全常识
一文读懂SSO
当前位置:
首页
>>
Kafka
>>
ExactlyOnce与事务
ExactlyOnce与事务
2020-07-04 14:46:20 星期六 阅读:2040
####Exactly Once语义 先来看看另外两种语义 #####at least once语义 将服务器的ack级别设置为-1,可以保证producer到server之间不会丢失数据,及at least once语义。 #####at most once语义 将服务器的ack级别设置为0,可以保证生产者每条消息只会被发送一次。即:ac most once语义 #####exactly once语义 at least once语义可以保证数据不丢失,但是不能保证数据不重复,at most once可以保证数据不重复,但是不能保证数据不丢失。但是对于一些非常重要的信息,比如说交易数据,下游数据消费者要求数据既不能重复又不能丢失,即exactly once语义。在0.11版本以前的kafka,对此是无能为力的,只能保证数据不丢失,需要下游消费者对数据做全局去重。如果该分区有1000个消费者群组订阅,那么所有的消费者都需要去重,这对消费者的性能产生很大的影响。 在0.11版本的kafka,引入了一项重大特性:`幂等性`。就是指producer不论向server发送多少次重复的数据,server端都只会持久化一条。`幂等性结合了at least once语义,就构成了kafka的exactly once语义`。即: **`at least once + 幂等性 = exactly once`** 要启用幂等性,只需要将producer的参数中enable.idompotence设置为true即可(该参数设置为true之后,acks参数会自动设置为-1)。kafka的幂等性实现其实就是将原来下游需要做的去重放在了数据上游。开启幂等性的producer在初始化的时候会被分配一个PID,发往同一partition的消息会附带sequence number(同一条消息的序列化号是一样的),而broker端会对PID,partition, SeqNumber>做缓存,当局又相同主键的消息提交时,broker只会持久化一条。 但是PID重启(挂掉)就会发生变化,同时不同的partition也具有不同的主键,所以幂等性无法保证跨分区跨会话的exactly once。 ###Kafka事务 为了解决上面幂等性因为生产者重启的不足,Kafka 从 0.11 版本开始引入了事务支持。事务可以保证 Kafka 在 Exactly Once 语义的基 础上,生产和消费可以跨分区和会话,要么全部成功,要么全部失败。 ####producer事务 为了实现跨分区跨会话的事务,需要引入一个全局唯一的 Transaction ID(由客户端指定),并将 Producer 获得的 PID 和 Transaction ID 绑定。这样当 Producer 重启后就可以通过正在进行的 Transaction ID 获得原来的 PID。 为了管理 Transaction,Kafka 引入了一个新的组件 Transaction Coordinator。Producer 就 是通过和 Transaction Coordinator 交互获得 Transaction ID 对应的任务状态。Transaction Coordinator 还负责将事务所有写入 Kafka 的一个内部 Topic,这样即使整个服务重启,由于事务状态得到保存,进行中的事务状态可以得到恢复,从而继续进行。 ####consumer事务 上述事务机制主要是从 Producer 方面考虑,对于 Consumer 而言,事务的保证就会相对较弱,尤其时无法保证 Commit 的信息被精确消费。这是由于 Consumer 可以通过 offset 访问任意信息,而且不同的 Segment File 生命周期不同,同一事务的消息可能会出现重启后被删除的情况。