Kafka如何进行消息幂等处理?

Kafka中实现消息幂等的主要方法有:

1. 事务性生产者

使用Kafka的事务性生产者可以保证exactly-once语义。
每条发送的消息都会被记录,duplicate record 会被忽略。

举例

## www.itzhimei.com 代码
Producer<String, String> producer = new KafkaProducer<>(config, new StringSerializer(),new StringSerializer());
producer.initTransactions();
producer.beginTransaction();

for (message: messages) {
   producer.send(record);
}

producer.commitTransaction();

2. Idempotent consumer

幂等消费者可以保证消费者对每条消息产生的副作用仅一次。
使消费者具有幂等性。

举例

## www.itzhimei.com 代码
public void replay(List<Message> messages) {
    for (Message msg : messages) {
        processMessage(msg);  
        // 幂等处理,仅对首次处理有效果
        idempotentHandle(msg);         
    }
}

3. Key based offset管理

使用Key为单位管理Offset,可以保证同一个Key的消息在同一时间只被处理一次。

4. Exactly-once semantics

使用两个事务,分别记录offset和应用处理结果。
只有两个事务都成功时,才算主题被成功处理。

这四种方法都可以实现Kafka消息的幂等处理:

  1. 使用事务性生产者
  2. 消费者具备幂等性
  3. 根据Key管理Offset
  4. 提供exactly-once语义

其中使用事务和保证消费端幂等性是最常见的两种方式。