DDD - 六边形架构和CQRS架构
DDD - 六边形架构和CQRS架构
- 1. 六边形架构
- 2. CQRS
- 2.1 什么是CQRS
- 2.2 采用CQRS架构的一个前提
- 2.3 实现方式
- 2.4 CQRS的适用场景
- 2.5 CQRS架构的数据流
- 2.6 CQRS\ES - 架构演进
1. 六边形架构
六边形架构又称为端口-适配器,这个名字更容器理解。六边形架构将系统分为内部(内部六边形)和外部,内部代表了应用的业务逻辑,外部代表应用的驱动逻辑、基础设施或其他应用。内部通过端口和外部系统通信,端口代表了一定协议,以API呈现。一个端口可能对应多个外部系统,不同的外部系统需要使用不同的适配器,适配器负责对协议进行转换。这样就使得应用程序能够以一致的方式被用户、程序、自动化测试、批处理脚本所驱动,并且,可以在与实际运行的设备和数据库相隔离的情况下开发和测试。
六边形架构的核心理念是:应用是通过端口与外部进行交互的
。
在下图的六边形架构中,红圈内的核心业务逻辑(应用程序和领域模型)与外部资源(包括 APP、Web 应用以及数据库资源等)完全隔离,仅通过适配器进行交互。它解决了业务逻辑与用户界面的代码交错问题,很好地实现了前后端分离。六边形架构各层的依赖关系是由外向内依赖的。
六边形架构将系统分为内六边形和外六边形两层,这两层的职能划分如下:
- 红圈内的六边形实现应用的核心业务逻辑;
- 外六边形完成外部应用、驱动和基础资源等的交互和访问,对前端应用以 API 主动适配的方式提供服务,对基础资源以依赖倒置被动适配的方式实现资源访问。
六边形架构的一个端口可能对应多个外部系统,不同的外部系统也可能会使用不同的适配器,由适配器负责协议转换。这就使得应用程序能够以一致的方式被用户、程序、自动化测试和批处理脚本使用。
2. CQRS
2.1 什么是CQRS
CQRS,作为一种战术办法,是实现DDD建模领域的最佳途径之一。事实上,它就是因为这个目标而诞生在这个世界上。
CQRS本身只是一个读写分离
的架构思想,全称是:Command Query Responsibility Segregation,即命令查询职责分离
,表示在架构层面,将一个系统分为写入
(命令)和查询
两部分。一个命令表示一种意图,表示命令系统做什么修改,命令的执行结果通常不需要返回;一个查询表示向系统查询数据并返回。
CQRS架构中,另外一个重要的概念就是事件
,事件表示命令操作领域中的聚合根,然后聚合根的状态发生变化后产生的事件。
2.2 采用CQRS架构的一个前提
由于CQRS架构的一致性模型为最终一致性,所以,你的系统要接受查询到的数据可能不是最新的,而是有几个毫秒的延迟。之所以会有这个前提,是因为CQRS架构考虑到,作为一个多用户同时访问的互联网应用,当在高并发修改数据的情况下,比如秒杀、12306购票等场景,用户UI上看到的数据总是旧的。比如你秒杀时提交订单前看到库存还大于0,但是当你提交订单时,系统提示你宝贝卖完了。这个就说明,在这种高并发修改同一资源的情况下,任何人看到的数据总是Stale的,即旧的。
2.3 实现方式
CQRS作为一种架构思想,可以有多种实现方式:
最常见的CQRS架构是数据库的读写分离;
系统底层存储不分离,但是上层逻辑代码分离;
系统底层存储分离,C 端采用 Event Sourcing 的技术,在 EventStore 中存储事件;Q 端存储对象的最新状态,用于提供查询支持;
Event Sourcing - 事件溯源:
- 不保存对象的最新状态,而是保存对象产生的所有事件;
- 通过事件溯源(Event Sourcing, ES)得到对象最新状态。
2.4 CQRS的适用场景
当我们的应用的写模型和读模型差别比较大时;
当我们希望实践DDD时;因为CQRS架构可以让我们实现领域模型不受任何ORM框架带来的对象和数据库的阻抗失衡的影响;
当我们希望对系统的查询性能和写入性能分开进行优化时,尤其是读/写比非常高的系统,CQ分离是必须的;
当我们希望我们的系统同时满足高并发的写、高并发的读的时候;因为CQRS架构可以做到C端最大化的写,Q端非常方便的提供可扩展的读模型。
这里我主要分享的CQRS架构是上面第3种实现方式,也就是上图所画的架构。在我心目中,只有第三种才是真正意义上的CQRS架构。
2.5 CQRS架构的数据流
C 端的命令的执行流程
客户端如(MVC Controller)发送命令通知系统做修改:
- 发送命令到分布式MQ;
- 然后命令的订阅者处理命令;
- 订阅者内部根据不同的命令调用不同的 Command Handler 进行处理;
- Command Handler 内部根据命令所指定的聚合根 ID 从 In-Memory 内存中直接获取聚合根对象的引用,然后操作聚合根对象;
- 聚合根对象状态发生变化并产生事件;
- 框架负责自动持久化事件到 Event Storage(简称EventStore);
- 框架负责将事件发布到 Event MQ;
- Event 订阅者订阅事件,然后调用对应的 Event Handler 进行处理,如更新 Data Storage(保存了聚合根的最新状态,通常叫读库,ReadDB)。
Q端的查询的执行流程
客户端如(MVC Controller)发出查询请求系统返回数据:
- 调用轻薄的 Query Service,传如 Query DTO;
- Query Service 从读库进行查询并返回结果。
读库可以有很多种,依据我们的业务场景来选择:比如关系型DB、分布式缓存等NoSQL、搜索引擎,etc。
2.6 CQRS\ES - 架构演进
DDD - 六边形架构和CQRS架构相关推荐
- 分层架构、六边形架构、CQRS架构模式解读
DDD DDD(Domain Driven Design,领域驱动设计)作为一种软件开发方法,它可以帮助我们设计高质量的软件模型.在正确实现的情况下,我们通过DDD完成的设计恰恰就是软件的工作方式. ...
- 「领域驱动设计」DDD,六边形架构,洋葱架构,整洁架构,CQRS的整合架构
这篇文章是软件架构编年史的一部分,一系列关于软件架构的文章.在这些文章中,我写了我对软件架构的了解,我如何看待它,以及我如何使用这些知识.如果您阅读了本系列以前的文章,那么本文的内容可能更有意义. 大 ...
- DDD CQRS架构和传统架构的优缺点比较
DDD CQRS架构和传统架构的优缺点比较 https://mp.weixin.qq.com/s?src=3×tamp=1503011877&ver=1&signat ...
- DDD进阶_DDD分层架构、整洁架构、六边形架构
DDD从入门到精通,系列文章传送地址,请点击本链接. 本文主要讲解微服务不同架构下的特点,如果还不了解DDD分层架构的,请先学下DDD的分层架构 目录 一.整洁架构 二.六边形架构 三.三种微服务架构 ...
- 【转】阿里技术专家详解DDD系列 第二讲 - 应用架构
填坑.谢谢大家对这个系列的期待,持续更新,欢迎关注此账号. 第一篇内容附地址: 阿里巴巴淘系技术:阿里技术专家详解 DDD 系列 第一讲- Domain Primitivezhuanlan.zhih ...
- 【转载】阿里技术专家详解DDD系列 第二讲 - 应用架构
目录 1. 案例分析 1.1 问题1-可维护性能差 1.2 问题2-可拓展性差 1.3 问题3-可测试性能差 1.4 总结分析 2.重构方案 2.1 抽象数据存储层 2.1.1 Repository和 ...
- CQRS架构下Equinox开源项目分析
一.DDD分层架构介绍 本篇分析CQRS架构下的Equinox开源项目.该项目在github上star占有2.4k.便决定分析Equinox项目来学习下CQRS架构.再讲CQRS架构时,先简述下DDD ...
- ASP.NET Core Web API下事件驱动型架构的实现(四):CQRS架构中聚合与聚合根的实现
在前面两篇文章中,我详细介绍了基本事件系统的实现,包括事件派发和订阅.通过事件处理器执行上下文来解决对象生命周期问题,以及一个基于RabbitMQ的事件总线的实现.接下来对于事件驱动型架构的讨论,就需 ...
- 谈一下关于CQRS架构如何实现高性能
CQRS架构简介 前不久,看到博客园一位园友写了一篇文章,其中的观点是,要想高性能,需要尽量:避开网络开销(IO),避开海量数据,避开资源争夺.对于这3点,我觉得很有道理.所以也想谈一下,CQRS架构 ...
最新文章
- C#流程控制语句--跳转语句(break,continue,goto,return,)
- 【SDOI2014】数表【莫比乌斯反演】【树状数组】
- Linux监控工具介绍系列——smem
- 爬虫插件-XPath Helper下载与安装
- 深入理解 PHP7 unset 真的会释放内存吗?
- 使用WPF创建画图箭头
- 正则表达式之全部符号解释
- java 无领导小组面试,无领导小组讨论面试前的准备不包括:( )
- golang报错:slice bounds out of range
- 华为云服务器最新信息,查询云主机信息
- 个人怎么做微信小程序?
- Mac笔记本外接显示器竖屏设置
- 7.4 一阶线性微分方程
- android 【禁止横屏和竖屏切换】
- 【USACO 2017 December Gold】A Pie for a Pie题解
- Charles的下载安装配置大全
- Java实现多线程的两种方式讲解
- Libnet 1.1教程
- LuaJIT分支和标准Lua有什么不同?
- win7官方原版iso镜像_建议收藏!微软 Win10 版本 2004 正式版官方 ISO 镜像下载大全...
热门文章
- html界面等待状态,html页面Loading效果实现:加载新页面前的等待过渡画面
- ASM 1——概念简介
- 跨考没有计算机二级,计算机二级可以跨学校报名吗 计算机二级可以跨校报考吗?...
- 美元指数高位盘整 黄金踩下回落“急刹车”
- 杭电ACM基础题(2096、2097、2098、2099、2101、2103、2106、2107、2109、2113)
- Eureka相关总结
- opencv2413 gpu mog2_gpu CascadeClassifier_GPU
- 一文深度学习建模预测全流程(Python)
- SpringBoot整合邮件发送功能
- SpringBoot整合Gitee图床