CQRS可以用于像StackOverflow这样的网站吗?

Dav*_*ter 8 architecture cqrs

您是否可以使用CQRS(Command-Query Responsibility Segregation)架构模式来构建StackOverflow之类的站点?我对CQRS和DDD(领域驱动设计)相对较新,我正在探索这种模式,并试图对我熟悉的模式建模.虽然我可以看到CQRS对于像StackOverflow这样的网站的许多方面都很有用,但有一些方面我不确定是否可能(或者,至少,我无法立即弄清楚).特别:

  • 提出问题 当我创建一个问题时,我立即看到它并可以编辑它.在CQRS中,我发出类似'AskQuestion'的命令,并创建一个名为'QuestionAsked'的事件.最终,问题被推送到非规范化数据存储.但是,SO的经验是即时的.这可能与CQRS有关吗?
  • 投票 我的投票立即得到反映.在CQRS中,我想这些命令/事件最终会通过事件总线移动到读取存储.但SO立刻给了我信息.

我关心的是SO提供的即时反馈概念.CQRS可以提供​​这个吗?如果是这样,怎么办呢?那里有很好的例子说明如何处理这个问题吗?

如果它有帮助,我的环境是VS2010/C#/ SQL2008R2,但我对SQLite等其他选项持开放态度.我也在关注NCQRS和LOKAD的框架,以及Mark Nijhof的样本,并计划下载Greg Young的样本.我没有找到很多其他CQRS样本.

谢谢!

Fin*_*nNk 6

您实际谈论的是"最终一致性",它与CQRS同时经常被讨论,但您可以独立使用这两种技术.

最简单的方法是更新UI正在使用的模型,并使用它向用户显示问题以便进一步操作.然后,可以在不阻止UI的情况下继续进行各种工作以使其他用户可以看到更新.为此,您需要验证您的命令,以便在发送之前几乎肯定会成功(如果命令在执行期间失败,那么您将需要处理这种情况,例如将某种类型的回调纳入UI模型) .

同样值得注意的是,通常这种事情的"最终结果"如此之快,以至于无论如何都会立即出现,甚至对其他用户也是如此.


Gre*_*ung 6

让我们来看看这两个问题......

提出问题当我创建一个问题时,我立即看到它并可以编辑它.在CQRS中,我发出类似'AskQuestion'的命令,并创建一个名为'QuestionAsked'的事件.最终,问题被推送到非规范化数据存储.但是,SO的经验是即时的.这可能与CQRS有关吗?

这很容易实现.每个用户是否需要立即查看问题,还是只需要提问者?如果每个人看起来需要1-2秒,它会有所作为吗?最常见的是,在最终一致的系统中,发送请求的用户与其他每个用户之间存在差异.

投票我的投票立即得到反映.在CQRS中,我想这些命令/事件最终会通过事件总线移动到读取存储.但SO立刻给了我信息.

SO会立即给出吗?让我们试试另一个例子,Facebook.当你点击喜欢的东西时,这会立即出现在你的喜欢中吗?像竖起大拇指的UI技巧让你感觉像它一样.另一个例子,亚马逊.当您点击添加到购物车时它会立即进入您的购物车吗?像"添加到购物车"或"竖起大拇指"这样的视觉表示使您感觉像用户一样.

有许多这样的技巧可以使最终一致的系统感觉像一个完全一致的系统.

作为旁注,许多人认为这些事情是为了可扩展性而做的(有时候就是这种情况).更多时候,他们正在为可靠性而努力.如果XYZ停机,问题就会发生.您是否想要奇怪的随机本地故障,或者您是否希望面临广泛的中断风险?在这里看到的最好的例子之一就是亚马逊购买kindle,奇怪的是他们可以在100ms内处理你的信用卡,而其他人需要3-5秒:)如果他们的信用卡处理系统出现故障会怎样?