未命名
未命名
其实 kafka 事务主要是为了保证多条消息同时发送成功,
用在分布式事务上,感觉没有多大用处。
kafka 的事务的作用只是用于传递消息成功还是失败,同时,这个传递的过程是解耦的。而已。
我们可以在一个带有@transaction 注解的方法下同时修改数据库状态和发送 kafka 消息,这样,发送 kafka 消息报错的时候,我们可以回滚 kafka 消息,同时因为报错,把数据库也回滚了
除了上面提到的之外,kafka 还支持先消费再生产这种模式下的事务,保证生产成功了再进消费进度的提交。
. 事务性提交 Offset(Transactional Offsets)
Kafka 支持事务性提交,确保 消息处理和 offset 提交是原子操作,避免数据丢失或重复。
🔹 事务模式
- 生产者(Producer)和消费者(Consumer)在同一事务中
- 消费数据后,offset 仅在事务提交后才被标记为已提交
- 适用于严格的一致性需求
📌 示例
producer.initTransactions();
while (true) {
producer.beginTransaction();
ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
for (ConsumerRecord<String, String> record : records) {
producer.send(new ProducerRecord<>("output-topic", record.value()));
}
// 提交事务,同时提交 offset
producer.sendOffsetsToTransaction(consumerOffsets, consumerGroup);
producer.commitTransaction();
}
🔹 适用场景
- 金融、支付等事务型应用
- 避免重复消费,确保 Exactly-Once 语义