kafka一致性语义保证


一、消息传递语义:三种,至少一次,至多一次,精确一次

1、at lest once:消息不丢,但可能重复

2、at most once:消息会丢,但不会重复

3、Exactly Once:消息不丢,也不重复。

二、数据一致性保证:保证消息不丢、消息不重复

消息不丢:副本机制+ack,可以保证消息不丢。

数据重复:brocker保存了消息之后,在发送ack之前宕机了,producer认为消息没有发送成功进行重试,导致数据重复。

数据乱序:前一条消息发送失败,后一条消息发送成功,前一条又重试,成功了,导致数据乱序。

三、消息一致性保证:主要就是保证Exactly Once,即:数据不丢、数据不重复

1、0.11之前的kafka版本:保证消息丢,要在消息发送端和消费端都要进行保证。保证消息不重复,就是要对消息幂等,即去重

(1)消息发送端

request.required.acks 设置数据可靠性级别:

request.required.acks=1:当且仅当leader收到消息后返回commit确认信号后,消息发送成功。但有弊端,leader宕机,也就是还没有将消息同步到follower,这是会发生消息丢失。

request.required.acks=0:消息发送了,即认为成功,可靠性最低。

request.required.acks=-1:发送端等待isr列表所有的成员确认消息,才算成功,可靠性最高延迟最大。

(2)消息消费端

       消费者关闭自动提交,enable.auto.commit:false,消费者收到消息处理完业务逻辑后,再手动提交commitSync offersets。这样可以保证消费者即使在消息处理过程中挂掉,下次重启,也可以从之前的offersets进行消费,消息不丢。

(3)消息去重:主要借助于业务系统本身的业务处理或大数据组件幂等。如:hbase 、elasticsearch幂等。

Hbse幂等:将消息从kafka消费出来,保存到hbase中,使用id主键+时间戳,只有插入成功后才往 kafka 中持久化 offset。这样的好处是,如果在中间任意一个阶段发生报错,程序恢复后都会从上一次持久化 offset 的位置开始消费数据,而不会造成数据丢失。如果中途有重复消费的数据,则插入 hbase 的 rowkey 是相同的,数据只会覆盖不会重复,最终达到数据一致。

 

http://bigdata-star.com/archives/1507


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM