面试问kafka消息丢失问题,你怎么答?

前言

回答这个问题,我想可以从消息流开始产生(生产端),到kafka服务存储(broker),到被消费(消费端)的这个过程着手分析,明确kafka消息丢失的边界和如何配置kafka才能保证消息不丢失。【参考文献】

每个服务都应该有自己明确的职责范围,kafka服务也不例外。所以,kafka保证消息不丢失,首先有一个重要的前提,那就是「消息已提交」。如果一条消息还未到达kafka服务,或者是到达了却未满足「已提交」这个定义,那么在kafka看来都属于消息未提交。接下来,我们一起来剖析这个过程吧~

生产端

kafka生产者发送消息之后被抱怨丢失消息是我们常常听到的。实际上,kafka生产者提供的send()接口,有三种模式:

1. 发后即忘(fire-and-forget)。send(record)接口的调用让生产者只管发送消息而不用关心消息是否正确到达kafka服务。这种发送方式的性能最高,但可靠性也最差,可能会出现消息丢失。【参考文献】

2. 同步(sync)。send(record).get()接口的调用会让生产者进程阻塞等待kafka服务的响应。实际上send(record)方法本身是异步的,只是直接链接调用get()方法是同步阻塞的。这种发送方式的可靠性最高,但性能也是差很多,下一条消息的发送需阻塞等待上一条消息发送完之后才能进行。

3. 异步(async)。send(record, callback)接口的调用让生产者即不会像第1模式那样完全不在乎是否发送成功,也不像第2模式那样发送需阻塞等待。有了callback回调,消息发送既可以异步,同时如果kafka服务有错误信息,也能准确回调告诉程序,让其能针对性地进行处理。并且,对于同一个分区而言,回调函数的调用也可以保证分区有序。生产环境应用中,大部分人都会选择第3种模式,让callback回调告诉本次消息是否真的提交成功。另外可能还会因为网络抖动而发送失败的情况,我们可以配置重试机制。总之,生产端要保证消息「已提交」到kafka服务这个职责。

生产者重要的配置参数解析:

1.设置acks=all。

表示必须要有多少个副本确定收到这条消息,之后生产者才会认为这条消息发送成功。这个参数控制着消息持久化的方式有3种类型:【参考文献】

• acks=0。生产者发送消息无需等待kafka服务端的响应。这种方法可靠性最低,

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值