gpt4 book ai didi

CQRS - EventListener 可以调用命令吗?

转载 作者:行者123 更新时间:2023-12-04 17:49:17 26 4
gpt4 key购买 nike

我想在我的项目中使用 CQRS 模式的元素。我想知道我是否用命令和事件做对了。
我不确定的是事件是否可以调用命令。为了更好地展示我想要做什么,我将使用图表和示例。

这是一个例子:

用户调用 TripCreateCommand。 TripCreateCommandHandler 完成他的工作,成功后发布 TripCreatedEvent。

现在我们有两个 TripCreatedEvent 监听器(监听器执行的顺序无关紧要)

第一个监听器(可以在第二个监听器之后执行):

为trip.author.friends中的每个用户调用两个Command(命令的顺序很重要)

  • PublishTripOnUserWallCommand
  • SendNewTripEmailNotificationCommand
  • SendNewTripPlatformNotification

  • 第二个监听器(可以在第一个监听器之前执行):
  • PublishTripOnUserSocials

  • 这是示例图:

    enter image description here

    这是一个好方法吗? EventListener 可以调用 Command,或者我应该以其他方式调用吗?

    最佳答案

    您的问题是关于消息驱动架构,它与 CQRS 一起工作但与 CQRS 无关。

    无论如何,您的图表几乎是正确的。事件订阅者/处理程序(我更喜欢这个术语)可以发送新命令 通过服务巴士 ,但这并不是你应该总是这样做的规则。我直接在事件处理程序中实现了相当多的功能,尽管 probalby 发送新命令会更干净和可靠。这真的取决于我想做什么。

    请注意,消息处理程序(命令或事件)不应该知道其他处理程序。他们应该了解公交车,公交车负责处理。这意味着在您的应用程序中,事件处理程序会将总线作为依赖项,创建命令并通过总线发送它。事件处理程序本身不知道哪个命令处理程序生成了事件并且可以“回复”它。

    通常这些命​​令会被独立处理,你不能保证顺序(除非它们是同步处理的)所以也许你希望第二个命令作为第一个命令处理的结果发出。事实上,Saga 可能就是这种情况。

    AFAIK 你只是在谈论同步做事,所以你的方法在这种情况下有效,但它可能无法扩展。转向异步处理会破坏这个执行流程。但是,您的应用程序可以很好地使用它,并非所有内容都必须是 twitter。

    消息驱动的架构并不是那么简单,并且在某些情况下(例如您希望后端立即响应),它的实现非常复杂,至少比“标准”方法更复杂。因此,对于那些特定情况,您可能希望以“旧”方式进行操作。

    如果您担心解耦和测试,您仍然可以将服务设计为消息处理程序,但直接使用它们,而不是服务总线。

    关于CQRS - EventListener 可以调用命令吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21242647/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com