【问题标题】:How to handle external events in CQRS?如何处理 CQRS 中的外部事件?
【发布时间】:2014-02-11 14:29:21
【问题描述】:

假设我有一个基于 CQRS 的系统,它带有一个我想与一些外部设备集成的 Web UI,比如一个 Arduino 板。

基本上,我可以想到三种情况:

  1. 当用户点击 Web UI 中的按钮时,Arduino 会做一些事情。
  2. 当用户按下硬件按钮时,域应做出反应并更新 UI。
  3. 当用户按下硬件按钮时,UI 会更新。

如何为这些场景建模?

  1. 恕我直言,这很简单:UI 发出命令,业务逻辑运行,发出事件,Arduino 正在监听事件。基本上,Arduino 只不过是一个事件去规范化器。这是正确的方法吗?

  2. 恕我直言,这也很简单:Arduino 发出命令,将其发送到命令总线,并运行与场景 1 相同的过程。基本上,对于 CQRS 系统来说,命令是否到来没有区别来自其他任何东西的网络用户界面。

  3. 这是我真正不确定的地方:假设 Arduino 自己处理按钮按下,并闪烁 LED 作为响应。我只是想确保我的应用程序注意到“LED 一直在闪烁”。这不是命令(因为闪烁已经发生),而是一个事件。我该怎么办这个活动?我是否只是将其存储在事件存储中并绕过我的域?这对我来说似乎是非常错误的。我是否发出一个伪命令,将其 1:1 转换为匹配事件?这将起作用并且不会绕过域,但它也感觉不对,因为它实际上不是命令。我该怎么办?

对这些事情有什么建议吗?

【问题讨论】:

  • 您能多谈谈您的读/写模型(相同,不同...)吗?一种方法可以是在处理命令之后......将结果规范化为读取模型(Arduino板的读取模型)并发送(或请求)

标签: domain-driven-design integration cqrs


【解决方案1】:

1.如果您的域中没有状态应该改变,只需使用事件处理程序(更新 ui 可能使用 websocket)监听 Arduino 事件。
2. 使用 saga 监听 Arduino 事件并在域中的状态发生变化时触发命令。

UI 不是域问题。所以我更喜欢选项 1。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-07
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 2020-04-02
    • 2013-11-08
    • 2017-04-03
    相关资源
    最近更新 更多