.net 当您的读写具有类似的缩放要求时,CQR仍然有用吗?

.net 当您的读写具有类似的缩放要求时,CQR仍然有用吗?,.net,database,architecture,cqrs,.net,Database,Architecture,Cqrs,我有一个.NETMVC电子商务购物篮应用程序,它跟踪客户放在购物篮中的物品。我们使用repository模式将项目读/写到basket表中,有时这个应用程序会受到来自用户的巨大压力,SQL数据库也因此受到影响 我想知道使用CQR是否会有所帮助,但在这种情况下,在这两种情况下,读/写篮子的数量都非常高。此外(除非我被误解),这里感觉最终的一致性不是很合适,因为篮子的更新需要立即可读,以便用户可以跟踪和查看他们添加的内容。一秒钟的耽搁就会引起大规模的混乱 这是一个不适合CQR的场景吗?专注于水平扩展

我有一个.NETMVC电子商务购物篮应用程序,它跟踪客户放在购物篮中的物品。我们使用repository模式将项目读/写到basket表中,有时这个应用程序会受到来自用户的巨大压力,SQL数据库也因此受到影响

我想知道使用CQR是否会有所帮助,但在这种情况下,在这两种情况下,读/写篮子的数量都非常高。此外(除非我被误解),这里感觉最终的一致性不是很合适,因为篮子的更新需要立即可读,以便用户可以跟踪和查看他们添加的内容。一秒钟的耽搁就会引起大规模的混乱


这是一个不适合CQR的场景吗?专注于水平扩展应用程序和数据库(可能通过将客户划分为不同的组)更好吗?还是有其他架构风格可以提供帮助?

如果您正在进行简单的CRUD,CQR并不是您真正想要的模式。我将更深入地研究缓存模式。在这里,一个小缓存有助于扩展小表。如果您愿意利用最终的一致性,将其设为写回缓存,用户将只看到缓存,数据存储将滞后于用户。。。这对于正在购买东西的用户来说似乎有点冒险,并且在添加到购物车和“签出”之间可能有很短的时间。如果您正在使用简单的CRUD,那么CQR并不是您真正想要的模式。我将更深入地研究缓存模式。在这里,一个小缓存有助于扩展小表。如果您愿意利用最终的一致性,将其设为写回缓存,用户将只看到缓存,数据存储将滞后于用户。。。这对于正在购买物品的用户来说似乎有点冒险,在添加到购物车和“签出”之间可能会有很短的时间。

只是为了清楚起见:CQR的阅读方不必最终保持一致。在SQL中,实际上很容易获得一致的读取模型:只需在与写入操作相同的事务中创建它。甚至使用物化视图。CQRS只意味着在代码和数据存储中为写和读保留一个单独的模型,并不意味着最终(或任何其他)一致性模型

对于您的确切用例,我不太明白为什么一个篮子会从单独的读取模型中受益(它甚至可能使它变得更糟),但我不知道您的完整规范。如果您正确地索引了数据,读取应该不会有问题。我会朝另一个方向去优化写性能,优化模式可能会有所帮助


此外,如果篮子是不耐用的东西,你可以考虑使用MeMax(例如ReDIS)来存储篮子。与perfromance的好处相比,如果redis失败(无论如何都应该非常罕见),并且所有篮子都被丢弃,那么最坏的情况/业务影响是什么?我认为,一个缓慢的系统所带来的伤害,不仅仅是一年发生一次或两次(或永远不会发生)的故障可能造成的影响。

为了清楚起见:CQR的读取端不必最终保持一致。在SQL中,实际上很容易获得一致的读取模型:只需在与写入操作相同的事务中创建它。甚至使用物化视图。CQRS只意味着在代码和数据存储中为写和读保留一个单独的模型,并不意味着最终(或任何其他)一致性模型

对于您的确切用例,我不太明白为什么一个篮子会从单独的读取模型中受益(它甚至可能使它变得更糟),但我不知道您的完整规范。如果您正确地索引了数据,读取应该不会有问题。我会朝另一个方向去优化写性能,优化模式可能会有所帮助

此外,如果篮子是不耐用的东西,你可以考虑使用MeMax(例如ReDIS)来存储篮子。与perfromance的好处相比,如果redis失败(无论如何都应该非常罕见),并且所有篮子都被丢弃,那么最坏的情况/业务影响是什么?我认为,一个缓慢的系统所带来的伤害比一年发生一次或两次(或永远不会发生)的故障可能带来的影响更大