如何通过事件采购和CQRS处理投影错误?
问题描述:
我想使用事件采购和CQRS,所以我需要投影(我希望我使用适当的术语)来更新我的查询数据库。我如何处理数据库错误?如何通过事件采购和CQRS处理投影错误?
例如我的一个查询缓存数据库不可用,但我已经更新了其他的数据库。因此,不可用的数据库在业务恢复时不会与其他人无关。它如何知道它必须运行事件存储中的最后10个域事件?我想我必须存储有关数据库当前状态的信息,但是如果数据库状态存储失败呢?任何想法,最佳实践如何解决这类问题?
答
在任何一种情况下,您都必须告诉您的消息传递总线,处理失败,并且应该稍后重新传递事件,以便数据库将在此时重新联机。这就是为什么我们使用“至少一次”交付保证的消息总线系统。
对于事务性查询数据库,您当然也应该回滚事务。如果您的查询数据库不支持事务处理,则必须确保在应用程序方面更新具有幂等性 - 即,如果您的事件在下一次投递尝试时到达,则必须设计投影代码和/或数据库,使得重复处理事件不会损害数据库的状态。这有时很容易实现(例如,当事件导致投影中的人名改变时),但通常并不那么平凡(例如,当投影简单地增加视图计数时)。但是,当你使用非事务数据库时,这是你付出的代价。