kafka消息丢失的场景分析

本文分析了Kafka在生产者、消费者和Broker端可能导致消息丢失的场景,并提出了解决方案。生产者应使用producer.send(msg, callback)并设置acks=all、retries>0以确保消息发送;消费者需禁用enable.auto.commit,手动控制提交偏移量以防止数据丢失;Broker端需设置unclean.leader.election.enable=false和适当复制因子及最小同步副本数,以增强消息持久性。通过这些配置,可以有效避免Kafka中的消息丢失问题。" 112398387,10540008,机载天线波束控制:从机械到电子扫描,"['天线设计', '雷达技术', '电子扫描', '机械扫描', '相控阵']
摘要由CSDN通过智能技术生成

一、生产者程序丢失数据

      消息大小超过Broker的message.max.bytes的值,Broker会直接返回错误;消息的格式错误;网络的瞬时抖动都可能造成生产者程序的数据没有发送到Broker;分区首领副本挂了等

      生产者采用producer.send(ProducerRecord record)导致数据发送后不管Broker是否接收到继续其他业务,都可能会出现上述丢失数据的场景。因此,需要使用producer.send(ProducerRecord record, CallBack callback)发送数据,发送失败时,Producer可以继续处理错误。

      Producer的max.requests.size表示生产者发送的单个消息的最大值,也可以指单个请求中所有消息的总和大小。此值必须小于Broker的message.max.bytes,能够有效的避免消息大小超限;网络抖动导致发送消息瞬时失败,采用retries+retry.backoff.ms对消息进行重试发送。如果消息是存在顺序的,就需要配置max.in.flight.requests.per.connection=1,避免重试带来的消息乱序。

二、消费者程序丢失数据

      属性enable.auto.commit决定分区偏移量提交的策略,值为false时,手动控制提交偏移量。consumer.commitSync()和consumer.commitAsync()、consumer.commitAsync(new OffsetCommitCallBack())分别为同步提交和异步提交。同步提交会一直重试直到成功,需要Broker的响应,而异步提交能够提高吞吐量。

      当先提交偏移量,后处理消息时,当消息处理失败时,该消息将被丢失。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值