MST

星途 面试题库

面试题:消息队列 Kafka 事务在高并发复杂业务中的处理策略

在一个高并发的社交媒体平台,用户发布动态后,需要同时通知多个相关服务,如点赞服务、评论服务、推荐服务等,并且要保证这些操作要么全部成功,要么全部失败。当Kafka集群出现短暂网络波动时,如何利用Kafka事务确保数据一致性和业务的正确执行?请详细阐述解决方案及涉及到的Kafka事务原理。
34.8万 热度难度
后端开发消息队列

知识考点

AI 面试

面试题答案

一键面试

解决方案

  1. 生产者端
    • 开启事务:在生产者代码中,通过设置enable.idempotence=truetransactional.id属性来开启幂等性和事务。例如在Java中:
Properties props = new Properties();
props.put("bootstrap.servers", "your - kafka - brokers");
props.put("enable.idempotence", "true");
props.put("transactional.id", "my - transactional - id");
KafkaProducer<String, String> producer = new KafkaProducer<>(props);
producer.initTransactions();
  • 执行事务操作:在发布用户动态后,要向点赞服务、评论服务、推荐服务对应的Kafka主题发送消息时,将这些发送操作封装在事务中。
try {
    producer.beginTransaction();
    producer.send(new ProducerRecord<>("likes - topic", "user - id", "like - data"));
    producer.send(new ProducerRecord<>("comments - topic", "user - id", "comment - data"));
    producer.send(new ProducerRecord<>("recommendations - topic", "user - id", "recommendation - data"));
    producer.commitTransaction();
} catch (ProducerFencedException | OutOfOrderSequenceException | AuthorizationException e) {
    producer.abortTransaction();
} catch (KafkaException e) {
    producer.abortTransaction();
}
  1. 消费者端
    • 确保幂等消费:消费者在处理消息时,要利用消息的唯一标识符(如Kafka的偏移量和消息的唯一键)来确保幂等性。例如,在处理点赞消息时,检查点赞操作是否已经执行过,如果执行过则跳过。
    • 事务一致性处理:如果消费者在处理事务相关的消息过程中出现异常,需要根据具体业务逻辑进行回滚操作。例如,如果点赞服务在处理点赞消息时失败,需要将已经处理的评论服务和推荐服务的相关操作回滚。

Kafka事务原理

  1. 事务协调者(Transaction Coordinator):每个Kafka集群都有一个或多个事务协调者,负责管理事务状态。当生产者开启事务时,会向事务协调者注册事务,事务协调者为该事务分配一个唯一的事务ID。
  2. 幂等性:Kafka通过生产者的幂等性机制来保证在出现网络波动等异常情况下,消息不会重复发送。生产者在发送消息时,会携带一个PID(Producer ID)和序列号,Kafka broker会根据这些信息判断消息是否重复,如果是重复消息则丢弃。
  3. 事务日志:Kafka使用事务日志(Transaction Log)来记录事务的状态。当生产者提交事务时,事务协调者会将事务状态写入事务日志,这样即使在Kafka集群出现短暂网络波动后,也能恢复事务状态,确保数据一致性。
  4. 事务状态机:Kafka事务有几个关键状态,如初始化、活动、预提交、提交和中止。生产者通过事务协调者来管理这些状态的转换,确保在事务执行过程中,所有相关的消息要么全部提交成功,要么全部中止,从而保证业务的正确执行。