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

2024-01-07 17:43:58

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 ,这样降低了消息丢失的可能性

文章来源:https://blog.csdn.net/jianjun_fei/article/details/135411210
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。