4

假设我有一个可以在几毫秒内完成汇款的 Saga。我有 REST 控制器,它调用触发 Saga 的命令。如何等待 Saga 结束以检查结果或异常以让我的控制器作为响应返回?如果它只是一个不会触发 Saga 的单独命令,我可以使用命令网关和回调来通知我成功或失败。

更新:

在 Saga 结束后,我能够让我的控制器返回响应:

1) 我的控制器方法返回一个 DeferredResult 我保存到地图中

2) 我的控制器有一个事件处理程序,它侦听结束事件,从地图中检索 DeferredResult,并设置结果

有没有更好的方法来解决这个问题?

4

1 回答 1

7

Axon 旨在解耦不同的组件。一些组件处理命令并产生事件,其他消费事件并更新查询模型,或者在 Saga 的情况下,再次产生命令。

优选地,用户界面应该被设计成也以这种“最终一致”的方式工作。发送命令时,返回值只是表示命令处理成功,并不表示所有的副作用都已执行。

使用夸张的例子时原因很简单:如果 100 个组件对命令产生的事件感兴趣怎么办。您是否希望您的命令处理程序阻塞,直到所有这 100 个组件都已更新?这将导致这些组件之间发生戏剧性的(技术)耦合,并对可扩展性产生巨大影响。

鉴于此背景,您可能仍希望根据读取模型的更改来更新 UI。如果您期望某种副作用很快就会发生,那么使用 DeferredResult 或 CompletableFuture 是一种非常优雅的方式。它基本上是一种查询方式,你说:'让我知道什么时候......',而不是'给我你当前的状态'。或者,您也可以实时向消费者推送更新。我们已经在几个基于 Stomp(使用 Spring Websockets)的项目中实现了这一点。

不要忘记最终从您的地图中清除延迟结果,以防它们超时(请参阅DeferredResult.onTimeout()。如果您的机器由于内存消耗过多而崩溃,那将是很遗憾的。

于 2017-04-06T07:22:33.123 回答