Kafka中消息会不会丢失或者重复消费?

Kafka 专栏收录该内容
7 篇文章 1 订阅

Kafka中的消息会不会丢失或重复消费呢?为什么呢?

要确定Kafka的消息是否丢失或重复,从两个方面分析入手:消息发送和消息消费

1、消息发送

         Kafka消息发送有两种方式:同步(sync)和异步(async),默认是同步方式,可通过producer.type属性进行配置。Kafka通过配置request.required.acks属性来确认消息的生产:

0:producer不等待broker的ack,broker一接收到还没有写入磁盘就已经返回,当broker故障时有可能丢失数据;

1:producer等待broker的ack,partition的leader落盘成功后返回ack,如果在follower同步成功之前leader故障,那么将会丢失数据;(数据要求快,重要性不高时用)

-1:producer等待broker的ack,partition的leader和follower全部落盘成功后才返回ack,数据一般不会丢失,延迟时间长但是可靠性高。(数据重要时用)

综上所述,有6种消息生产的情况,下面分情况来分析消息丢失的场景:

(1)acks=0,不和Kafka集群进行消息接收确认,则当网络异常、缓冲区满了等情况时,消息可能丢失;

(2)acks=1、同步模式下,只有Leader确认接收成功后但挂掉了,副本没有同步,数据可能丢失;

kafka中维护了一个AR列表,包括所有分区的副本,AR又分为ISR和OSR,

ISR中副本都要同步leader中的数据,ack为-1时,只有都同步完数据才认为是成功提交了,成功提交后才能供外界访问。

OSR内的副本是否同步了leader的数据并不影响数据的提交,OSR内的follower尽力去同步leader,可能同步不是很及时。

最开始所有副本都在ISR里,kafka工作的过程中,如果某个副本同步速度慢于默认阈值,则被踢出ISR存入OSR中,如果后续速度恢复则回到ISR中。


2、消息消费

        Kafka消息消费有两个consumer接口,Low-level API和High-level API:

Low-level API:消费者自己维护offset等值,可以实现对Kafka的完全控制,可以指定读取哪个topic、partition、offset;

                         缺点是太过复杂,需要自行控制offset,连接哪个分区,找到分区leader 等。

High-level API:不需要管理offset,系统通过zookeeper自动管理;不需要管理partition,系统自动管理;消费者断线会自动根据上一次记录在zookeeper中的offset去接着获取数据

                         缺点是不能自行控制offset(对于某些特殊需求来说),不能细化控制如分区、副本、zk等。

使用低级接口Low-level API,每次消费的offset都是自行指定,可以有目的地去重复消费数据;

使用高级接口High-level API,可能存在一个问题就是当消息消费者从集群中把消息取出来、并提交了新的消息offset值后,还没来得及消费就挂掉了,那么下次再消费时之前没消费成功的消息就“诡异”的消失了;    

kafka的ack设置为-1虽然不会丢数据,但是可能产生冗余数据,例如生产者发送数据给leader,leader同步数据给ISR队列中follower,同步到一半leader宕机,此时选出新的leader,可能成为leader的这个follower具有部分刚才同步的数据,而生产者收到失败消息重发数据,新的leader接收数据就有部分数据重复了。

解决办法:

        针对消息丢失:

同步模式下,确认机制设置为-1,即让消息写入Leader和Follower之后再确认消息发送成功;

异步模式下,为防止缓冲区满,可以在配置文件设置不限制阻塞超时时间,当缓冲区满时让生产者一直处于阻塞状态;

        针对消息重复:将消息的唯一标识保存到外部介质中,每次消费时判断是否处理过即可。

ps:其实理论上kafka,在同步模式下ack设置为-1,异步模式在配置文件中设置不限制阻塞超时时间,防止缓冲区满;这样理论上就不会丢数据了;

但是实际生产环境还是会丢数据,正常丢个百分之一影响已经很大了,例如日常数据500G的日志,丢个5G影响很大,所以离线写入数据的场合不适合用kafka就是这个道理。

  • 0
    点赞
  • 2
    评论
  • 4
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论 2 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:创作都市 设计师:CSDN官方博客 返回首页

打赏作者

攻城狮Kevin

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值