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

时间:2015-02-22 11:42:07

标签: database transactions message-queue acid eventual-consistency

article on BASE as an ACID alternative中,Dan Pritchett提出了一个选项,用于解耦跨越两个表的事务, Transaction 表(例如买/卖交易)和用户表:

  

enter image description here

     

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

丹还表示这种方法存在问题:

  

消息持久性在事务主机上以避免2PC   在排队期间。如果消息在事务内出列   涉及用户主机,我们仍然有2PC情况。

     

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

我假设消息传递是持久消息传递,因此保证了传递。在这种情况下,我希望Dequeue操作对Queue操作没有影响,从而完全解耦 Transaction User 表的更新,从而避免这两者之间的2PC表?会有2PC,但那将是:

  • 2PC边界1:

    • 插入交易表格和
    • 插入消息队列消息持久性表
  • 2PC边界2:

    • 更新用户表格和
    • 从邮件队列持久性表中删除邮件

是否有人能够澄清我在想错的地方?

1 个答案:

答案 0 :(得分:1)

  

将有2PC,但那将是:

TL; DR :您对这两个交易是正确的,但第一个是不是 2PC,而第二个是。这就是图5所描述的。 2PC是为什么"我们仍然有2PC情况"。


这篇文章有一些困难。 transaction表与数据库事务无关,应调用purchases。 "持久队列"只是一个表示更改队列的表。此外,它不断提出非解决方案有问题"。

使用BASE的提议涉及用两个表user_less_deltadelta替换用户表,这两个表一起提供与user相同的信息。 (然后它使用" user"但user_less_delta但我会使用不同的名称。)但delta保留在{{1}的主机上}}。也就是说它不需要2PC来实现涉及purchases purchases的交易,但需要2PC来实现涉及deltauser_less_delta的交易。

图5 BASE松弛是原子地交易(不含2PC)deltapurchases然后分别原子地2PC交换deltauser_less_delta的各种变化。这样,我们就不必每次更新delta user_less_deltapurchasesuser_less_delta不会像user那样准确。然而,这仍然假定 使用user_less_delta更新delta的2PC。

我不知道你的意思是"边界"。 (其他语言如"持久性消息传递"也不清楚。)但有两种交易:purchases上的非2PC交易delta和{{1}上的2PC交易与user_less_delta

  丹还表示这种方法存在问题:

     
    

消息持久性在事务主机上,以避免在排队期间出现2PC。如果消息在涉及用户主机的事务中出列,我们仍然有2PC情况。

  

"问题"有了这个解决方案,还有2PC参与其中。 "如果"应该只是"因为"因为否则代码不能正确实现分布式表。由于消息在涉及用户主机的事务中出列,我们仍然有2PC情况。

该文章继续(据称)删除2PC,delta反映在delta没有2PC,但是user_less_delta反映在user_less_delta没有2PC另一个。已经处理的delta中的更改将被忽略。 (等等!我还没读过那么远!现在我已经知道了,那就是他们的建议。)

(基本上每个分布式网站尝试更新并确认另一个网站,并且收到确认后会提升其已确认的内容和尚未确认的内容。一种红色女王&#39 ;比赛结束2PC。)