领域驱动设计中的CQRS命令查询责任分离 -- 知识铺
1.概念
CQRS全称:Command Query Responsibility Segregation ,中文名:命令查询与职责分离
2.什么是CQRS
CQRS 将系统中的操作分为两类,即「命令」(Command) 与「查询」(Query)。命令则是对会引起数据发生变化操作的总称,即我们常说的新增,更新,删除这些操作,都是命令。而查询则和字面意思一样,即不会对数据产生变化的操作,只是按照某些条件查找数据。
CQRS 的核心思想是将这两类不同的操作进行分离,然后在两个独立的「服务」中实现。这里的「服务」一般是指两个独立部署的应用。在某些特殊情况下,也可以部署在同一个应用内的不同接口上。
Command 与 Query 对应的数据源也应该是互相独立的,即更新操作在一个数据源,而查询操作在另一个数据源上
3.CQRS架构
先看一下 CQRS 的架构图:
在软件架构设计中,CQRS(Command Query Responsibility Segregation)模式是一个将命令和查询责任分离的策略。这种模式通过将数据更新操作和数据查询操作分开处理,以提高系统的性能和可扩展性。以下是对CQRS模式的深入分析和总结:
CQRS架构概述
CQRS模式通常涉及两个系统:Command系统和Query系统。Command系统负责处理数据更新操作,而Query系统则负责处理数据查询操作。当Command系统完成数据更新后,会通过领域事件通知Query系统,后者随后更新其数据源以确保数据的一致性。
CQRS带来的挑战
事务一致性问题
在CQRS架构中,由于Command和Query系统是分离的,事务的一致性保证变得更加复杂。Command系统更新数据后,需要通过事件通知Query系统,这个过程中存在时间差,可能会导致数据在一段时间内不一致。如果业务对数据实时性要求极高,CQRS可能不是最佳选择。 此外,一个Command触发的事件可能需要在Query系统中更新多个数据模型,如果更新过程中出现失败,将导致数据长时间处于不一致状态,需要外部介入解决。
查询模型设计
CQRS允许我们为查询功能设计专门的数据模型,这通常意味着需要为每个查询接口设计一个数据视图。然而,随着查询接口的增多,这种设计可能会变得难以管理。因此,需要按照领域驱动设计(DDD)的原则,将属于同一领域的查询集中管理,或将其独立为微服务。
CQRS的优势与适用场景
CQRS模式在领域驱动设计(DDD)中经常被提及,其主要优势在于分离了领域模型和查询功能,使得复杂的查询可以摆脱领域模型的限制,以更简单的数据传输对象(DTO)形式展现查询结果。同时,它允许开发者根据查询需求自由选择数据存储引擎。 然而,CQRS也引入了额外的复杂性,如分布式事务处理、消息中间件管理以及数据模型设计等。在引入CQRS之前,需要对团队的技术能力和现有架构进行仔细分析,并针对短板进行提升。
结论
如果现有系统逻辑较为简单,主要是CRUD操作,那么CQRS可能并不适合。但如果业务系统庞大,业务流程复杂,逻辑繁琐,CQRS可以帮助清晰地划分领域模型和数据模型的边界,提高系统的可维护性和扩展性。
- 原文作者:知识铺
- 原文链接:https://index.zshipu.com/geek001/post/20240730/%E9%A2%86%E5%9F%9F%E9%A9%B1%E5%8A%A8%E8%AE%BE%E8%AE%A1%E4%B8%AD%E7%9A%84CQRS%E5%91%BD%E4%BB%A4%E6%9F%A5%E8%AF%A2%E8%B4%A3%E4%BB%BB%E5%88%86%E7%A6%BB--%E7%9F%A5%E8%AF%86%E9%93%BA/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
- 免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 sblig@126.com