【问题标题】:Is there a way to wait for the results or exceptions of a Saga?有没有办法等待 Saga 的结果或异常?
【发布时间】:2017-04-06 00:44:55
【问题描述】:

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

更新:

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

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

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

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

【问题讨论】:

    标签: axon


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 感谢您的洞察!
    猜你喜欢
    • 2021-01-25
    • 2016-10-04
    • 2015-09-28
    • 2015-11-02
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    相关资源
    最近更新 更多