挑战:银行的主动复制?

时间:2016-04-20 14:48:01

标签: transactions replication distributed distributed-transactions

我对主动复制和排序有疑问。我知道传统上在分布式系统中进行主动复制需要按顺序将请求传播到副本,但是,我想到了一个可能没有必要的例子。

使用主动复制功能构建银行帐户系统。但是,您无需从您的帐户中扣款,您只能将您的帐户存入您的帐户(因此只能为您的余额添加正数)。那么银行系统是否需要订购保证?考虑到我是否要为我的帐户添加5英镑然后10英镑,如果副本没有按顺序收到,那么无论他们收到请求的顺序如何,它仍然会达到15英镑。没有可能出现的真正冲突对于订购,一部分事实上,用户可能有点恼火,看到他们的帐户只有5英镑,当他们先贷款10英镑。但从技术上讲,问题出在哪里?

我想我错了,但不能真正理解为什么。有人能够更详细地向我解释一下吗?

1 个答案:

答案 0 :(得分:0)

是的,添加是关联的。这意味着任何添加顺序都将产生相同的值。设置值通常需要总排序,但增量不需要。但是,增量只需要一次交付。如果这个增量到达两次,因为发送者没有意识到接收者得到了它,你只需要给自己10英镑的钱。将帐户余额设置为精确值对订购很敏感,但不会重试。

银行的问题在于您通常需要保留一些其他正确性保证,例如任何帐户的帐户余额永远不会为负数。如果您将资金存入两个字段中的帐户并从中存入资金,只需按照您的描述工作,而另一个只存储减法,您就可以处理将资金插入和支付帐户。但是,顺序现在很重要,因为你可以先获得所有减法,然后再添加。或者所有添加内容,然后您在减法同步之前使用该钱支付,现在您已透支了您的帐户。

我有三条建议:首先,如果可以避免,不要建立软件处理资金。臭虫非常昂贵。其次,除非你真的需要,否则不要设计分布式系统。第三,如果必须,存储事务而不是帐户,并使用UUID。 Alice sent £8 to Bob (roughly on January 22).这是一种称为CRDT的东西,它处理重复项,并且经常处理任意排序。