微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

kafka理论总结

server向 producer 应答机制有3种

一、立即回复,最快,但是最不安全
二、server 让leader 储存 ,立即发送ack
三、等所有的leader 及follower 全都同步完了,才回ack

ISR列表 保持同步的副本

存储的所有的副本的列表

isr in-sync replica set leader 维护一张leader的表

如果follower 在多少时间内未发送数据到leader则 踢出去

High Watermark


LEO log end offset
HW high waterMark


Exactly Once 语义:
服务器的ack级别:
ack -1 保证不会丢失数据 at least once 到少一次
优点: 保证不丢数据
缺点: 可能导致重复发送
ack 0 只发送一次数据 at most once 最多一次 (保证生产者的每条消息,只能发送一次)
优点: 可以保证数据不重复
缺点: 不能保证数据不丢失

如何保证消息,既不复发,也能保证发送呢? Exactly Once
历史: 在0.11版本以前的Kafka,对此是无能为力的,只能保证数据不丢失
历史解决办法: 费者对数据做全局去重

0.11版本的Kafka: 引入 "幂等性"
"幂等性" --> 不论向Server发送多少次重复数据,Server端都只会持久化一条
At Least Once + 幂等性 = Exactly Once

用法:
要启用幂等性,只需要将Producer的参数中enable.idompotence设置为true即可

原理: (pid,partition,SeqNumber)
开启幂等性的Producer在 "初始化" 的时候会被分配一个PID,发往同一Partition的消息会附带Sequence Number。而broker端会对<PID, Partition, SeqNumber>做缓存,当具有相同主键的消息提交时,broker只会持久化一条。
问题:
但是PID重启就会变化,同时不同的Partition也具有不同主键,所以幂等性无法保证跨分区跨会话的Exactly Once。

以上问题如何解决? 重重重重重要........
Kafka从0.11版本开始引入了事务支持
事务可以保证Kafka在Exactly Once语义的基础上,生产和消费可以跨分区和会话,要么全部成功,要么全部失败。
为了实现跨分区跨会话的事务,需要引入一个全局唯一的Transaction ID,并将Producer获得的PID和Transaction ID绑定。这样当Producer重启后就可以通过正在进行的Transaction ID获得原来的PID。


实现:
为了管理Transaction,Kafka引入了一个新的组件Transaction Coordinator.

负责两件事情:
1、写事务的执行状态写入kafka 一个topic里面
2、向producer提供事务的状态信息,从而来获取pid

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐