gpt4 book ai didi

.net - 在 CQRS 模式 + 事件源中读取 "latest data"的使用模式

转载 作者:行者123 更新时间:2023-12-01 13:44:51 25 4
gpt4 key购买 nike

我正在使用 CQRS(命令查询责任分离)模式实现一个测试项目。

我有几个问题。

  1. 我想在购买前检查用户购物车中某件商品在数据存储中的最新价格。因此,将根据数据存储(产品表)上的最新价格检查真实模型(通过物化 View )价格。如果价格之间存在差异,我想向用户显示警报。实现这一目标的最佳方法是什么?

  2. 当用户更新他们的电子邮件和密码时,它应该仍然依赖于创建事件来更新数据存储(事件->事件存储->服务总线->数据存储)还是直接更新数据存储?我不希望延迟触发 read_model_update 的事件,因为用户必须立即重新登录。

最佳答案

I want to check the latest price on the data store for an item on a users shopping cart just prior to purchasing... What is the best way to achieve this?

我怀疑“实现这一目标的最佳方式”在很大程度上取决于您的利益相关者希望为客户提供的购物体验。 IE - 什么时候应该锁定价格?例如,购物车中显示的价格可能是有时间限制的固定报价。

但是请原谅那些细节......

一种方法是在分派(dispatch)命令之前对读取模型运行健全性检查。有一种常见模式(有效地)检查命令在给定读取模型的状态下是否有效,然后调度临时验证的命令以更新记录簿。您可以用一些延迟换取更低的故障率。

另一种可能性是使用流程管理器;这个想法是“placeOrder”不是对模型的简单写入,而是生命周期的开始。因此,假设报价是您模型中的一个东西——当将商品放入购物车时,将生成报价(可能具有一些过期值)。当价格发生变化时,所有不同的报价都会更新。下订单时,处理程序会看到 placedOrder 事件,并尝试对报价调用 acceptQuote 方法;如果报价仍然有效,则生成的事件会将订单流程推进到下一个状态。如果引用不再有效,则生成不同的事件,或者命令被拒绝,最终超时表明可能存在问题....

(您可以尝试对产品本身做一些类似的事情,但由于争用问题,效果不是很好;了解您正在使用最新状态的唯一方法对象是让记录簿接受对其的写入。)

查看 Race Conditions Don't Exist 可能会有用作者:乌迪·达汉。

When the User updates their Email and Password should it still rely on creating events to update the DataStore (Event->EventStore->Service Bus->DataStore) or directly update the Data Store?

没有直接更新——读取模型的所有更新都应该发生在记录簿更新之后。

I don't want a delay of the event triggering the read_model_update as the user will have to log back in immediately.

用户可能会立即重新登录,但这并不意味着您需要立即确认登录。

例如;通过写入模型,您刚刚发布了一堆新事件。获取您发布的最高事件的序列号,并将查询的那部分分派(dispatch)到读取模型;登录处理程序根据读取模型中的可用序列号检查序列号,如果模型需要另一个心跳来跟上,则停止。

(更有可能:在这种用例中,事件发布系统与来自客户端的后续请求之间存在竞争,您将安排一个读取模型,该模型将根据需要查询事件存储。所以你的延迟基本上是读取模型和记录系统之间的网络距离的函数,加上应用新事件所需的时间。实际上,来自客户端的请求充当事件消息,表明高水位线增加,然后模型发送查询以获取丢失的历史记录)。

另请注意推论——读取模型的不同部分具有不同的延迟要求。

CQRS 是一种 shell 游戏。仍然只有一个记录系统,即接受来自模型的写入的持久性存储。该存储针对写入进行了优化。读取模型可以附加到该存储(获取最新的可用数据,但由于数据处于“写入优化”形式,因此具有额外的处理延迟),或者附加到该存储的投影(其中数据较旧,但已经针对具体阅读)。

关于.net - 在 CQRS 模式 + 事件源中读取 "latest data"的使用模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36732230/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com