有没有办法等待 Saga 的结果或异常?

Is there a way to wait for the results or exceptions of a Saga?

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

更新:

我能够让我的控制器 return 在 Saga 结束后做出响应:

1) 我的控制器方法 return 是我保存到地图中的 DeferredResult

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

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

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

最好将用户界面设计为也以这种 'eventually consistent' 方式工作。发送命令时,return值只是表示命令处理成功,并不表示所有副作用都已执行。

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

鉴于该背景,您可能仍希望根据读取模型的变化更新 UI。如果您预计某种副作用很快就会发生,那么使用 DeferredResult 或 CompletableFuture 是一种非常优雅的方式。它基本上是一种查询风格,您可以在其中说:'let me know when ...',而不是 'give me your current state'。 或者,您也可以将更新实时推送给消费者。我们已经在几个基于 Stomp 的项目中实现了这一点(使用 Spring Websockets)。

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