Architecture CQR可以用于StackOverflow这样的站点吗?

Architecture CQR可以用于StackOverflow这样的站点吗?,architecture,cqrs,Architecture,Cqrs,您可以使用CQRS(命令查询责任分离)架构模式来构建类似StackOverflow的站点吗?我对CQRS和DDD(领域驱动设计)相对较新,正在探索该模式,并尝试根据该模式对我熟悉的站点进行建模。虽然我可以看到CQR在StackOverflow这样的网站的许多方面都很有用,但有几个方面我不确定是否可行(或者,至少,我不能马上弄清楚)。具体而言: 提问当我创建一个问题时,我会看到它 立即,并可以编辑它。在里面 CQRS,我发出一个命令 “AskQuestion”并创建一个事件 称为“提问”。最后,

您可以使用CQRS(命令查询责任分离)架构模式来构建类似StackOverflow的站点吗?我对CQRS和DDD(领域驱动设计)相对较新,正在探索该模式,并尝试根据该模式对我熟悉的站点进行建模。虽然我可以看到CQR在StackOverflow这样的网站的许多方面都很有用,但有几个方面我不确定是否可行(或者,至少,我不能马上弄清楚)。具体而言:

  • 提问当我创建一个问题时,我会看到它 立即,并可以编辑它。在里面 CQRS,我发出一个命令 “AskQuestion”并创建一个事件 称为“提问”。最后,, 这个问题被推到了最后 非规范化数据存储。但他也是 经验是直接的。这是吗 CQR可能吗
  • 投票我的投票 它们会立即反映出来。在CQR中, 我可以想象这些命令/事件 最终通过活动 坐公共汽车去阅读商店。但我也会这么做 马上告诉我消息
我所关心的是这样提供的即时反馈的概念。CQR能提供这一点吗?如果是这样,将如何做到这一点?有没有好的例子来说明如何处理这个问题

如果有帮助的话,我的环境是VS2010/C#/SQL2008R2,但我对SQLite等其他选项持开放态度。我还研究了NCQRS和LOKAD的框架,以及Mark Nijhof的示例,并计划下载Greg Young的示例。我没有找到更多的CQRS样本


谢谢

当你提问时,你可以“伪造”UI中的数据。它看起来像是用户(您)立即更新的,但其他用户需要一段时间才能看到您的问题。你需要做同样的事情来处理投票


如果你需要即时反馈,你可以考虑其他解决方案。但是,在CQRS解决方案中,您可以使用一些技巧来提供即时反馈。例如,如果需要验证用户名是否为uniqe,则可以查询read数据库以确定该用户名是否存在。如果没有,你可以用它。但是,如果另一个用户同时选择了相同的用户名,您将在命令端遇到冲突。您需要在域模型中处理此问题,例如,为用户提供一个生成的用户名并通过电子邮件发送给他。他可以稍后将其更改为其他内容。

您实际上谈论的是“最终一致性”,这在CQR中经常被提及,但您可以独立使用这两种技术

最简单的方法是立即更新UI正在使用的模型,并使用该模型将问题显示给用户以供进一步操作。为了让其他用户看到更新,需要做的各种工作可以在不阻塞UI的情况下继续进行。为此,您需要验证您的命令,以便在发送命令之前几乎肯定会成功(如果命令在执行过程中失败,则您需要处理这种情况,例如,将某种回调合并到UI模型中)


同样值得注意的是,这类事件的“最终性”通常是如此之快,以至于任何事情都会立即出现,甚至对其他用户也是如此。

通过伪造或欺骗,您可能会将事件视为“待定事件”,在提交/发布阶段可能会成功,但可能会失败。在初次提交提交之前,您在客户端执行的验证越多,成功的可能性就越大。因此,如果您打算依赖一个挂起的提交,那么就在验证和业务规则公开方面计划一个更厚的客户端

然后,可以通过将UI中的数据标记为依赖于“待定提交”,从而允许用户继续使用数据(用于进一步修改)。它将是对象或属性的元属性。当然,添加和使用该元属性会增加复杂性,但根据应用程序的不同可能是一个必要的用例


客户端命令队列/历史记录可能是帮助处理后续事件依赖于最终失败的挂起提交的情况的一种方法。换句话说,依赖于挂起提交的任何内容都可能是历史记录的一部分,可以在对失败的挂起提交进行更正时进行汇总、保存、展开并重新应用于已更改并重新提交的挂起事件,并且一旦通知挂起事件成功提交,所有后续客户端历史记录都将开始展开,提交队列中的下一个项目,并将其标记为当前挂起的事件。

让我们看看这两个问题

提问当我创建一个问题时,我会立即看到它并可以编辑它。在CQRS中,我发出类似“AskQuestion”的命令,并创建一个名为“QuestionAsked”的事件。最终,问题被推到了非规范化的数据存储中。但苏的经验是立竿见影的。这在CQR中是可能的吗

这是很容易做到的。是每个用户都需要立即看到问题,还是只需要问问题的人?如果它需要1-2秒才能在每个人面前显现出来,它会有什么不同吗?通常,在最终一致的系统中,发送请求的用户与其他用户之间存在差异

我的投票结果立即反映出来。在CQR中,我想象这些命令/事件最终通过事件总线移动到读取存储。但是SO立即给了我信息

这样做是否会立即产生影响?让我们试试另一个例子,Facebook。当你点击喜欢的东西时,它会立即出现在你的喜欢中吗?像竖起大拇指这样的用户界面技巧会让你感觉像竖起大拇指一样。另一个例子是亚马逊。当您单击“添加到购物车”时,它是否立即进入您的购物车?像“添加到购物车”或“竖起大拇指”这样的视觉表现形式会使人感到不安