【问题标题】:How to handle projection errors by event sourcing and CQRS?如何通过事件溯源和 CQRS 处理投影错误?
【发布时间】:2014-11-19 17:20:27
【问题描述】:
我想使用事件溯源和 CQRS,因此我需要预测(我希望我使用正确的术语)来更新我的查询数据库。如何处理数据库错误?
例如,我的一个查询缓存数据库不可用,但我已经更新了其他数据库。因此,当它恢复业务时,不可用的数据库将不会与其他数据库同步。它如何知道它必须运行例如来自事件存储的最后 10 个域事件?我想我必须存储有关数据库当前状态的信息,但是如果该数据库状态存储失败怎么办?任何想法,最佳实践如何解决此类问题?
【问题讨论】:
标签:
domain-driven-design
cqrs
event-sourcing
【解决方案1】:
在任何一种情况下,您都必须告诉您的消息总线处理失败,它应该稍后重新传递事件,希望数据库届时能够重新联机。这就是我们使用具有“至少一次”交付保证的消息总线系统的本质原因。
对于事务查询数据库,您当然也应该回滚事务。如果您的查询数据库不支持事务,您必须确保在应用程序端更新是幂等的 - 即,如果您的事件在下一次交付尝试时到达,您的投影代码和/或数据库必须设计为重复处理事件不会损害数据库的状态。这有时是微不足道的(例如,当事件导致投影中更改人名时),但通常不是那么简单(例如,当投影只是增加视图计数时)。但这就是您在使用非事务性数据库时要付出的代价。