当前位置: 首页 > 知识库问答 >
问题:

如何通过事件源和CQRS处理投影错误?

季炯
2023-03-14

我想使用事件源和CQRS,所以我需要预测(我希望我使用的是正确的术语)来更新我的查询数据库。如何处理数据库错误?

例如,我的一个查询缓存数据库不可用,但我已经更新了其他数据库。因此,当snyc回到业务中时,不可用的数据库将不会与其他数据库一起在snyc中。它如何知道它必须运行例如事件存储中的最后10个域事件?我想我必须存储有关数据库当前状态的信息,但是如果数据库状态存储失败怎么办?有什么想法,最佳实践如何解决这类问题?

共有1个答案

熊锐进
2023-03-14

在任何一种情况下,您都必须告诉消息传递总线处理失败,它应该稍后重新传递事件,希望届时数据库将恢复联机。这就是为什么我们使用带有“至少一次”传递保证的消息总线系统的本质原因。

当然,对于事务性查询数据库,还应该回滚事务。如果查询数据库不支持事务,则必须在应用程序端确保更新是幂等的--也就是说,如果您的事件是在下一次交付尝试时到达的,则必须设计投影代码和/或数据库,以便对事件的重复处理不会损害数据库的状态。这有时是微不足道的(例如,当事件导致投影中的人名发生改变时),但通常不是那么微不足道(例如,当投影只是增加视图计数时)。但当您使用非事务性数据库时,这就是您需要支付的费用。

 类似资料:
  • 所以我的问题是,这样的错误是否应该以一种帐目分类帐的方式来“解决”,即通过发送一个新的“反转”命令,然后以这样一种方式传播到预测,使失败的事件现在得到解决? 例如,假设我们有一个更新客户信用的命令。发布事件,一个投影更新其“总信用”统计信息,另一个投影将更新发布到某个用于UI的websocket,最后,另一个投影维护信用状态--最后一个处理程序失败。我们是否应该发送一个命令来回滚业务事务,并再次扣

  • 我开始阅读与CQRS相结合的事件源模式。据我所知,CQRS模式是一种将写操作和读操作分开的模式。事件源是一种模式,系统中的一切都由触发事件的命令启动。事件源模式需要一个事件总线。有几件事我没弄明白。 事件存储区包含发生在某个实体上的所有事件。如果我想查询这个实体的当前状态,我需要查询发生在这个实体上的所有事件,并重新创建它的当前状态。 所有事件历史记录都在事件存储区中。 为什么我不能有一个负责将每

  • 很明显,基于这些模式的系统是易于扩展的。但我想问你,具体怎么做?关于可伸缩性,我没有什么问题: 如何缩放聚合体?如果我将创建

  • 我想创建一个CQRS和事件源架构,非常便宜,非常灵活,非常简单。 我想确保事件永远不会失败,至少到达发布者/事件存储,永远,因为这是业务所在。 天蓝 有了azure,我似乎不知道该用什么。 Azure服务总线 蔚蓝函数 Azure webjob(我想这可以用Azure函数代替) ??(还有什么我忘了或者不知道的?) null 你的经验说明了什么? 其他替代方案呢?(例如:)?

  • 我在CQRS/ES设计中有一个计时案例。为了便于讨论,让我们以Microsoft关于这个主题的示例会议管理为基础(https://msdn.microsoft.com/en-us/library/jj554200.aspx)。 假设在第1分钟创建会议(最大座位数为20)。 在第4分钟,事件到达order mgmt上下文,因此创建了一个座位可用性。 在第7分钟,用户下了一个订单(通过订单管理),购买

  • 我得到了错误,当我创建角2应用程序。我按照链接创建示例应用程序 我有以下错误, 我有这样的npm日志, 我如何解决这个问题?