我正在看两个场景:A没关系,B不确定。
方案A:在提交之后,在分派之前模拟应用程序重新启动
在步骤5中再次发送De commited事件。这很好,我也在调度程序代码中看到了这一点。
场景B:模拟总线错误
在这种情况下,我找不到行为,也想知道它是否是一个有效的案例: 只有在总线代码中存在错误时才会发生这种情况。
是否有触发器将重试发送或我是否需要编写代码来处理此问题或者我的推理错误?
答案 0 :(得分:7)
您对方案A的评估是正确的,在应用程序或机器重启/进程终止等故障情况下,当进程再次启动时,它将发现未分配的提交并将它们推送给调度程序。
情景B有点棘手。问题是EventStore不是总线,因此如何处理总线错误的问题不是EventStore本身无法处理的问题。此外,因为有许多总线实现,我不想将EventStore耦合到任何特定的实现。有些用户甚至可能不使用消息总线;他们可能会决定使用RPC调用。
您真正拥有的问题是,如何处理总线故障 - 以及扩展,队列故障? EventStore有一个接口IPublishCommits。当事件提交时,它会被推送到调度员。调度员只需负责将事件标记为在IPublishCommits实施后正确处理并成功处理后发送。
处理瞬态总线和队列故障的最佳方法是在IPublishCommits实现中实现断路器模式,该模式将重试,直到事情再次开始工作。对于更大的问题,例如序列化失败,您可能希望记录某种会立即通知管理员的严重故障。同样,所有这一切中的棘手问题是EventStore无法了解您的具体情况。