分布式系统中的域事件和命令(DDD)

时间:2013-01-31 19:17:25

标签: distributed-system domain-events

假设我有分布式架构(客户端 - 服务器)。在客户端,有 ServerEntity 类,在客户端有 ClientEntity 类。我希望 ClientEntity 只是从 ServerEntity 请求一些数据。我最近开始学习DDD方法,实际上我喜欢域事件,所以我选择了它。以下是我对未来实施的简化期望:

  1. ClientEntity创建命令RequestDataCommand并发布它(例如通过MessageBus)
  2. 客户端的ApplicationLayer获取此命令,连接它并发送到服务器
  3. 服务器的ApplicationLayer接收命令并将命令推送到MessageBus
  4. ServerEntity接收命令并使用某些数据发布域事件
  5. 服务器的ApplicationLayer获取此事件,连接它并发送到客户端
  6. 客户端的ApplicationLayer接收事件并将命令推送到DomainEventManager
  7. ClientEntity订阅了该事件,并在收到时更改了一些内部状态。
  8. 上述方法的缺点是我们最终会得到数十个命令类。

    另一方面,还有另一种选择:我们创建一些域服务接口,如IRequestDataService,并将其作为ClientEntity的依赖项。因此,我们不需要创建命令类并将其传递给消息总线,我们只需从IRequestDataService调用适当的方法。来自服务器的响应被收到域事件,如上例所示。

    第二种方法的缺点是我们只使用服务来发送命令,这在我的视野中应该只执行同步操作。

    哪种方法更好,我认为正确的客户端 - 服务器通信方式?

1 个答案:

答案 0 :(得分:0)

您的RequestDataCommand对我来说看起来不像是命令。

命令是使用UL的命令性指令,它会更改系统的状态。请求数据不会改变状态,因此它不应该是一个命令。

你的第二种方法也遇到了类似的问题。对IRequestDataService的调用不应该更改服务器上的状态。没有状态改变意味着不应该发起任何事件,至少不会发生在正常情况下#34; DDD

我的印象是,您正在尝试使用您拥有的基础设施(事件,消息总线,......)来做您不应该做的事情。

在我看来,对于读取数据,更好的选择是绕过大多数域逻辑,只是以最简单直接的方式读取数据。看看CQRS(http://martinfowler.com/bliki/CQRS.html是一个好的开始)