多租户CQRS架构

11

我的团队开始实施一个全新的应用程序,需要支持多租户功能。我一直在进行大量的研究,特别是在分布式基于云的基础架构上寻找简单可扩展性的模式,而CQRS似乎是当下的流行词(甚至被称为“架构成瘾者的毒品”,这让我觉得非常有趣)。尽管忽略其优点和缺陷,但很难找到除了Greg Young以外谁已经广泛地(或根本没有)在生产应用中使用这个想法并可以提供现实世界的指导。

因此,这里是我的问题: 1. CQRS架构是否适合典型的多租户应用程序,还是更适合较大规模的企业内部应用程序。 2. 如果您建议在此情况下使用它,能否提供一些来自实践的方法指导 - 特别是关于早期正确实现的方面以及应该有机演化的方面。 3. 如果有人试过并发现它太难或者没有实现好处,或者有强烈的反对意见(并建议坚持使用CRUD和分层设计),我也想了解这些经验。

参考资料,该应用程序将使用.NET编写,前端最初将是基于Web的(ASP.NET MVC),可能会扩展到移动和厚客户端。虽然与高交易量金融应用程序等相比,但并发性,事务活动和数据量预计在整个应用程序的生命周期内仍将保持相对较低。对于基础架构,我们计划使用Azure。


如果你还没有阅读过,我建议你在这里阅读Udi的CQRS澄清文章:http://www.udidahan.com/2009/12/09/clarified-cqrs/,并在这里观看他的视频:http://skillsmatter.com/podcast/open-source-dot-net/udi-dahan-command-query-responsibility-segregation/rl-311 - Michael Shimmins
2
另外,特别针对.NET Azure CQRS,请查看http://abdullin.com/和Lokad项目http://code.google.com/p/lokad-cqrs/。 - Michael Shimmins
Michael,感谢您的评论。我确实阅读了大量关于这种模式的信息,包括这些资源。似乎缺少的是那些已经使用了一段时间或正在实施它的人的声音。在我采用理论优势之前,我想验证伴随着它们的现实挑战是否太大。正如我最喜欢的一句话所说,“在理论上,理论和实践是相同的。但在实践中,它们很少相同。” - Mafuba
值得一提的是,在Lokad,我们广泛地使用CQRS来开发多租户应用程序。请参见http://code.google.com/p/lokad-cqrs/。 - Joannes Vermorel
3个回答

8
  1. 多租户将会在CQRS读取方面有所变化。您需要过滤视图并仅返回与租户相关的数据。使用任何其他架构都会面临相同的问题。
  2. 我建议使用CQRS,因为它将使您的应用程序基于任务(而不是基于CRUD)。这意味着您将从UI接收命令,并且它们将比DTO更有意义。 如果您想使用DDD原则编写核心,则尝试避免贫血领域模型(http://martinfowler.com/bliki/AnemicDomainModel.html)。方法是将所有特定于域的逻辑移动到域对象中。您的命令处理程序应该非常简单(验证身份、加载聚合根、将命令对象转换为方法调用,如果没有抛出异常-应用更改)。 值得观看Greg的课程记录(6个半小时):http://cqrsinfo.com/video/ 正如Michael Shimmins所说,如果您计划使用Azure作为平台-值得查看Lokad.CQRS项目。我用它来实现我们的一个项目。
  3. 如果您真的需要简单的CRUD应用程序(而不是基于任务),则CQRS不适用。CQRS需要新手更多的时间来理解其原则。另一方面,它将允许在域核心程序员和经验较少的视图 -> dto -> ui程序员之间分离开发任务。

6

在着手实际项目之前,我曾从探索性的角度审视同样的起点(我们仍在等待商业资金)。我的研究和意见是,架构的多租户轴线在粗粒度服务的内部设计中使用CQRS大体上是正交的。多租户要求在应用程序如何从安全、数据、展示/个性化、部署/供应和可伸缩性等方面分隔租户方面施加了额外的总体限制。CQRS并不能真正使这种情况更好或更糟,并且在我看来,在处理服务的有价值的架构挑战方面仍然具有价值。话虽如此,不是所有松散协作提供应用程序的服务都需要遵循CQRS模式,只要所选择的松散耦合架构不禁止其使用即可。


2

我认为使用CQRS并不会增加或减少多租户的难度。如果您使用消息传递,可以获得各种优势:您可以将租户标识嵌入命令和事件的头数据中,根据标识选择事件存储,将多租户与多实例相结合。但是,请问一下自己,如果您的领域高度协作,并且拥有领域专家……否则您最终可能会得到命令/事件-CUD ;-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接