Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 使用模式来阅读;最新数据“;以CQRS模式+;活动来源_.net_Cqrs_Event Sourcing - Fatal编程技术网

.net 使用模式来阅读;最新数据“;以CQRS模式+;活动来源

.net 使用模式来阅读;最新数据“;以CQRS模式+;活动来源,.net,cqrs,event-sourcing,.net,Cqrs,Event Sourcing,我正在使用CQRS(命令查询责任分离)模式实现一个测试项目 我有几个问题 在购买之前,我想查看用户购物车上某项商品的数据存储的最新价格。因此,将根据数据存储(产品表)上的最新价格检查真实的_模型(通过物化视图)。如果价格之间存在差异,我想向用户显示警报。实现这一目标的最佳方式是什么 当用户更新他们的电子邮件和密码时,它应该仍然依靠创建事件来更新数据存储(事件->事件存储->服务总线->数据存储)还是直接更新数据存储?我不希望触发read_model_更新的事件延迟,因为用户必须立即重新登录 在购

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

我有几个问题

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

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

  • 在购买之前,我想查看用户购物车上商品的数据存储的最新价格。。。实现这一目标的最佳方式是什么

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

    但请原谅这些细节

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

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

    (您可以尝试对产品本身进行类似的操作,但由于存在争用问题,因此效果不太好;要知道您正在处理对象的最新状态,唯一的方法是让记录簿接受对其的写入。)

    由Udi Dahan审查可能有用

    当用户更新他们的电子邮件和密码时,它应该仍然依靠创建事件来更新数据存储(事件->事件存储->服务总线->数据存储)还是直接更新数据存储

    没有直接更新——所有对read模型的更新都应该发生在对book of record的更新之后

    我不希望触发read_model_更新的事件延迟,因为用户必须立即重新登录

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


    比如,;通过write模型,您刚刚发布了一系列新事件。获取已发布的最高事件的序列号,并将该部分查询分派到读取模型;登录处理程序根据读取模型中可用的内容检查序列号,如果模型需要另一个心跳信号来跟上,则会暂停

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

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


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

    我理解在采用事件源之类的最终一致性模型时我所付出的代价,但我只想知道上述场景是否存在例外情况。"例如,通过写模型,您刚刚发布了一系列新事件。获取已发布的最高事件的序列号,并将该部分查询发送到读模型;登录处理程序根据读模型中的可用序列号检查该序列号,如果模型需要另一个hea,则暂停rtbeat追赶。“实际上,读模型中的写入和更新之间有多大的延迟?100毫秒是99%的时间内可以接受的用例吗?我试图充实这部分答案;这有帮助吗?因此,我们的想法是,缩小比例,以减少延迟?(延迟=网络延迟+内存/磁盘等其他延迟)