如何构建批流一体数据融合平台的一致性语义保证?(13)

首先,在二阶段提交协议中,对于分布式事务的参与方,在 DataPipeline 的场景下为数据写入与 offset 写入,这是两个独立组件。两者之间的写入操作由 Coordinator 进行协调。第一步是一个 prepare 阶段,每一个参与方会将数据写入到自己的目的地,具体持久化的位置取决于具体应用的实现。

第二步,当 prepare 阶段完成之后,Coordinator 会向所有参与者发出 commit 指令,所有参与者在完成 commit 之后,会发出一个 ack,Coordinator 收到 ack 之后,事务就完成了。如果出现失败,再进行相应的回滚操作。其实在分布式数据库的设计领域中,单纯应用一个二阶段提交协议会出现非常多的问题,例如 Coordinator 本身如果不是高可用的,在过程当中就有可能出现事务不一致的问题。

所以应用二阶段提交协议,最核心的问题是如何保证 Coordinator 高可用。所幸在大家耳熟能详的各种框架里,包括 Kafka 和 Flink,都能够通过分布式一致协议实现 Coordinator 高可用,这也是为什么我们能够使用二阶段提交来保证事务性。

Kafka 事务消息原理

关于 Kafka 事务消息原理,网上有很多资料,在此简单说一下能够达到的效果。Kafka 通过二阶段提交协议,最终实现了两个最核心的功能。

推荐阅读