【消息中间件篇07】Kafka是如何保证消息不丢失

79 阅读3分钟

知识点

image.png

使用kafka在消息的收发过程都是会出现消息丢失,Kafka分别给出了解决方案:

  • 生产者发送消息到Broker丢失
  • 消息在broker中存储丢失
  • 消费者从Broker接收消息丢失

生产者发送消息到Broker丢失

kafka生产者发送消息有多种消息发送方式(同步、异步),同步会产生阻塞,我们一般会使用异步发送

image.png

一般来说,消息发送失败的原因中:因为网络抖动发送失败比较多。我们可以设置消息重试

image.png

消息在broker中存储丢失

image.png 消息存储的大体流程:当生产者发送消息到Broker中后,这些消息会存储到分区中,分区分为leader和follower两个角色;leader有一个,而follower有多个,收到消息后,首先将数据保存到leader分区中,由leader同步到其他follower。这个acks确认机制就是同步机制。

  • 发送确认机制acks image.png

消费者从Broker接收消息丢失

image.png

  • kafka中的分区机制指的是将每个主题划分成多个分区
  • topic分区中的消息只能由消费者组中唯一一个消费者处理,不同的分区分配给不同的消费者(同一个消费者组)

分区消息的offset image.png

消费者默认是自动按期提交已经消费的偏移量,默认是每隔5秒提交一次。

如果出现重平衡的情况,可能会重复消费或者丢失数据

image.png

image.png

分析出现问题的原因:消费者是自动提交偏移,导致提交的偏移量不准确

禁用自动提交偏移量,改为手动

  • 同步提交
  • 异步提交
  • 同步+异步组合提交

同步+异步组合提交代码块 image.png

Kafka中消息重复消费问题如何解决的

  • 关闭自动提交偏移量,开启手动提交偏移量
  • 提交方式,最好是同步+异步提交
  • 幂等方案