使用消息队列将事务更新分离到两个系统?

Using message queuing to decouple transactional updates to two systems?

article on BASE as an ACID alternative 中,Dan Pritchett 提出了一种解耦跨越两个 table 的事务的选项,Transaction table(例如 Buy/Sell 事务)和 用户 table:

Source: http://queue.acm.org/detail.cfm?id=1394128

Dan 也认为这种方法存在问题:

The message persistence is on the transaction host to avoid a 2PC during queuing. If the message is dequeued inside a transaction involving the user host, we still have a 2PC situation.

Source: http://queue.acm.org/detail.cfm?id=1394128

我假设消息传递是持久消息传递,因此可以保证传递。在这种情况下,我希望 Dequeue 操作对 Queue 操作没有影响,从而完全解耦 TransactionUser tables 从而避免在这两个 tables 之间使用 2PC?将有 2PC,但那将是:

谁能说清楚我哪里想错了?

There will be 2PC, but that will be:

TL;DR:您对两笔交易的看法是正确的,但第一笔交易是 not 2PC,而第二笔交易是。这就是图 5 所描述的。 2PC 就是为什么 "we still have a 2PC situation".


这篇文章有一些困难。 transaction table 与数据库事务无关,应称为 purchases。 "persistent queue" 只是一个 table,表示更改队列。此外,它不断提出具有 "problems".

非解决方案

使用 BASE 的提议涉及用两个 table 的 user_less_deltadelta 替换用户 table,它们一起提供与 user 相同的信息. (然后它使用“user”代替 user_less_delta,但我将使用单独的名称。)但是 deltapurchases 一起保留在主机上。也就是说,它不需要 2PC 来实现涉及 purchasesdelta 的交易,但确实需要 2PC 来实现涉及 user_less_deltadelta 的交易。

Fig 5 BASE 放宽是用 delta 原子地处理(没有 2PC)purchases,然后用 delta 分别原子地用 2PC 处理对 user_less_delta 的各种变化。这使我们不必每次更新到 user_less_deltapurchases 都进行 2PC,但代价是 user_less_delta 不如 user 准确。然而,这仍然假设 2PCs 更新 user_less_deltadelta.

我不知道你所说的 "boundary" 是什么意思。 (其他语言如"persistent messaging"也不清楚。)但是有两种交易:purchases上的非2PC交易和deltauser_less_delta上的2PC交易delta.

Dan also suggests that there is a problem with this approach:

The message persistence is on the transaction host to avoid a 2PC during queuing. If the message is dequeued inside a transaction involving the user host, we still have a 2PC situation.

此解决方案的 "problem" 是仍然涉及 2PC。 "If" 应该只是 "Since",否则代码无法正确实现分布式 table。由于消息在涉及用户主机的事务中出队,我们仍然有 2PC 的情况。

这篇文章继续(据称)删除了 2PC,方法是 delta 以一种速率反映在 user_less_delta 而没有 2PC 但 user_less_delta 反映在 delta 没有2PC 在另一个。 delta 中已处理的更改将被忽略。 (等等!我还没读到那么远!好吧,现在我已经读完了,这就是他们的建议。)

(基本上每个分布式站点 尝试 更新和确认另一个站点,并且在收到确认后会推进其已确认和尚未确认的版本。一种红皇后完成 2PC 的比赛。)