是否有人拥有使用put / post的cqrs的最佳实践模式,特别是客户端在发送命令/事件后正在为更新资源执行get ...您是否允许/要求客户端保留更新的本地副本资源,并在get响应中发送最后更新的时间戳?或者确保get包含未处理的命令?当然,如果另一个客户端检索到相同的资源,则可能/不会获得更新的资源。 哪种方法最适合你? 您是否会对get all checking命令队列的复杂性提出质疑?
答案 0 :(得分:1)
是否有人拥有使用put / post的cqrs的最佳实践模式,特别是客户端在发送命令/事件后正在获取更新资源...
你会如何在网站上进行?
通常情况下,您可以执行GET加载资源,这将为您提供版本0,可能在元数据中包含一些validators,以便让您知道您收到的代表版本的版本。如果您尝试再次获取资源,通用组件可以从标题中看到您的副本是最新的,并会向您发回一条消息(304 Not Modified)。
当您对该资源进行POST时,成功的响应会让所有中间组件都知道以前缓存的资源副本为invalidated,因此下一个GET请求将检索一个全新的副本,所有修改。
这一切都很有效,直到CQRS设置中,读取请求遵循与写入请求不同的路径。读取端最终将自行更新,因此诀窍是如何避免将陈旧的表示返回给知道应该已经更改的客户端。
您正在寻找的类比是202 Accepted;我们希望写入端让客户端知道操作成功,并且有一个资源可用于获取更改。
也就是说,写入端返回指示命令成功的响应,并提供包含读取模型可用于确定其副本是否为最新的数据的链接。
客户的工作是跟随链接,就像在REST中的其他地方一样。
提供的链接当然是一些安全操作,指向读取模型。读取模型将链接中的信息与当前可用表示的元数据进行比较;如果读取的模型副本是最新的,它将返回该值,否则它将返回一条消息,告知客户端重试(大概是在一段时间后)。
简而言之,我们在读模型上使用轮询,等待它赶上来。