主页 > 新闻资讯 > 大数据学习:Kafka事务实现流程

大数据学习:Kafka事务实现流程

作者:张老师 浏览次数: 2021-05-20 17:03
在Kafka框架当中,一个重要的概念,就是事务,在流处理场景下,Kafka事务应用广泛,搞懂Kafka事务这一块,也是学习当中的重要任务。今天的大数据学习分享,我们就主要来讲讲Kafka事务的具体实现流程。

Kafka事务听起来比较空洞,举个简单的例子,比如原子性的读取消息,立即处理和发送,如果中途出现错误,支持回滚操作。

Kafka事务处理流程

Kafka的整个事务处理流程如下图:

大数据学习:Kafka事务实现流程

上图中的Transaction Coordinator运行在Kafka服务端,下面简称TC服务。

__transaction_state是TC服务持久化事务信息的topic名称,下面简称事务topic。

Producer向TC服务发送的commit消息,下面简称事务提交消息。

TC服务向分区发送的消息,下面简称事务结果消息。

寻找TC服务地址

Producer会首先从Kafka集群中选择任意一台机器,然后向其发送请求,获取TC服务的地址。Kafka有个特殊的事务topic,名称为__transaction_state,负责持久化事务消息。这个topic有多个分区,默认有50个,每个分区负责一部分事务。事务划分是根据transaction id,计算出该事务属于哪个分区。这个分区的leader所在的机器,负责这个事务的TC服务地址。

事务初始化

Producer在使用事务功能,必须先自定义一个唯一的transaction id。有了transaction id,即使客户端挂掉了,它重启后也能继续处理未完成的事务。

Kafka实现事务需要依靠幂等性,而幂等性需要指定producer id。所以Producer在启动事务之前,需要向TC服务申请producer id。TC服务在分配producer id后,会将它持久化到事务topic。

发送消息

Producer在接收到producer id后,就可以正常的发送消息了。不过发送消息之前,需要先将这些消息的分区地址,上传到TC服务。TC服务会将这些分区地址持久化到事务topic。然后Producer才会真正的发送消息,这些消息与普通消息不同,它们会有一个字段,表示自身是事务消息。

这里需要注意下一种特殊的请求,提交消费位置请求,用于原子性的从某个topic读取消息,并且发送消息到另外一个topic。我们知道一般是消费者使用消费组订阅topic,才会发送提交消费位置的请求,而这里是由Producer发送的。Producer首先会发送一条请求,里面会包含这个消费组对应的分区(每个消费组的消费位置都保存在__consumer_offset topic的一个分区里),TC服务会将分区持久化之后,发送响应。Producer收到响应后,就会直接发送消费位置请求给GroupCoordinator。

发送提交请求

Producer发送完消息后,如果认为该事务可以提交了,就会发送提交请求到TC服务。Producer的工作至此就完成了,接下来它只需要等待响应。这里需要强调下,Producer会在发送事务提交请求之前,会等待之前所有的请求都已经发送并且响应成功。

提交请求持久化

TC服务收到事务提交请求后,会先将提交信息先持久化到事务topic。持久化成功后,服务端就立即发送成功响应给Producer。然后找到该事务涉及到的所有分区,为每个分区生成提交请求,存到队列里等待发送。

读者可能有所疑问,在一般的二阶段提交中,协调者需要收到所有参与者的响应后,才能判断此事务是否成功,最后才将结果返回给客户。那如果TC服务在发送响应给Producer后,还没来及向分区发送请求就挂掉了,那么Kafka是如何保证事务完成。因为每次事务的信息都会持久化,所以TC服务挂掉重新启动后,会先从事务topic加载事务信息,如果发现只有事务提交信息,却没有后来的事务完成信息,说明存在事务结果信息没有提交到分区。

发送事务结果信息给分区

后台线程会不停的从队列里,拉取请求并且发送到分区。当一个分区收到事务结果消息后,会将结果保存到分区里,并且返回成功响应到TC服务。当TC服务收到所有分区的成功响应后,会持久化一条事务完成的消息到事务topic。至此,一个完整的事务流程就完成了。

关于大数据学习,Kafka事务实现流程,以上就为大家做了简单的介绍了。Kafka事务是学习阶段一定要去重点搞懂的部分,从理论到实操,一定要多多去理解和练习。成都加米谷大数据,专业大数据培训,大数据开发,数据分析与挖掘,零基础班本月正在招生中,课程大纲及试听课程可直接联系客服!
热点排行
推荐文章
立即申请>>