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

Microservices 事件源,处理同一事件时两个服务之间的冲突,microservices,cqrs,event-sourcing,Microservices,Cqrs,Event Sourcing,我开始学习事件来源和CQR,但我没有做对什么 如果我有两个服务都以不同的方式处理相同的事件,例如在预订示例中,一个服务检查时间段,另一个检查用户信用,其中一个接受事件,而另一个不接受,那么系统应该做什么 服务如何知道其他服务是否接受或拒绝了该事件?高级别:当您使用分布式系统时,系统中的不同组件通过传递消息共享信息。当您的日程安排服务想让您知道您请求的时段已为您保留时,它会通过向您发送消息来通知您 当你想知道其他地方发生了什么事情时,你可以查看你收到的信息 服务机构如何知道其他服务机构是否接受或拒

我开始学习事件来源和CQR,但我没有做对什么

如果我有两个服务都以不同的方式处理相同的事件,例如在预订示例中,一个服务检查时间段,另一个检查用户信用,其中一个接受事件,而另一个不接受,那么系统应该做什么


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

高级别:当您使用分布式系统时,系统中的不同组件通过传递消息共享信息。当您的日程安排服务想让您知道您请求的时段已为您保留时,它会通过向您发送消息来通知您

当你想知道其他地方发生了什么事情时,你可以查看你收到的信息

服务机构如何知道其他服务机构是否接受或拒绝了该活动

需要了解的一件重要事情是,服务永远不应该是衰退事件。ApprovalRequested描述了发生的事情,订阅服务无法将其解除

通常情况下,订阅者将收到ApprovalRequested,更新其自己的本地数据,然后根据需要发出ApprovalPermited或ApprovalDeced

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

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


Rinat Abdullin关于may的文章可能会有所帮助。

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

当你想知道其他地方发生了什么事情时,你可以查看你收到的信息

服务机构如何知道其他服务机构是否接受或拒绝了该活动

需要了解的一件重要事情是,服务永远不应该是衰退事件。ApprovalRequested描述了发生的事情,订阅服务无法将其解除

通常情况下,订阅者将收到ApprovalRequested,更新其自己的本地数据,然后根据需要发出ApprovalPermited或ApprovalDeced

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

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


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

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

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

例如:

BookingService发出事件:

{
    "bookingId": 123,
    "creditCardDetails": ...,
    "timeslot": ...
}
CreditCardService接收和发送:

{
    "service": "CreditCardService",
    "bookingId": 123,
    "accepted": false,
}
{
    "service": "TimeslotService",
    "bookingId": 123,
    "accepted": true,
}
TimeslotService接收和发送:

{
    "service": "CreditCardService",
    "bookingId": 123,
    "accepted": false,
}
{
    "service": "TimeslotService",
    "bookingId": 123,
    "accepted": true,
}
在BookingProcessingAggregator服务中,您会得到所有的响应并做出相应的反应

我已经创建了一个使用Typescript和RxJS模拟带有事件的消息传递系统的示例,
希望这足够清楚,不管怎样写它都很好,因此它可能会帮助您据我所知,这些处理器中的每一个都会计算其他处理器的结果

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

例如:

BookingService发出事件:

{
    "bookingId": 123,
    "creditCardDetails": ...,
    "timeslot": ...
}
CreditCardService接收和发送:

{
    "service": "CreditCardService",
    "bookingId": 123,
    "accepted": false,
}
{
    "service": "TimeslotService",
    "bookingId": 123,
    "accepted": true,
}
TimeslotService接收和发送:

{
    "service": "CreditCardService",
    "bookingId": 123,
    "accepted": false,
}
{
    "service": "TimeslotService",
    "bookingId": 123,
    "accepted": true,
}
在BookingProcessingAggregator服务中,您会得到所有的响应并做出相应的反应

我已经创建了一个使用Typescript和RxJS模拟带有事件的消息传递系统的示例,
希望这是足够清楚,它是很好地写它无论如何,所以它可能会帮助你感谢你的回答。对我来说,这种方法的问题在于接受事件的服务改变了它的物化视图。因此,聚合器服务应该
o如果其他服务部门不知何故未批准该活动,则应立即停止。我认为这可能会导致非常复杂的情况,因为所有服务都应该支持撤消事件。如果在撤消之前到达服务的另一个事件,撤消将变得更加复杂。因此,必须将操作与验证分开。在验证和操作过程中,聚合器会像一个主要的验证服务一样,将验证传递给服务,只有这样,服务才会尽其所能。如果您不能简单地做到这一点,你必须想出一些方法来进行回滚或防止副作用从系统中消失。这是一个很好的资源来阅读这类内容:谢谢你的回答。对我来说,这种方法的问题在于接受事件的服务改变了它的物化视图。因此,如果其他服务没有以某种方式批准事件,聚合器服务应该撤销它。我认为这可能会导致非常复杂的情况,因为所有服务都应该支持撤消事件。如果在撤消之前到达服务的另一个事件,撤消将变得更加复杂。因此,必须将操作与验证分开。在验证和操作过程中,聚合器会像一个主要的验证服务一样,将验证传递给服务,只有这样,服务才会尽其所能。如果您不能简单地做到这一点,你必须想出一些方法来进行回滚或防止副作用从系统中消失。这是阅读此类内容的一个很好的资源: