我有4个实体类型,每个都有自己的状态机。有转换,也应该调用一个或多个不同的实体类型的转换。我可以通过事件系统来解决这个问题(无论是entered还是transition事件),但这看起来不太对,而且很难跟踪所有情况并确保所有依赖项都得到处理。这种用例的设计模式是什么?我需要一种方法来将独立的状态机连接在一起。短暂性脑缺血发作
entered
transition
eufgjt7s1#
Observer模式似乎非常适合于实体在一个项目中的情况,否则,如果存在微服务,则可以应用以下模式。看起来你有一些实体可以相互分离,并且这些实体可以被认为是一个独立的微服务。如果是的话,那么我们可以尝试应用下面的微服务模式。
使用异步消息传递进行服务间通信。服务通过在消息传递通道上交换消息进行通信。异步通信有几种不同的样式:
将跨多个服务的每个业务事务作为一个 Saga 来实现。saga是一系列本地事务。每个本地事务都更新数据库并发布消息或事件以触发saga中的下一个本地事务。如果本地事务由于违反业务规则而失败,则saga将执行一系列补偿事务,以撤消前面的本地事务所做的更改。
定义视图数据库,该数据库是设计用于支持该查询的只读副本。应用程序通过订阅拥有数据的服务发布的域事件,使副本保持最新数据。
dphi5xsq2#
虽然我很欣赏@StepUp的回答,但它并不完全符合我的需要。应用程序已经使用了相当多的事件(或读取消息)。CQRS将是一个主要的重写,因为不需要审计状态变化,我看不到它有足够大的好处。 Saga 似乎很有趣,但由于这不是一个微服务上下文,它将是很多。在考虑了很长时间之后,我意识到观察者只会颠倒对另一方的责任。我需要一些核心的东西。解决方案将是Mediator模式。中介者(只有中介者)将知道哪个工作流依赖于其他工作流。工作流本身不需要知道这一点。由于状态机已经触发事件,我可以使用它们来调用中介者,中介者将知道该做什么。
2条答案
按热度按时间eufgjt7s1#
Observer模式似乎非常适合于实体在一个项目中的情况,否则,如果存在微服务,则可以应用以下模式。
看起来你有一些实体可以相互分离,并且这些实体可以被认为是一个独立的微服务。如果是的话,那么我们可以尝试应用下面的微服务模式。
图案:Messaging
使用异步消息传递进行服务间通信。服务通过在消息传递通道上交换消息进行通信。异步通信有几种不同的样式:
图案:Saga
将跨多个服务的每个业务事务作为一个 Saga 来实现。saga是一系列本地事务。每个本地事务都更新数据库并发布消息或事件以触发saga中的下一个本地事务。如果本地事务由于违反业务规则而失败,则saga将执行一系列补偿事务,以撤消前面的本地事务所做的更改。
图案:Command Query Responsibility Segregation (CQRS)
定义视图数据库,该数据库是设计用于支持该查询的只读副本。应用程序通过订阅拥有数据的服务发布的域事件,使副本保持最新数据。
dphi5xsq2#
虽然我很欣赏@StepUp的回答,但它并不完全符合我的需要。应用程序已经使用了相当多的事件(或读取消息)。CQRS将是一个主要的重写,因为不需要审计状态变化,我看不到它有足够大的好处。 Saga 似乎很有趣,但由于这不是一个微服务上下文,它将是很多。
在考虑了很长时间之后,我意识到观察者只会颠倒对另一方的责任。我需要一些核心的东西。
解决方案将是Mediator模式。中介者(只有中介者)将知道哪个工作流依赖于其他工作流。工作流本身不需要知道这一点。由于状态机已经触发事件,我可以使用它们来调用中介者,中介者将知道该做什么。