📚 分类
kafka
🕵🏽‍♀️ 问题描述
kafka是如何保证消息不丢失
👨‍🏫 问题讲解
❒ 使用Kafka在消息的收发过程都会出现消息丢失,Kafka分别给出了解决方案

✔ 生产者发送消息到Brocker丢失
✔ 消息在Brocker中存储丢失
✔ 消费者从Brocker接收消息丢失

producer -> broker(topic) -> consumer

❒ 设置异步发送

// 同步发送
RecordMetadata recordMetadatÃs kafkaProducer.send(record).get();
// 异步发送
kafkaProducer.send(record, new Callback() {

  @Override
  public void onCompletion(RecordMetadata recordMetadata, Exception e) {
    if (e != null){
      System.out.println("消息发送失败|记录日志");
    }
    long offset = recordMetadata.offset();
    int partition = recordMetadata.partition();
    String topic = recordMetadata.topic();
});

❒ 消息重试

// 设置重试次数
prop.put(ProducerConfig.RETRIES_CONFIG,10);

❒ 消息在Brocker中存储丢失

✔ acks = 0 生产者在成功写入消息之前不会等待任何来自服务器的响应,消息有丢失的风险,但是速度最快      
✔ acks = 1(默认值) 只要集群首领节点收到消息,生产者就会收到一个来自服务器的成功响应
✔ acks = all 只有当所有参与赋值的节点全部收到消息时,生产者才会收到一个来自服务器的成功响应

❒ 消费者从Brocker接收消息丢失

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

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

✔ 同步提交:如果一切正常,我们使用consumer.commitAsync()方法来提交。这样速度更快,而且即使这次提交失败,下次提交也可能会成功。
✔ 异步提交:如果直接关闭消费者,那就没有所谓的“下一次提交”了。使用consumer.commitSync()方法会一直重试,直到提交成功或者发生无法恢复的错误。
✔ 同步(在finally中写入同步提交逻辑) + 异步(每处理一条便异步提交一条)组合提交
🏳️‍🌈 问题总结
❒ 生产者发送消息到Brocker丢失

✔ 设置异步发送,发送失败使用回调进行记录或重发失败重试,参数配置,
✔ 可以设置重试次数

❒ 消息在Brocker中存储丢失

✔ 发送确认acks,选择all,让所有的副本都参与保存数据后确认

❒ 消费者从Brocker接收消息丢失

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

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

✔ 关闭自动提交偏移量,开启手动提交偏移量
✔ 提交方式,最好是同步+异步提交
✔ 幂等方案
📖 问题信息
📈 浏览次数:34 | 📅 更新时间:2025-12-01 22:01:52
📦 创建信息
🏷️ ID:73 | 📅 创建时间:2024-12-03 01:22:16