一架梯子,一头程序猿,仰望星空!
分布式事务面试题 > 内容正文

什么是TCC协议?TCC协议与2PC协议有什么区别?


问题简答

TCC(Try-Confirm/Cancel)是一种分布式事务协议,用于解决分布式系统中的数据一致性问题。它是一种基于补偿事务的协议,通过一系列的步骤来确保分布式系统中的事务要么完全提交,要么完全回滚,从而保证数据的一致性。

问题详解:

1.TCC协议

TCC协议通常由三个阶段组成:

1.1.Try 阶段

在这个阶段中,参与者会尝试执行事务,并将所有要修改的数据保存在一个本地事务中。如果所有的参与者都执行成功,那么它们就会向协调者报告这一事实。

提示:这个阶段,实际业务场景就是提前预留资源,例如,预扣库存,提前把库存扣了。

1.2.Confirm 阶段

如果所有的参与者都成功执行了 Try 阶段,那么协调者会向所有参与者发出确认提交的指令。在这个阶段中,参与者将提交事务,释放资源,并向协调者报告操作成功。

提示:这个阶段,相当于本地事务的Commit阶段,就是提交事务,例如:把try阶段的预扣库存,真扣了。

1.3.Cancel 阶段

如果在 Try 阶段中有任何参与者执行失败,那么协调者会向所有参与者发出取消事务的指令。在这个阶段中,参与者将回滚事务,释放资源,并向协调者报告操作失败。

通过这些步骤,TCC协议可以保证在分布式系统中的事务操作要么全部提交,要么全部回滚,从而确保了数据的一致性。

2.TCC示意图

下面是tcc协议流程图(UML时序图)

3.TCC缺点

3.1.实现复杂

相对于2PC协议而言,TCC协议的实现较为复杂。由于TCC协议涉及到 Try、Confirm、Cancel 等多个步骤,需要在应用程序中对这些步骤进行实现,而且对于不同的业务场景,TCC协议的实现方式也可能不同,因此实现难度较大。

3.2.资源占用

在TCC协议的 Try 阶段中,需要将所有要修改的数据保存在一个本地事务中,直到 Confirm 阶段才会将事务提交并释放资源。这样会占用一定的内存和其他资源,并且当参与者较多时,可能会造成资源的浪费。

提示:可以通过资源预扣的方式,避免通过本地事务锁定资源。

3.3.性能瓶颈

TCC协议需要多次网络通信,从 Try 阶段到 Confirm 或 Cancel 阶段,每个阶段都需要进行网络通信。当参与者数量较多时,这种多次通信会对系统性能产生影响。

提示:其实所有强一致性的分布式事务实现方案,都比较占资源,能不用就不用。

4.TCC协议与2PC协议的区别

4.1.实现层次不同

TCC是在应用层面实现的分布式事务协议,而2PC是在数据库层面实现的分布式事务协议。

4.2.算法不同

TCC是通过一系列的 Try-Confirm/Cancel 操作来实现事务的提交或回滚,而2PC是通过发送提交请求、投票和提交/回滚命令等步骤来实现事务的提交或回滚。

4.3.可扩展性不同

2PC在处理大规模分布式系统时存在可扩展性问题,因为在参与者数量较大时,协调者需要进行大量的网络通信和等待,从而导致性能下降。而TCC协议相对于2PC协议更加灵活和可扩展,可以根据需要增加或减少参与者,而不会影响整个分布式系统的性能。

4.4.容错性不同

2PC协议的缺点是单点故障,如果协调者发生故障,整个分布式事务就无法完成,而TCC协议在实现中可以采用分布式协调者来解决单点故障问题,从而提高了容错性。