【问题标题】:Waiting for new record in read model created by projection in PROOPH等待 PROOPH 中投影创建的读取模型中的新记录
【发布时间】:2019-01-26 09:49:12
【问题描述】:

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

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

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

我已经阅读了如下模型:

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

CardWasAdded

通过网址:

POST /cards

我收到代码 201。

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

GET /cards

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

如何处理这个问题?

  1. 我应该等待 2 秒还是一段时间?(对我来说太丑了)。
  2. 我应该在插入后处理事件 - 不要在后台使用投影过程吗?

【问题讨论】:

  • @RomanEremin 的完美回答。在 prooph 的示例应用程序中,您发现应用了策略 1,请参阅 here 该应用程序本身接受读取模型更新可能需要更长时间的事实。在这种情况下,它会通知用户并请求刷新页面。

标签: php cqrs event-sourcing prooph


【解决方案1】:

感谢罗曼的回答。

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

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

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

最后对于用户来说记录是否来自于没有区别

POST /卡片

获取/卡片

所以用户体验很好

【讨论】:

    【解决方案2】:

    我的回答并不具体,但这里有一些您可以在任何 CQRS 系统中使用的策略:

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

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

    【讨论】:

      猜你喜欢
      • 2021-03-25
      • 1970-01-01
      • 1970-01-01
      • 2017-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      • 1970-01-01
      相关资源
      最近更新 更多