2

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

写模型

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

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

我已经阅读了如下模型:

读取模型

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

CardWasAdded

通过网址:

POST /cards

我收到代码 201。

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

GET /cards

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

如何处理这个问题?

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

2 回答 2

6

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

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

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

于 2018-08-20T12:01:49.443 回答
1

谢谢罗曼的回答。

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

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

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

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

邮寄/卡片

或者

获取/卡片

所以用户体验很好

于 2018-09-07T07:55:36.410 回答