Events 如何在分散的事件源数据库中处理一致性?

Events 如何在分散的事件源数据库中处理一致性?,events,event-sourcing,distributed-system,consensus,Events,Event Sourcing,Distributed System,Consensus,假设我有一个X服务器的动态网络(不是随时间固定的),在一个只附加的数据库中有一个相同的所有事件副本。现在,我想支持在这10台服务器中的任何一台上创建新事件,让它们达成共识,复制事件,并以完全相同的事件顺序产生所有结果。我知道这是一个常见的问题,有一些算法应该能够处理类似的事情。但我并没有完全理解它们,我有一些关于共识的问题,特别是关于活动来源的问题 我假设一个服务器永远不能完全确定它认为它已经达成共识的值到底是什么才是“正确”的值?我这样做是基于这样一个事实,即新服务器可以随时加入到网络中,并将

假设我有一个X服务器的动态网络(不是随时间固定的),在一个只附加的数据库中有一个相同的所有事件副本。现在,我想支持在这10台服务器中的任何一台上创建新事件,让它们达成共识,复制事件,并以完全相同的事件顺序产生所有结果。我知道这是一个常见的问题,有一些算法应该能够处理类似的事情。但我并没有完全理解它们,我有一些关于共识的问题,特别是关于活动来源的问题

我假设一个服务器永远不能完全确定它认为它已经达成共识的值到底是什么才是“正确”的值?我这样做是基于这样一个事实,即新服务器可以随时加入到网络中,并将平衡点转向另一个值。这也有可能在很久以后发生。但在这种情况下,服务器应该如何处理新的“正确”值?在事件源中,添加补偿事件以进行更正是正常的,但这些补偿事件是否也必须复制到所有服务器?为了确保所有服务器都有完全相同的事件,我的意思是

如果不添加补偿事件,而只是“弹出”已提交的事件,我想我们就不必复制这些事件,但这样我们就会遇到其他问题。如果(错误地)提交的事件通过事件总线发送出去,以便其他服务能够对它们做出反应,那么我们不能从事件数据库中弹出它们,而不会把事情搞砸


或者,一旦在很短的时间内达成共识,就真的承诺一个价值观更好吗?然后冷淡地对待所有新的/过时的服务器?让他们接受结果?如果新服务器连接到比第一个服务器更大的自己的网络,并且他们都对另一个值达成了一致意见,该怎么办?

我不知道您对分布式系统有什么背景,但已经有了一致的算法(例如Raft、Paxos、Viewstamped复制等)处理在不影响已提交事件的情况下从群集中添加和删除服务器的操作

通常,在大多数人提交事件之前,您不会应用这些事件,特别是因为(正如您所提到的)一些应用的事件将具有外部可见性(例如,您从ATM机上释放500美元)。因此,为了让服务器应用事件,它必须知道事件已经提交。此外,当服务器添加到系统中时,它们必须与已提交的事件一起更新,,并且它们不能选择不同的值。如果他们可以选择不同的值,系统将不再提供安全性。我建议你读一下报纸。Raft是一种可能适用于您的共识算法,该算法并不难理解。Raft专门负责添加和删除服务器(参见第6节)。您还可以使用Raft的一个实现


还有其他支持弱一致性和撤消操作的算法,例如。您选择的算法最终取决于应用程序的需要。

我将研究特定的聚合流。在事件源系统中,您需要任何给定聚合的事件流的一致性。这意味着给定聚合的所有命令都应该转到事件流的同一“主”副本。你不需要在不同的集合之间有太多的一致性。因此,在任何给定聚合的10个服务器中,一个应该包含一个主事件流。我可能看起来很奇怪,但我正在试图找出如何拥有多个写端(没有主写端)并处理事件顺序的一致性(以及接受或拒绝哪些命令)。您对可用性、分区容差和一致性有何要求?听起来你想要一个具有最终一致性的AP系统(比如CouchDB),但是你需要对你的需求一清二楚,否则你就不知道可以使用哪些算法(或者算法理论上是否存在)。如果你想要一个CP系统,那么Raft可能是你最好的选择(注意Raft,所有的书写都必须经过选举产生的领导人)。谢谢,我应该试试Raft。@AndreasZita:请不要试图重新实现共识算法。它们都很难得到正确的结果,重用现有的实现。有没有一个原因让你不能仅仅使用etcd或数据库来解决这个问题?这有什么乐趣我想通过自己解决它来学习。