Kafka如何保证不丢消息

生产者丢消息问题

生产者(Producer) 调用send方法发送消息之后,消息可能因为网络问题并没有发送过去。

  • 使用producer.send(msg)发送数据,这个方法保证不了成功,可以通过get获取发送结果,没有成功,继续发送,这样弄把异步弄成了同步,影响性能
  • 使用 producer.send(msg, callback),失败了通过回调函数进行发送重试,重试间隔和时间稍微大一些

消费者丢消息问题

在这里插入图片描述

消息到partition的时候,会分配一个offset,消费者拉取某个分区的消息后,会自动提交offset,如果这部分消息还没有消费,突然挂掉了,这个时候这部分消息就丢失了

  • 改为消息消费完 然后在提交offset,这样不太好的就是消息可能会消费两次,可以通过做幂等来处理。

Kafka本身丢了消息

Kafka中partition分区中存在多个副本,多个副本中,其中有一个是leader副本,其他都是follower。
我们发送的消息发到leader,然后follower副本从leader副本拉数据同步,生产者和消费者只于leader副本交互。其他副本只是存储作用。
假设leader副本的broker挂掉,这个时候从follower副本中选出的leader数据就有可能不全,发生消息丢失

设置acks=all

acks=1是生产者发送的消息被leader副本接收之后就算发送成功
acks=all是生产者发送的消息被所有副本接收之后就算发送成功

replication.factor >= 3

每个partition副本数至少有3个副本
建议设置 replication.factor= min.insync.replicas+1;

设置 min.insync.replicas > 1

代表至少写入两个副本才算是发送成功。

设置 unclean.leader.election.enable = false

leader副本消息同步follower副本过程中,同步情况不一致,设置为false之后,当leader副本发生故障时,就不会从达不到要求的副本中选leader了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值