分布式(XA)事务的性能调优 - 如何?

时间:2018-03-05 11:24:49

标签: java database transactions xa atomikos

关于another post of mine,我意识到在分布式,XA事务及其内部相关的stackoverflow上我们可以说的更多。普遍的看法是分布式交易很慢。

XA交易的内部结构是什么?我们如何调整它们?

1 个答案:

答案 0 :(得分:3)

首先让我们放一些常用的词汇。我们有两个或更多的派对

  • 交易协调员这是我们的业务逻辑所在的位置。这是协调分布式事务的一方。
  • 交易参与者(XAResource)这可以是支持分布式事务的任何Dababase或支持XA协议的其他实体,如消息服务。

让我们重点介绍在XA事务期间执行的主要API函数。   - 开始(XID)   - 结束(XID)   - 准备(XID)   - commit(XID)

enter image description here

前两个操作在我们的源代码中可见。这是当我们启动事务做一些工作然后说提交。一旦我们从源代码发送提交消息,事务协调器和事务参与者就会接管并做一些工作。

XID参数用作标识事务的唯一键。每个交易协调员和每个参与者在任何时候都可以参与多个交易,因此需要这样才能识别它们。 XID有两部分,一部分标识全局事务,第二部分标识参与者。这意味着同一事务中的每个参与者都将拥有自己的子标识符。 一旦我们到达事务准备阶段,每个事务参与者将其工作写入事务日志,并且每个事务参与者(XARersource)在其部分为OK或FAILED时进行投票。收到所有投票后,交易即被提交。 如果电力下降,交易协调人和交易参与者都会保持其交易日志持久并且可以推测他们的工作。如果其中一个参与者在事务提交期间投票失败,则将启动后续回滚。

表现方面的影响

根据CAP定理,每个应用程序(功能)都介于由一致性,分区和可用性定义的三元组之间。 XA / Distributed事务的主要问题是它需要极端的一致性。

此要求会导致非常高的网络和磁盘IO活动。

磁盘活动事务协调器和事务参与者都需要维护事务日志。此日志保存在磁盘上,每个事务需要强制使用此磁盘日志信息,此信息不是缓冲信息。具有大的并行性将导致在每个事务日志中强制进入磁盘的大量小消息。 Normaly如果我们将一个1GB文件从一个硬盘复制到另一个硬盘,这将是非常快速的操作。如果我们将文件分成1 000 000个字节,每个文件传输速度极慢。

磁盘强制随着参与者数量的增长而增长。

  

1参与者被威胁为正常交易
  2名参与者   磁盘强制是5
  3等于7

网络活动 为了为分布式XATransaction绘制一个并列,我们需要将它与某些东西进行比较。正常交易期间的网络活动如下。 3次网络旅行-enslist事务,发送一些SQL,提交。

对于XA事务,这是一个更复杂的想法。如果我们有2个参与者。 我们在事务2网络旅行中招募资源。然后我们发送准备消息另外2次旅行,然后我们提交另外2次旅行。

2个资源发生的实际网络活动越多,您参与交易的参与者就越多。

关于如何快速获得分布式交易的结论

  • 要做到这一点,您需要确保拥有一个具有最小延迟的快速网络
  • 确保您拥有最小延迟和最大随机写入速度的硬盘驱动器。一个好的SSD可以创造奇迹。 - 尝试尽可能减少事务中的分布式资源
  • 尝试将数据划分为对一致性和可用性(实时数据)具有强烈要求的数据以及具有低一致性要求的数据。实时数据使用分布式事务。对于离线数据,请使用正常交易,如果您的数据不需要,则不使用交易。

我的回答是基于我在“ XA暴露”(以及个人经历)中所读到的内容,该内容已经在互联网上不再可用,这引发了我的写作。