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消息的幂等处理:
- 使用事务性生产者
- 消费者具备幂等性
- 根据Key管理Offset
- 提供exactly-once语义
其中使用事务和保证消费端幂等性是最常见的两种方式。