事件溯源,处理同一事件时两个服务之间的冲突
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
、更新自己的本地数据,然后根据需要发出 ApprovalGranted
或 ApprovalDeclined
。
在您的情况下,您有一个订阅者将发出对时间段的批准或拒绝,另一个订阅者将发出对信用检查的批准或拒绝。
在其他地方,我们有一个状态机,它正在记录所有这些事件以了解预订是否成功。
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 创建了一个示例来模拟带有事件的消息传递系统,
希望这已经足够清楚了(无论如何都写得很好,所以它也可能对您有所帮助):
我开始学习事件溯源和 CQRS,但我没有做对。
如果我有两个服务都以不同的方式处理同一个事件(例如在预订示例中,一个服务检查时间段而另一个检查用户信用),并且其中一个接受事件而另一个不接受't,系统要做什么?
服务应该如何知道其他服务是否接受或拒绝了事件?
在较高层次上:当您拥有分布式系统时,系统中的不同组件通过传递消息来共享信息。当您的日程安排服务想让您知道您请求的时间段已为您保留时,它会通过向您发送消息来实现。
当您想了解其他地方发生的事情时,您可以查看收到的消息。
How should the services know if other services have accepted or declined the event?
需要了解的一件重要事情是,服务永远不应 下降 事件。 ApprovalRequested
描述的是已经发生的事情,订阅服务不能让它不发生。
通常会发生的情况是,订阅者将接收 ApprovalRequested
、更新自己的本地数据,然后根据需要发出 ApprovalGranted
或 ApprovalDeclined
。
在您的情况下,您有一个订阅者将发出对时间段的批准或拒绝,另一个订阅者将发出对信用检查的批准或拒绝。
在其他地方,我们有一个状态机,它正在记录所有这些事件以了解预订是否成功。
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 创建了一个示例来模拟带有事件的消息传递系统, 希望这已经足够清楚了(无论如何都写得很好,所以它也可能对您有所帮助):