1. Retry Problem

  • 重试发送失败的消息通常带来风险,即两条消息都已成功写入broker,从而导致重复:

    • 生产者向Kafka发送消息;

    • 消息已成功写入并复制replicate;

    • 网络问题导致broker确认无法达到生产者;
      network issue prevent broker acknowledgment from reaching producer;

    • 生产者会将缺乏确认视为临时网络问题,并将重试发送消息,因它不知道消息已被接受;

    • 在此情况下,broker最终(end up)将受到相同的消息两次;

DuplicateMessage

2. Idempotent Producer

IdempotentProducer
  • 生产者幂等性(idempotence)确保不会因意外重试而引入重复项;

  • 当enable.idempotence设置为true时,每个生产者都会被分配assign
    一个生产者Id(PID),且每次生产者向broker发送消息时都会包含PID;

  • 另每条消息都会获得一个单调递增的序列号(与偏移量不同,仅用于协议目的),
    monotonically increasing sequence number;

  • 为生产者发送消息的每个主题分区维护一个单独的序列;

  • 在broker端,以每个分区为基础,跟踪成功写入的最大PID -
    序列号组合combination,当收到较低的序列号时,将其丢弃discard;

3. Enable Idempotence

  • 从Kafka V3.0开始,生产者默认:enable.idempotence=true和acks=all;

Properties properties = new Properties();

properties.setProperty(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG,"true");