使用消息队列将事务更新分离到两个系统?
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:
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.
我假设消息传递是持久消息传递,因此可以保证传递。在这种情况下,我希望 Dequeue 操作对 Queue 操作没有影响,从而完全解耦 Transaction 和 User tables 从而避免在这两个 tables 之间使用 2PC?将有 2PC,但那将是:
2PC边界1:
- 插入到交易 table AND
- 插入消息队列消息持久化table
2PC边界2:
- 更新用户 table AND
- 从消息队列持久性中删除消息table
谁能说清楚我哪里想错了?
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_delta
和 delta
替换用户 table,它们一起提供与 user
相同的信息. (然后它使用“user
”代替 user_less_delta
,但我将使用单独的名称。)但是 delta
与 purchases
一起保留在主机上。也就是说,它不需要 2PC 来实现涉及 purchases
和 delta
的交易,但确实需要 2PC 来实现涉及 user_less_delta
和 delta
的交易。
Fig 5 BASE 放宽是用 delta
原子地处理(没有 2PC)purchases
,然后用 delta
分别原子地用 2PC 处理对 user_less_delta
的各种变化。这使我们不必每次更新到 user_less_delta
和 purchases
都进行 2PC,但代价是 user_less_delta
不如 user
准确。然而,这仍然假设
2PCs 更新 user_less_delta
与 delta
.
我不知道你所说的 "boundary" 是什么意思。 (其他语言如"persistent messaging"也不清楚。)但是有两种交易:purchases
上的非2PC交易和delta
和user_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 的比赛。)
在 article on BASE as an ACID alternative 中,Dan Pritchett 提出了一种解耦跨越两个 table 的事务的选项,Transaction table(例如 Buy/Sell 事务)和 用户 table:
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.
我假设消息传递是持久消息传递,因此可以保证传递。在这种情况下,我希望 Dequeue 操作对 Queue 操作没有影响,从而完全解耦 Transaction 和 User tables 从而避免在这两个 tables 之间使用 2PC?将有 2PC,但那将是:
2PC边界1:
- 插入到交易 table AND
- 插入消息队列消息持久化table
2PC边界2:
- 更新用户 table AND
- 从消息队列持久性中删除消息table
谁能说清楚我哪里想错了?
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_delta
和 delta
替换用户 table,它们一起提供与 user
相同的信息. (然后它使用“user
”代替 user_less_delta
,但我将使用单独的名称。)但是 delta
与 purchases
一起保留在主机上。也就是说,它不需要 2PC 来实现涉及 purchases
和 delta
的交易,但确实需要 2PC 来实现涉及 user_less_delta
和 delta
的交易。
Fig 5 BASE 放宽是用 delta
原子地处理(没有 2PC)purchases
,然后用 delta
分别原子地用 2PC 处理对 user_less_delta
的各种变化。这使我们不必每次更新到 user_less_delta
和 purchases
都进行 2PC,但代价是 user_less_delta
不如 user
准确。然而,这仍然假设
2PCs 更新 user_less_delta
与 delta
.
我不知道你所说的 "boundary" 是什么意思。 (其他语言如"persistent messaging"也不清楚。)但是有两种交易:purchases
上的非2PC交易和delta
和user_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 的比赛。)