inf*_*rno 1 domain-driven-design cqrs event-sourcing
我想使用事件源和 CQRS,所以我需要投影(我希望我使用正确的术语)来更新我的查询数据库。如何处理数据库错误?
例如,我的一个查询缓存数据库不可用,但我已经更新了其他数据库。因此,当它恢复业务时,不可用的数据库将不会与其他数据库处于 snyc 中。它如何知道它必须运行例如来自事件存储的最后 10 个域事件?我想我必须存储有关数据库当前状态的信息,但是如果该数据库状态存储失败怎么办?任何想法,最佳实践如何解决此类问题?
在任何一种情况下,您都必须告诉您的消息总线处理失败,它应该稍后重新传递事件,希望数据库届时会重新联机。这就是我们使用具有“至少一次”交付保证的消息总线系统的根本原因。
对于事务查询数据库,当然也应该回滚事务。如果您的查询数据库不支持事务,您必须在应用程序端确保更新是幂等的 - 即,如果您的事件在下一次交付尝试时到达,您的投影代码和/或数据库必须设计为使得事件的重复处理不会损害数据库的状态。这有时是微不足道的(例如,当事件导致投影中人名发生变化时),但通常不是那么微不足道(例如,当投影只是增加观看次数时)。但这是您在使用非事务性数据库时支付的费用。