Kafka幂等生产者

105 阅读2分钟

幂等性:如果一个操作执行多次的结果与执行一次的结果相同,那么这个操作就是幂等的。

幂等生产者的工作原理

如果启用了幂等生产者,那么每条消息都将包含生产者ID(PID)和序列号,将它们与目标主题和目标分区组合起来就可以唯一标识一条消息。broker会用这些唯一标识符跟踪每个写入分区的最后5条消息。这个数量是受max.in.flight.requests.per.connection参数影响的,默认是5(也是最大值),为了减少每个分区需要跟踪的序列号数量,可以设置为更小的值。

也就是说,broker 会跟踪生产者在一个分区的最后 5 条消息,如果收到之前已经收到的消息,那么将拒绝这条消息,并返回错误。生产者会记录这个错误,并反映在指标中,但不抛出异常,也不触发警告。另外,如果 broker 期望消息 2 后面跟着消息 3,但是收到一个比较大的消息号,例如27,那么,broker 将返回“乱序”错误。

幂等生产者的局限性

幂等生产者只能防止由生产者自身的重试机制导致的消息重复,不管这种重试是由生产者、网络还是 broker 错误所导致。

对于同一条消息两次调用producer.send()就会导致消息重复,即使使用幂等生产者也无法避免,所以建议使用生产者内置的重试机制,而不是在应用程序中捕获异常并自行进行重试。

如果两个生产者发送同样的消息,幂等生产者同样无法检测到消息重复。

生产者重启(会生成新的PID),如果依旧发送之前的消息将被视为两条不同的消息,也会重复。

broker 故障。如果首领宕机,产生新首领,也可能造成消息重复。

启用幂等生产者

在生产者配置中加入enable.idempotence=true就可以

启用之后,每个分区的消息顺序都将得到保证,即使max.in.flight.requests.per.connection被设置为大于 1 的值