在尝试处理命令时,我偶尔会在Circus中收到异常。它发生在不同类型的命令中,但它总是发生在这个特定的聚合根类型(比如说它是一个注册表)中。我们没有删除事件,也没有以任何方式破坏事件表,所以我想知道还有什么原因会导致这个问题。
确切的(但匿名的)错误消息是:Tried to apply event with sequence number 12 to aggregate root of type RegistrationForm with ID d863ac79-6bc0-480d-9d83-30b7696e7ea1 with current sequence number -1. Expected an event with sequence number 0.
例如,为了调试异常的最新实例,我在数据库中查询了这个聚合id,并得到了37个事件的返回。然后我检查了序列,序列似乎是正确的。我还检查了全局序列至少在时间上也是正确的。然后我检查了一下"meta"列是否有一个与记录不同的全局序列,但也检查出了OK
我发现最令人困惑的是,其他登记表都可以通过。查看我们的日志,我无法识别任何模式,而且这种情况只发生在3-5%的时间内。
我想我想知道的是:是什么导致了这个问题?如何调试它?我该如何防止它在将来发生?
系统细节:我们在.net 4.5下运行,使用Cirqus 0.63.12(然后也在0.66.4上测试),使用Postgres 9.4作为数据库(使用Cirqs.Postgres包的v0.63.12)。
我发现了问题!PostgreSQL事件源的SQL代码似乎缺少一个Order By
子句,在某些情况下,我的事件被无序返回。我提交了此拉取请求,作为对该问题的建议解决方案:https://github.com/d60/Cirqus/pull/75