但是为了最大限度地提高写入性能,我想最好允许 多个写入同时进行。但是如何在这样的系统中处理一致性和共识?
在事件源系统中,写入侧的一致性总是很强。这通过使用乐观锁定由聚合和Event store
强制执行:在并发写入的情况下(实际上事件仅附加到商店),则重试孔命令。这是可能的,因为聚合命令方法是纯粹的(无副作用)方法。只要事件没有持续下去,命令就可以重试。
当两台或多台计算机在同一时间更新状态( 一个选择和坚持它?)
两个。第一个(总是有第一个)命令生成持久存储到该商店的事件。 secons命令由于低级别的conception异常而失败。然后通过加载+应用所有以前的事件重试,包括由第一个命令生成的事件。然后,第二个命令会生成也会持续存在的事件事件,如果新状态不允许处理第二个命令,则会引发异常。
您必须注意,第二个命令至少执行两次,但每次前面的事件(因此状态)都不相同。
基础架构将聚合版本附加到每个聚合流。每个事件附加增加此版本。聚合ID和版本有一个唯一的约束。这可能是所有活动商店的实施方式。
当一台机器行为不端(不知不觉,或故意),并传播 故障事件给网络的其余部分(如何检测呢?)
我不明白这是怎么发生,但如果它正在发生,那么它真的取决于你对故障事件的理解。您可以让一些Sagas/Process经理分析事件并触发一些发送给某种监督员的电子邮件。
感谢您的回答。我看到如何使用乐观锁定,当有一个单一的写入端。但是如果在不同的机器上有多个写方(没有一个公共数据库),他们会以某种方式必须同意要处理的命令。乐观锁定可以在一台机器上并发写入,但是如何处理扩展系统中的并发写入? –
@AndreasZita没有一个共同的数据库,我不认为这是可能的。但是,使用通用数据库,您可以使用“Aggregate ID”进行分片。通过这种方式,您可以最小化共同写入的概率。 –