在PROOPH中通过投影创建的读取模型中等待新记录

问题描述 投票:0回答:2

我使用prooph(https://github.com/prooph)所以我有我的写模型,我存储下面的事件(聚合表):

Write model

当我使用命令在后台运行投影时:

php bin/console event-store:projection:run card_projection

我读过如下模型:

Read model

在我的后台应用程序前面我有API,我创建事件:

CardWasAdded

通过网址:

POST /cards

我收到代码201。

之后我通过url刷新我的列表:

GET /cards

问题是有时这个新事件不会被投影处理。所以问题是:

如何管理这个问题?

  1. 我应该等待2秒还是一段时间?(丑陋的黑客对我而言)。
  2. 插入后我应该处理事件 - 不在背景中使用投影过程吗?
php cqrs event-sourcing prooph
2个回答
3
投票

我的答案不是特定于专业的,但是您可以在任何CQRS系统中使用以下策略:

  1. 只是接受这样一个事实:读模型并不是完全一致的(什么都不做)。示例 - 当我向Twitter发帖时,我可能不会立即在流中看到我的帖子,这没关系。它最终会出现在那里。
  2. 乐观的UI更新。只需更新UI就像您的命令一样。如果不是 - 没什么大不了的。示例 - 喜欢Twitter上的内容。您无需等待确认。如果以某种方式失败 - 其状态将伴随下一次读取模型刷新。
  3. 等待API端点。您调用了API,发出命令,并查找特定的读取模型更新。超时失败。
  4. 在UI级别等待。您发送命令并显示一些“等待”UI元素,直到您的查询返回您要查找的内容,或者超时失败。

使用策略3和4,您可以使用某种服务器信令 - 套接字或类似的东西。您的阅读模型可能能够确认它已更新。


0
投票

谢谢罗曼的答案。

最后我接受了读模型有延迟的事实。

在我的休息api中,当我发布新资源时,我返回201和json以及新创建的Id,依此类推。我的前端应用程序,基于POST新资源(POST /卡)的响应,将新记录添加到数据表中作为新行,带有“NEW”徽章。

当用户刷新列表时,读取模型就绪(因为构建新记录的时间不到1秒)。

最后,用户是否记录来自没有区别

POST /卡片

要么

GET /卡

所以用户体验很好。

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