当您的读取和写入具有类似的扩展要求时,CQRS 是否仍然有用?
Is CQRS still helpful when your read and writes have similar scaling requirements?
我有一个 .NET MVC 电子商务购物篮应用程序,用于跟踪客户放入购物篮的商品。我们使用存储库模式 read/write 项目到购物篮 table,有时这个应用程序会承受来自用户的巨大压力,SQL 数据库因此受到影响。
我想知道使用 CQRS 是否有帮助,但在这种情况下,reads/writes 上篮的次数在这两种情况下都非常高。另外(除非我被误解了),感觉最终一致性在这里不太合适,因为篮子的更新需要立即可读,以便用户可以跟踪和查看他们添加的内容。一秒钟的延迟都会引起大量混乱。
这是一个完全不适合table CQRS 的场景吗?专注于水平扩展应用程序和数据库(可能通过将客户分成不同的组)会更好,还是有其他架构风格可以提供帮助?
如果您正在执行简单的 CRUD,那么 CQRS 并不是您正在寻找的模式。我会更多地研究缓存模式。一点缓存在这里有很长的路要走,以帮助扩展小表。如果你愿意利用最终一致性,做一个回写缓存,用户只会看到缓存,数据存储会滞后于用户。。。这对于买东西的用户来说似乎有点冒险,并且添加到购物车和“结帐”之间的时间可能很短。
为了清楚起见:CQRS 读取端不必最终一致。在 SQL 中,拥有一致的读取模型实际上非常容易:只需在与写入操作相同的事务中创建它。甚至使用物化视图。 CQRS 仅意味着在代码和数据存储中为写入和读取保留一个单独的模型,并不自然意味着最终(或任何其他)一致性模型。
对于您的确切用例,我真的不明白为什么篮子会从单独的读取模型中受益(它甚至可能使情况变得更糟),但我不知道您的完整规格。如果您正确地索引数据,读取应该不会成为问题。我会转向另一个方向来优化写入性能,优化架构可能会有所帮助。
另外,如果篮子不是很耐用的东西,你可以考虑使用memcache(比如redis)来存放篮子。与性能优势相比,如果 redis 发生故障(无论如何应该很少见)并且所有篮子都被丢弃,那么最坏的 scenario/business 影响是什么?我认为一个缓慢的系统比一年可能发生一次或两次(或从不发生)的故障可能造成的影响更大。
我有一个 .NET MVC 电子商务购物篮应用程序,用于跟踪客户放入购物篮的商品。我们使用存储库模式 read/write 项目到购物篮 table,有时这个应用程序会承受来自用户的巨大压力,SQL 数据库因此受到影响。
我想知道使用 CQRS 是否有帮助,但在这种情况下,reads/writes 上篮的次数在这两种情况下都非常高。另外(除非我被误解了),感觉最终一致性在这里不太合适,因为篮子的更新需要立即可读,以便用户可以跟踪和查看他们添加的内容。一秒钟的延迟都会引起大量混乱。
这是一个完全不适合table CQRS 的场景吗?专注于水平扩展应用程序和数据库(可能通过将客户分成不同的组)会更好,还是有其他架构风格可以提供帮助?
如果您正在执行简单的 CRUD,那么 CQRS 并不是您正在寻找的模式。我会更多地研究缓存模式。一点缓存在这里有很长的路要走,以帮助扩展小表。如果你愿意利用最终一致性,做一个回写缓存,用户只会看到缓存,数据存储会滞后于用户。。。这对于买东西的用户来说似乎有点冒险,并且添加到购物车和“结帐”之间的时间可能很短。
为了清楚起见:CQRS 读取端不必最终一致。在 SQL 中,拥有一致的读取模型实际上非常容易:只需在与写入操作相同的事务中创建它。甚至使用物化视图。 CQRS 仅意味着在代码和数据存储中为写入和读取保留一个单独的模型,并不自然意味着最终(或任何其他)一致性模型。
对于您的确切用例,我真的不明白为什么篮子会从单独的读取模型中受益(它甚至可能使情况变得更糟),但我不知道您的完整规格。如果您正确地索引数据,读取应该不会成为问题。我会转向另一个方向来优化写入性能,优化架构可能会有所帮助。
另外,如果篮子不是很耐用的东西,你可以考虑使用memcache(比如redis)来存放篮子。与性能优势相比,如果 redis 发生故障(无论如何应该很少见)并且所有篮子都被丢弃,那么最坏的 scenario/business 影响是什么?我认为一个缓慢的系统比一年可能发生一次或两次(或从不发生)的故障可能造成的影响更大。