【Kafka每日一问】Kafka如何保证消息不丢失?

1.从生产者方面

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

所以,我们不能默认在调用send方法发送消息之后消息消息发送成功了。为了确定消息是发送成功,我们要判断消息发送的结果。但是要注意的是  Kafka 生产者(Producer) 使用  send 方法发送消息实际上是异步的操作,我们可以通过 get()方法获取调用结果,但是这样也让它变为了同步操作

如果消息发送失败的话,我们检查失败的原因之后重新发送即可!

2.从消费者方面

  1. 关闭自动提交 offset,每次在真正消费完消息之后之后再自己手动提交 offset,但是这样会造成重复消费,需要消费幂等

3.从broker方面

  1. 设置 acks = all,acks 的默认值即为1,代表我们的消息被leader副本接收之后就算被成功发送。当我们配置 acks = all 代表则所有副本都要接收到该消息之后该消息才算真正成功被发送
  2. 设置 replication.factor >= 3,为了保证 leader 副本能有 follower 副本能同步消息,我们一般会为 topic 设置 replication.factor >= 3。这样就可以保证每个 分区(partition) 至少有 3 个副本。虽然造成了数据冗余,但是带来了数据的安全性
  3. 设置 min.insync.replicas > 1,这样配置代表消息至少要被写入到 2 个副本才算是被成功发送
  4. 设置 unclean.leader.election.enable = false,发送的消息会被发送到 leader 副本,然后 follower 副本才能从 leader 副本中拉取消息进行同步。多个 follower 副本之间的消息同步情况不一样,当我们配置了 unclean.leader.election.enable = false  的话,当 leader 副本发生故障时就不会从  follower 副本中和 leader 同步程度达不到要求的副本中选择出  leader ,这样降低了消息丢失的可能性

你可能感兴趣的:(Kafka每日一问,kafka,分布式)