面试题答案
一键面试架构设计层面确保事务消息一致性
- 分区与副本机制:
- Kafka的每个主题(Topic)被划分为多个分区(Partition),每个分区可以有多个副本(Replica)。其中一个副本被指定为领导者(Leader),负责处理该分区的所有读写请求,而追随者(Follower)副本则从领导者副本同步数据。
- 这种设计确保了数据的冗余和高可用性。在事务消息场景下,当生产者发送事务消息时,领导者副本首先接收消息并将其写入本地日志。只有当领导者副本成功写入,并且追随者副本同步完成后(通过ISR,In - Sync Replicas机制,ISR中的副本与领导者副本保持一定程度的同步),才认为消息已成功持久化。这保证了即使领导者副本出现故障,其他追随者副本也能提供一致的数据,从而确保事务消息的一致性。
- Broker 间通信协议:
- Kafka 使用基于TCP的二进制协议进行Broker之间的通信。这种协议高效且可靠,在事务消息传递过程中,Broker之间通过该协议进行数据同步、协调等操作。例如,当一个分区的领导者副本发生变更时,新的领导者副本需要与其他副本进行同步,确保所有副本上的数据一致。这种可靠的通信协议为事务消息一致性提供了底层保障。
生产者与消费者交互确保事务消息一致性
- 生产者事务机制:
- 事务开启与提交:生产者通过调用
initTransactions()
方法初始化事务,然后使用beginTransaction()
方法开始一个事务。在事务中,生产者可以向多个分区发送消息。当所有消息发送完成后,调用commitTransaction()
方法提交事务。如果在事务执行过程中出现错误,可以调用abortTransaction()
方法回滚事务。 - 幂等性:Kafka生产者支持幂等性,即生产者在重试发送消息时,不会导致重复消息写入Kafka。这是通过生产者的PID(Producer ID)和Sequence Number实现的。每个生产者实例在初始化时会被分配一个PID,每次发送消息时,会携带一个递增的Sequence Number。Kafka Broker端会缓存每个PID对应的最新Sequence Number,当接收到消息时,会验证Sequence Number,如果接收到的消息的Sequence Number小于或等于缓存的Sequence Number,则认为是重复消息,直接丢弃,从而确保了事务内消息的幂等性,保证了事务消息的一致性。
- 事务开启与提交:生产者通过调用
- 消费者事务机制:
- 事务隔离级别:Kafka消费者支持读已提交(Read - Committed)的事务隔离级别。这意味着消费者只会读取到已经成功提交事务的消息。当生产者提交一个事务后,消费者才能看到该事务中的消息。在消费者端,Kafka通过维护一个事务状态表来跟踪每个分区上事务的提交状态,只有当事务在所有分区上都成功提交后,消费者才会将该事务中的消息暴露给应用程序,从而确保消费者读取到的消息是一致的。
关键机制和技术点总结
- ISR 机制:In - Sync Replicas机制确保了副本之间的数据同步,只有ISR中的副本同步完成,消息才被认为是已成功持久化,保证了数据的一致性和可用性。
- 幂等性生产者:通过PID和Sequence Number实现幂等性,避免重复消息写入,保证事务内消息的一致性。
- 事务隔离级别:读已提交的事务隔离级别,确保消费者只能读取到已提交事务的消息,保证了消费者端消息的一致性。
- 事务状态跟踪:无论是生产者还是消费者,都需要跟踪事务的状态(开启、提交、回滚等),通过事务状态表等机制来确保事务操作的正确执行和消息的一致性。