首先让我们介绍一些常用词汇。我们有两个或更多的聚会
-
事务协调器这是我们的业务逻辑所在。这是协调分布式事务的一方。
-
Transaction Participant (XAResource) 这可以是任何支持分布式事务的 Dababase 或其他支持 XA 协议的实体,如消息传递服务。
让我们重点介绍在 XA 事务期间执行的主要 API 函数。
- 开始(XID)
- 结束(XID)
- 准备(XID)
- 提交(XID)
前两个操作在我们的源代码中可见。这是我们启动事务做一些工作然后说提交的时候。一旦我们从源代码发送提交消息,事务协调器和事务参与者就会接管并做一些工作。
XID 参数用作标识交易的唯一密钥。每个事务协调者和每个参与者在任何时候都可以参与多个事务,因此需要这样做才能识别它们。 XID 有两部分,一部分标识全局事务,第二部分标识参与者。这意味着同一事务中的每个参与者都将拥有自己的子标识符。
一旦我们到达事务准备阶段,每个事务参与者都会将其工作写入事务日志,并且每个事务参与者(XARersource)都会投票决定其部分是 OK 还是 FAILED。一旦收到所有投票,事务就被提交。
如果断电,事务协调器和事务参与者都会保持其事务日志的持久性并可以假定他们的工作。如果其中一位参与者在事务提交期间投票失败,则将启动后续回滚。
对性能的影响
根据 CAP 定理,每个应用程序(功能)都介于一致性、分区和可用性定义的三角形之间。 XA/分布式事务的主要问题是它需要极高的一致性。
此要求会导致非常高的网络和磁盘 IO 活动。
磁盘活动 事务协调者和事务参与者都需要维护事务日志。此日志保存在磁盘上,每个事务都需要强制使用此磁盘日志的信息,此信息不是缓冲信息。具有大的并行性将导致在每个事务日志中强制到磁盘的大量小消息。通常,如果我们将一个 1GB 的文件从一个硬盘复制到另一个硬盘,这将是非常快的操作。如果我们将文件分成 1 000 000 个部分,每个部分包含几个字节,则文件传输将非常缓慢。
磁盘强制随着参与者数量的增加而增加。
1 个参与者被视为正常交易
2 名参与者
磁盘强制为 5
3 等于 7
网络活动
为了绘制分布式 XATransaction 的平行线,我们需要将其与某些东西进行比较。正常交易期间的网络活动如下。 3 次网络旅行 - 登记事务,发送一些 SQL,提交。
对于 XA 事务,这是一个更复杂的想法。如果我们有 2 个参与者。
我们在事务 2 网络旅行中征集资源。然后我们发送准备消息另外 2 次旅行,然后我们提交另外 2 次旅行。
您在事务中登记的参与者越多,发生在 2 个资源上的实际网络活动就越多。
关于如何快速获得分布式事务的结论
- 要做到这一点,您需要确保您拥有一个快速且延迟最小的网络
- 确保您的硬盘具有最小延迟和最大随机写入速度。一个好的SSD可以创造奇迹。
-尝试在事务中争取尽可能少的分布式资源
- 尝试将您的数据分为对一致性和可用性要求高的数据(实时数据)和对一致性要求低的数据。实时数据使用分布式事务。对于离线数据,使用正常交易,如果您的数据不需要,则不使用交易。
我的回答基于我在“XA 暴露”(和个人经验)中所读到的内容,这似乎在互联网上不再可用,这促使我写了这篇文章。