1. Retry Problem
-
重试发送失败的消息通常带来风险,即两条消息都已成功写入broker,从而导致重复:
-
生产者向Kafka发送消息;
-
消息已成功写入并复制replicate;
-
网络问题导致broker确认无法达到生产者;
network issue prevent broker acknowledgment from reaching producer; -
生产者会将缺乏确认视为临时网络问题,并将重试发送消息,因它不知道消息已被接受;
-
在此情况下,broker最终(end up)将受到相同的消息两次;
-

2. Idempotent Producer

-
生产者幂等性(idempotence)确保不会因意外重试而引入重复项;
-
当enable.idempotence设置为true时,每个生产者都会被分配assign
一个生产者Id(PID),且每次生产者向broker发送消息时都会包含PID; -
另每条消息都会获得一个单调递增的序列号(与偏移量不同,仅用于协议目的),
monotonically increasing sequence number; -
为生产者发送消息的每个主题分区维护一个单独的序列;
-
在broker端,以每个分区为基础,跟踪成功写入的最大PID -
序列号组合combination,当收到较低的序列号时,将其丢弃discard;