首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在分布式事务系统中使用事务历史而不是平衡

在分布式事务系统中使用事务历史而不是平衡
EN

Stack Overflow用户
提问于 2017-11-05 14:06:49
回答 1查看 38关注 0票数 1

前言

帽定理指出,我们不可能有严格一致和可用的分布式系统。对于交易系统(例如某些支付系统),一致性通常优于可用性,因为我们不能容忍金钱被“创造”或“被破坏”的情况。

示例

A和B都想把10美元转帐给C。C的初始余额是15美元。如果A和B同时读取C的当前余额,加上10美元,C将是25美元,但它应该是35美元(15+10+10)。

问题

使用事务历史和计算当前余额而不是存储余额是一种良好的实践吗?这种方法的利弊是什么?

我读到了一些关于一致性和分布式系统的资料,但是我还没有发现任何关于这方面的信息。

思考

优点:

  1. “创造”/“毁灭”货币是不可能的。
  2. 不需要与其他节点同步才能提交事务。

缺点:

  1. 透支是可能的。
  2. 为了显示平衡,可能需要更多的计算。虽然它可以通过缓存平衡过去的某个点来减轻。

所以在我看来,这样的系统在一致性和可用性之间是一种中间点.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-05 14:29:05

您所描述的内容更正式地称为操作CRDT

是的,它可以起作用,就像执行突变操作一样。一般来说,这种方法有几个缺点。

第一种是操作不是幂等的(因为在您的示例中,您正在将差异/增量应用于一个平衡,而不是设置一个平衡)。

第二,由于系统的正常运行时间更长,因此变化的增量将累积。如果在任何时候,一个新的参与者想要意识到你所指的平衡,他们需要阅读所有的历史并重新计算当前的余额。如果您正在处理大量的更改,这可能是一个问题。

为了避免这种情况,通常会进行某种形式的快照。然而,由于第三点的原因,这可能很难建立。

第三,你的系统不会在任何时候保证你的参与者对平衡的看法是一致的。

现在,根据您想要做的事情,我可以想出一些解决方案来解决这些问题。

例如,您可以为每个更新提供一个标识符(UUID)。这将给您一定程度的信心,您的更新可以应用到幂等。然后,标识符也可以用作快照的一种方式(例如,在id X为1000之前,所有的平衡)。然后,网络中的新参与者只需阅读操作历史记录,直到最后一次快照。

但是,快照创建将是一个有问题的过程,因为您的系统:所有参与者都必须同意,直到X的平衡是有价值的。此时,您可能会发现有些参与者错过了历史片段,而不仅仅是最新的更新,因此必须重新同步它们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47122468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档