我想使用事件源和CQRS,因此我需要预测(我希望使用正确的术语)来更新我的查询数据库。我该如何处理数据库错误?
例如,我的一个查询缓存数据库不可用,但我已经更新了其他数据库。因此,当它恢复业务时,不可用的数据库将不会与其他数据库紧密相连。如何知道它必须运行事件存储中的最后10个域事件?我想我必须存储有关数据库当前状态的信息,但是如果该数据库状态存储失败怎么办?任何想法,最佳实践如何解决这类问题?
答案 0 :(得分:3)
在任何一种情况下,您都必须告诉您的消息传递总线处理失败,并且应该稍后重新启动该事件,希望数据库将重新联机。这就是为什么我们使用带有"至少一次" - 交付保证的消息总线系统。
对于事务查询数据库,您当然也应该回滚事务。如果您的查询数据库不支持事务,则必须在应用程序端确保更新是幂等的 - 即,如果您的事件在下次传递尝试时到达,则您的投影代码和/或数据库必须设计为使得重复处理事件不会损害数据库的状态。这有时是微不足道的(例如,当事件在投影中导致改变的人的名字时),但通常不是那么简单(例如,当投影简单地增加视图计数时)。但这是您在使用非事务性数据库时所支付的费用。