事件溯源,处理同一事件时两个服务之间的冲突

Event Sourcing, Conflict between two services in processing same event

我开始学习事件溯源和 CQRS,但我没有做对。

如果我有两个服务都以不同的方式处理同一个事件(例如在预订示例中,一个服务检查时间段而另一个检查用户信用),并且其中一个接受事件而另一个不接受't,系统要做什么?

服务应该如何知道其他服务是否接受或拒绝了事件?

在较高层次上:当您拥有分布式系统时,系统中的不同组件通过传递消息来共享信息。当您的日程安排服务想让您知道您请求的时间段已为您保留时,它会通过向您发送消息来实现。

当您想了解其他地方发生的事情时,您可以查看收到的消息。

How should the services know if other services have accepted or declined the event?

需要了解的一件重要事情是,服务永远不应 下降 事件。 ApprovalRequested描述的是已经发生的事情,订阅服务不能让它不发生。

通常会发生的情况是,订阅者将接收 ApprovalRequested、更新自己的本地数据,然后根据需要发出 ApprovalGrantedApprovalDeclined

在您的情况下,您有一个订阅者将发出对时间段的批准或拒绝,另一个订阅者将发出对信用检查的批准或拒绝。

在其他地方,我们有一个状态机,它正在记录所有这些事件以了解预订是否成功。

Rinat Abdullin 关于 process managers 的文章可能有所帮助。

据我所知,这些处理器中的每一个都会计算一些与其他处理器有关的结果。

例如,你可以做的是有另一个服务,上游,它会收集这些服务的结果,聚合它们,当它有一个事件的所有处理结果时,它可以做任何你想做的事。它知道哪些进程已接受,哪些进程未接受,并根据您的系统逻辑决定要做什么。

示例:

BookingService 发出事件:

{
    "bookingId": 123,
    "creditCardDetails": ...,
    "timeslot": ...
}

CreditCardService 接收和发射:

{
    "service": "CreditCardService",
    "bookingId": 123,
    "accepted": false,
}

TimeslotService 接收和发出:

{
    "service": "TimeslotService",
    "bookingId": 123,
    "accepted": true,
}

并且在 BookingProcessingAggregatorService 中你会得到所有的回复并做出相应的反应。

我已经使用 Typescript 和 RxJS 创建了一个示例来模拟带有事件的消息传递系统, 希望这已经足够清楚了(无论如何都写得很好,所以它也可能对您有所帮助):

https://rxjs-nexjv8.stackblitz.io