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

问题描述 投票:1回答:1

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

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

  1. 用户界面如何知道什么时候刷新原始列表?
  2. 操作成功,数据已更改,应更新UI以反映这些更改。
  3. 操作失败,数据未发生变化,但应通知用户故障和潜在的纠正措施。

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

node.js socket.io real-time cqrs
1个回答
0
投票

您有一些更新UI的选项。

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.