gpt4 book ai didi

node.js - 如何知道投影已完成并需要在 CQRS 中发布实时订阅事件?

转载 作者:太空宇宙 更新时间:2023-11-04 01:32:52 25 4
gpt4 key购买 nike

我正在尝试学习 CQRS 设计方法(模式和架构)并将其应用到新项目中,但似乎缺少一个关键部分。

我的客户端应用程序执行查询并从读取模型中检索文档列表(带有联接)。用户选择一个项目并单击按钮来启动某些操作。该操作是通过创建相应的命令对象并将其发送到写入模型来执行的(其中命令处理程序通过读取模型执行操作、更新数据存储等)。然而,在某些时候,我需要更新 UI 以反射(reflect)该操作导致的应用程序状态的更改。

  1. 用户界面如何知道何时刷新原始列表?
  2. 操作成功,数据已更改,并且应更新 UI 以反射(reflect)这些更改。
  3. 操作失败,数据未更改,但应通知用户失败和可能的纠正措施。

如果没有完成投影,我无法获取插入/更新的数据并通过实时套接字发送回 UI。一种解决方案是,我可以发送相同聚合和aggregateId 的状态,但在连接的情况下,如何将完整更新(带有连接的数据)发送回 UI?

最佳答案

您有几个更新 UI 的选项。

如果可能,您的 API 同步返回成功/失败会更容易。如果出现故障,您可以立即向用户报告,并且不需要更新 UI。如果你成功了,你就有一些选择。

  1. 在成功响应中包含一些实体版本信息。在您的读取模型中包含一些版本信息,并轮询查询 API,直到版本足够新。
  2. 在成功响应中包含一些实体版本信息。让您的查询 API 允许您指定您至少需要该版本的数据(在 header 、查询参数或其他内容中)。如果查询 API 尚未更新,您可以立即返回失败,也可以让它阻塞,直到更新(有超时),然后返回最新数据。
  3. 每当“订阅”的读取模型发生变化时,使用某种客户端通知系统(例如 Web 套接字)来通知客户端。通知可以包含客户端需要更新的信息,也可以进行其他查询。

除了这些选项之外,您还可以采用乐观更新技术。在这种情况下,在发出命令之前进行适当的客户端检查后,您会立即假设该命令成功(如果它是通常成功的命令类型),请立即使用客户端代码更新 UI。然后:

  1. 如果命令返回失败,请撤消客户端更新(您可以通过重新获取读取模型或使用客户端代码来执行此操作)。
  2. 如果命令成功,如果客户端乐观更新可能不太正确,请考虑重新获取读取模型。这应该使用上面列出的策略之一来确保命令的效果出现在读取模型中。

这对于离线支持也非常有效 - 您在客户端中持久地对命令进行排队,并乐观地假设它们成功(可能通过 UI 指示您处于离线状态并且数据已过时),使用客户端代码更新读取模型,直到您实际上可以将命令发送到服务器并重新获取服务器生成的读取模型。

关于node.js - 如何知道投影已完成并需要在 CQRS 中发布实时订阅事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55517934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com