挑战:银行的主动复制?
Challenge: Active Replication for Bank?
我对主动复制和排序有疑问。我知道分布式系统中的传统主动复制需要完全排序才能将请求传播到副本,但是,我想到了一个可能没有必要的例子。
想象一下使用主动复制的银行账户系统。但是,您不能从您的帐户中扣除,而只能记入您的帐户(因此只能将正数添加到您的余额中)。那么银行系统是否需要订购担保?考虑到如果我要在我的帐户中添加 5 英镑然后 10 英镑,如果副本没有按顺序收到这个,无论他们收到请求的顺序如何,它仍然会达到 15 英镑。不会出现真正的冲突对于订购,部分原因是当用户先存入 10 英镑时,看到他们的帐户中只有 5 英镑时,用户可能会有点生气。但从技术上讲,问题出在哪里?
我想我错了,但不明白为什么。有人可以更详细地向我解释一下吗?
是的,加法是结合的。这意味着添加的任何顺序都将产生相同的值。设置值通常需要总排序,但增量不需要。但是,增量需要恰好一次交付。如果该增量到达两次,因为发送者没有意识到接收者收到了它,那么您只是给了某人 10 英镑自己的钱。将帐户余额设置为精确值对排序敏感,但对重试不敏感。
银行的问题是您通常需要持有其他一些正确性保证,例如任何账户的账户余额永远不会为负数。如果您将钱存入和存出帐户中的两个字段彼此相邻,通过简单地按照您描述的方式工作而另一个仅存储减法,您将能够处理将钱存入和支付帐户。不过,现在顺序很重要,因为您可以先进行所有减法运算,然后再进行加法运算。或者所有的加法,然后你在减法同步之前用这笔钱支付,现在你已经透支了你的账户。
我有三点建议:第一,如果可以避免,不要开发处理金钱的软件。错误是非常昂贵的。其次,除非你真的需要,否则不要设计分布式系统。第三,如果必须,存储交易而不是帐户,并使用 UUID。 Alice sent £8 to Bob (roughly on January 22).
这是一种叫做 CRDT 的东西,它可以处理重复项,并且通常可以处理任意排序。
我对主动复制和排序有疑问。我知道分布式系统中的传统主动复制需要完全排序才能将请求传播到副本,但是,我想到了一个可能没有必要的例子。
想象一下使用主动复制的银行账户系统。但是,您不能从您的帐户中扣除,而只能记入您的帐户(因此只能将正数添加到您的余额中)。那么银行系统是否需要订购担保?考虑到如果我要在我的帐户中添加 5 英镑然后 10 英镑,如果副本没有按顺序收到这个,无论他们收到请求的顺序如何,它仍然会达到 15 英镑。不会出现真正的冲突对于订购,部分原因是当用户先存入 10 英镑时,看到他们的帐户中只有 5 英镑时,用户可能会有点生气。但从技术上讲,问题出在哪里?
我想我错了,但不明白为什么。有人可以更详细地向我解释一下吗?
是的,加法是结合的。这意味着添加的任何顺序都将产生相同的值。设置值通常需要总排序,但增量不需要。但是,增量需要恰好一次交付。如果该增量到达两次,因为发送者没有意识到接收者收到了它,那么您只是给了某人 10 英镑自己的钱。将帐户余额设置为精确值对排序敏感,但对重试不敏感。
银行的问题是您通常需要持有其他一些正确性保证,例如任何账户的账户余额永远不会为负数。如果您将钱存入和存出帐户中的两个字段彼此相邻,通过简单地按照您描述的方式工作而另一个仅存储减法,您将能够处理将钱存入和支付帐户。不过,现在顺序很重要,因为您可以先进行所有减法运算,然后再进行加法运算。或者所有的加法,然后你在减法同步之前用这笔钱支付,现在你已经透支了你的账户。
我有三点建议:第一,如果可以避免,不要开发处理金钱的软件。错误是非常昂贵的。其次,除非你真的需要,否则不要设计分布式系统。第三,如果必须,存储交易而不是帐户,并使用 UUID。 Alice sent £8 to Bob (roughly on January 22).
这是一种叫做 CRDT 的东西,它可以处理重复项,并且通常可以处理任意排序。