我们使用Cirqus作为事件存储库(在SQL Server中),但我们的观点是在RavenDb中手工制作的(通过自定义IEventDispatcher处理调度的事件)。
当由于某种原因调度事件的一个处理程序失败时,就会出现问题。在这种情况下,事件已提交到存储区,但"视图"与事件存储区中的内容不同步。在我们的例子中,这成为一个问题。
处理这种情况并"摆脱"不匹配的最佳方法是什么?注意:在分布式事务中登记整个操作(通过事务范围)是不可能的。
我们使用的是 0.41.0,如果可能,我们希望避免更新。
我喜欢你说你不想在交易中登记所有内容 - 既是因为这样做不容易,但主要是因为我认为这没有意义。
在我看来,域不应该依赖于任何视图的追赶能力。我认为您当然应该非常小心地编写视图,以便它们不会失败,但是如果其中一个视图失败,它能做的最好的事情就是将其记录为错误(或以其他方式传达它已失败)并停止处理事件。
使用 Cirqus 开箱即用的视图管理器(由 ViewManagerEventDispatcher
托管的视图管理器)处理此问题的方式只是在发生故障时停止事件处理。然后,如果故障是暂时性的,则视图将在故障结束时自动恢复处理事件。
这样,视图将永远不会错过处理任何事件。但是你应该小心地写下你的观点,这样它们就不太可能失败了。