参考答案
Kafka事务特性:
- 是指一系列的生产者生产消息和消费者提交偏移量的操作在一个事务中,或者说是一个原子操作,生产消息和提交偏移量同时成功或者失败。
Kafka的事务特性本质上代表了三个功能:
1. 原子写
- Kafka的事务特性本质上,是支持了Kafka跨分区和Topic的原子写操作。
- 在同一个事务中的消息,要么同时写入成功,要么同时写入失败。
- Kafka中的Offset信息存储在一个名为_consumed_offsets的Topic中,因此read-process-write模式,除了向目标Topic写入消息,还会向_consumed_offsets中写入已经消费的Offsets数据。因此read-process-write本质上就是跨分区和Topic的原子写操作。
- Kafka的事务特性就是要确保跨分区的多个写操作的原子性。
2. 拒绝僵尸实例(Zombie fencing)
- 在分布式系统中,一个instance的宕机或失联,集群往往会自动启动一个新的实例来代替它的工作。这时如果原实例恢复了,集群中就产生了两个具有相同职责的实例,前一个instance就被称为“僵尸实例(Zombie Instance)”。
- 在Kafka中,两个相同的producer同时处理消息并生产出重复的消息(read-process-write模式),这样就严重违反了Exactly Once Processing的语义。这就是僵尸实例问题。
- Kafka事务特性通过
transaction-id
属性来解决僵尸实例问题。 - 所有具有相同
transaction-id
的Producer都会被分配相同的pid,同时每一个Producer还会被分配一个递增的epoch。Kafka收到事务提交请求时,如果检查当前事务提交者的epoch不是最新的,那么就会拒绝该Producer的请求。从而达成拒绝僵尸实例的目标。
3. 读事务消息
- 为了保证事务特性,Consumer如果设置了
isolation.level = read_committed
,那么它只会读取已经提交了的消息。 - 在Producer成功提交事务后,Kafka会将所有该事务中的消息的
Transaction Marker
从uncommitted
标记为committed
状态,从而所有的Consumer都能够消费。
以上,是 Kafka 面试题【Kafka事务的特性有哪些】的参考答案。
输出,是最好的学习方法。
欢迎在评论区留下你的问题、笔记或知识点补充~
—end—