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

时间:2018-08-20 09:29:03

标签: php cqrs event-sourcing prooph

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

Write model

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

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

我已阅读以下模型:

Read model

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

CardWasAdded

通过网址:

POST /cards

我收到代码201。

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

GET /cards

问题是有时投影无法处理此新事件。 所以问题是:

如何处理该问题?

  1. 我应该等待2秒钟还是一段时间?(对我来说是难看的骇客)。
  2. 插入后是否应该处理事件-不在后台使用投影过程?

2 个答案:

答案 0 :(得分:3)

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

  1. 仅接受事实,即读取模型并非完全一致(不执行任何操作)。示例-当我在Twitter上发布内容时,我可能不会立即在流中看到我的帖子,这是可以的。它将最终出现在那里。
  2. 乐观的UI更新。只需更新用户界面,就像您执行命令一样。如果没有-没什么大不了的。示例-喜欢Twitter上的内容。您无需等待确认。如果某种原因失败了,则其状态将在下次读取模型时刷新。
  3. 在API端点处等待。调用了您的API,发出命令,然后寻找特定的读取模型更新。超时失败。
  4. 在用户界面级别等待。您发送命令并显示一些“等待” UI元素,直到查询返回您要查找的内容或超时失败。

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

答案 1 :(得分:0)

谢谢罗马的回答。

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

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

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

最后,对于用户而言,记录是否来自

都没有区别。

POST /卡

获取/卡

因此用户体验很好