首页 > 其他分享 >为什么要实践 A+ES & CQRS ?

为什么要实践 A+ES & CQRS ?

时间:2023-12-28 15:14:15浏览次数:35  
标签:同步 架构 框架 Wow 实践 业务 CQRS 领域 ES

Wow:基于 DDD & EventSourcing 的现代响应式 CQRS 架构微服务开发框架

Wow : 基于 DDD & EventSourcing 的现代响应式 CQRS 架构微服务开发框架

中文文档

领域驱动 | 事件驱动 | 测试驱动 | 声明式设计 | 响应式编程 | 命令查询职责分离 | 事件溯源

简介

Wow 是一个基于领域驱动设计和事件溯源的现代响应式 CQRS 微服务开发框架,历经多年生产环境验证。

旨在帮助开发者构建现代化的、高性能且易于维护的微服务应用程序,充分发挥领域驱动设计和事件溯源等模式优势的同时降低应用的复杂性以及实践成本。

值得一提的是,领域驱动设计和事件溯源并非微服务架构的专属,Wow 框架不仅适用于微服务开发,同样也可用于构建基于领域驱动设计的单体应用程序。

快速开始

使用 Wow 项目模板快速创建基于 Wow 框架的 DDD 项目

特性概览

Wow-Features

架构图

Wow-Architecture

背景

随着业务的发展和复杂性的增加,传统的架构和开发方式逐渐显露出瓶颈。领域驱动设计事件溯源等理念在提高系统设计的灵活性和可维护性方面表现出色,但在实践中常常需要面对复杂性和学习曲线的挑战。

Wow 框架的目标是以简单易用的方式将领域驱动设计和事件溯源等理念融入到微服务应用开发中,降低开发者的学习成本,提高开发效率。
通过提供现代响应式的 CQRS 架构和相关组件,Wow 框架旨在让开发者更专注于业务逻辑的实现,而不必过多关心底层技术细节。

经过多年的实践和不断的演进,Wow 框架在生产环境中得到了验证,积累了丰富的经验。这些经验和反馈不仅丰富了框架的功能和性能,也为持续的改进和优化提供了宝贵的指导。

对于开发者而言,Wow 框架意味着什么?

我曾告诫我的团队:如果我们过于依赖数据驱动设计而忽视领域驱动设计,我们最终将沦为CRUD工程师。

CRUD工程师的竞争力和可替代性可想而知,这或许是为何会有 35 岁效应,企业显然更倾向于招募没有太多生活羁绊、更加廉价的 25CRUD工程师。

业务价值

软件系统的核心价值体现在业务价值上,研发人员不应只关注技术实现上,而是应该更多地关注业务价值的实现。
这其中的好处显而易见,当你开发完一个业务系统之后,你将变成一个业务专家,甚至比跟你合作的领域专家还要专业,因为你需要洞察业务细节。

使用 Wow 框架,意味着你将关注点放在围绕领域模型设计上,与业务专家一起探索业务领域,而不是关注于技术实现上。
你仅需编写领域模型,即可完成服务开发,Wow 框架自动为你准备好 OpenAPI 接口。

在《实现领域驱动设计》一书中,作者 Vaughn Vernon 提到:核心域才值得投入精力进行领域驱动设计,
但如果你使用 Wow 框架,你将发现,因为低廉开发成本、快速的开发效率,即使是次要的支撑子域也值得 DDD

性能与伸缩性

随着业务的发展,你需要开始思考系统的性能和伸缩性问题。
在传统架构中,这牵扯到数据库关系模式、分片规则等复杂问题,同时你还需要处理因数据库分片导致的跨分片事务问题。
这时,你不得不修改你的业务代码,以适应水平拆分后的数据库架构。

然而,如果你选择使用 Wow 框架,你将不再需要过多关注数据库关系模式、分片规则等问题。你的业务代码无需变更,系统能够轻松实现水平伸缩。

你可以在这里了解更多关于 Wow 框架的性能

读写分离与同步延迟

读写分离是一种极为普遍的性能优化架构模式。
然而,同步延迟问题常伴随而来,事务执行成功后写库落库成功,但读库同步延迟,用户刷新页面后无法获取最新数据,从而对用户的体验产生影响。例如:

  • 用户发起下单事务,写库执行成功,但由于某种原因,读库同步延迟,用户刷新页面后发现订单未成功创建。
  • 商家编辑完商品后,同步到 Elasticsearch 索引库,但由于某种原因,同步延迟,导致商家刷新页面后搜索不到该商品。

通常,大家采用最简便的方法,等待1秒后刷新页面。
虽然这种方式能解决大多数数据同步延迟的问题,但效率不够高。
因为大多数情况下,同步在100毫秒内就已完成,剩余的900毫秒成了浪费
然而,有时1秒无法完成同步,这就导致用户获取的数据变得无效

使用 Wow 框架,你可以通过等待 PROJECTED 信号完成,然后再将结果返回给用户,以更为优雅和高效的方式处理数据同步延迟的问题。

工程质量

单元测试是确保代码质量且符合预期业务需求的重要手段,但在传统架构中,单元测试往往是一项相当困难的任务,因为你需要考虑数据库连接、事务管理、数据清理等问题。

使用 Wow 框架,你将会发现基于 Given->When->Expect 模式的测试套件,使得单元测试变得异常简单。
你只需关注领域模型是否符合预期,而无需为数据库连接等问题烦恼。

在实际应用中,我们将领域模型的单元测试覆盖率下限阈值设置为 85%,也是可以轻松实现的。

在没有刻意要求的情况下,开发人员甚至自觉地将覆盖率提升至 95%

因此,每次提交代码都变得轻松自在,因为你确信你的代码经过了充分的测试,并且真正意义上从单元测试中获得了收益。

在研发同级别的项目中,我们的测试团队在系统 API 测试中发现,基于 Wow 框架的项目,其 BUG 数仅为传统架构项目的 1/3

你可以在这里了解更多关于 Wow 单元测试套件

对于企业而言,Wow 框架意味着什么?

商业智能

商业智能是企业决策的关键支持,而数据则是商业智能的分析原料。业务数据越为丰富有价值,商业智能的分析结果越准确,决策也就更加可靠。

与传统架构有着显著差异,Wow 提供了实时聚合根状态事件(StateEvent)和聚合命令(Command)作为数据分析的数据源,同时极大降低了实时 ETLExtract, Transform, Load)的难度。

在传统架构中,实现实时 ETL 通常需要经过繁琐的流程,包括 DB->CDC->Process->DB,而在 Wow 框架中,仅需一段简单的 SQL 脚本即可完成这一过程。

另外,在传统架构中,使用 CDCMySql Binlog)数据仅记录数据的变化,缺乏明确的业务语义。进行业务分析时,需要基于数据状态的变化推断出业务语义,这往往需要进行大量的数据处理。
相较之下,Wow 框架直接提供了聚合根状态事件和聚合命令作为数据分析的数据源,极大降低了数据处理的难度。

Wow 提供的实时同步机制将数据实时同步至数据仓库(ClickHouse),为实时数据分析提供了极大的便利。这种方法为商业智能提供了强有力的支持,构建了一个实时数据分析系统,使决策制定能够基于及时而准确的信息。

你可以在这里了解更多关于 Wow 商业智能

操作审计

操作审计是企业中保障安全性和合规性的重要组成部分,同时也是对系统操作进行监控和追踪的关键手段。Wow 框架在这方面为企业带来了显著的优势。

通过记录聚合命令(Command)作为操作审计的数据源,Wow 框架能够详细追踪系统中的各种操作。
这些记录不仅包含了操作本身的内容,还涵盖了操作触发的副作用(领域事件),为审计提供了更为全面和准确的数据基础。

相较于传统审计方法,Wow 框架的操作审计的数据源具备更加明确的业务语义,以及操作后产生的明确领域事件。

此外,Wow 框架提供的实时数据同步机制也为操作审计带来了便利,确保了审计数据的及时性和一致性。

了解更多关于 Wow 操作审计

标签:同步,架构,框架,Wow,实践,业务,CQRS,领域,ES
From: https://www.cnblogs.com/Ahoo-Wang/p/wow-introduction.html

相关文章

  • James F. Kurose, Keith W. Ross著,陈鸣译,《计算机网络-自顶向下方法》(第6版),机械工业出
    JamesF.Kurose,KeithW.Ross著,陈鸣译,《计算机网络-自顶向下方法》(第6版),机械工业出版社,2014 n计算机网络课程学习什么?nn计算机网络是计算机专业和信息安全专业的专业基础课程,课程主要介绍计算机网络的基本原理和技术,通过对网络协议模型多层次功能结构的展开与探讨,详细介绍......
  • VMware vCenter Server 7.0、vSphere Client 7.0 修改会话超时时间(session timeout pe
    vCenterServer7.0(仅有vCenterServerAppliance和H5vSphereClien)使用SSH登录vCenterServerAppliance执行shell命令修改如下配置文件:vi/etc/vmware/vsphere-ui/webclient.properties修改如下内容:session.timeout=*value(默认120,单位分钟,例如修改为10080,7天)重启服......
  • Chrome 不能打开 kubernetes Dashboard 解决方法
    Chrome不能打开kubernetesDashboard解决方法步骤:mkdirkey&&cdkey#生成证书opensslgenrsa-outdashboard.key2048opensslreq-new-outdashboard.csr-keydashboard.key-subj'/CN=kubernetes-dashboard-certs'opensslx509-req-indashboard.csr-s......
  • 项目启动报错 No Spring Session store is configured: set the ‘spring.session.sto
    NoSpringSessionstoreisconfigured:setthe‘spring.session.store-type‘property项目启动为啥会报这个错误?这个错误信息表明你的SpringBoot应用程序没有配置SpringSession的存储类型。SpringSession是Spring框架提供的一个用于管理HTTP会话的组件,它可以与不同的存储......
  • 【Django进阶】djangorestframework-jwt使用
    简介Jsonwebtoken(JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资......
  • 项目中使用spring.session.store-type=redis和@EnableRedisHttpSession 的区别
    spring项目的session存在哪里SpringSession提供了多种存储策略,可以选择将session存储在内存、数据库或Redis缓存中。内存存储:这是默认的存储方式,适用于单个应用程序的情况。SpringSession会在应用程序启动时创建一个ConcurrentHashMap对象,用于存储session数据。JDBC存......
  • typeScript中map和filter的用法
    首先,这两个方法map()和filter()都是对调用他们的数组进行遍历。那么在项目中,什么情况下使用map(),又在什么情况下使用filter()呢?1、map()的使用方法:arr.map((item,index,array)=>{……})2、filter()的使用方法:arr.filter((item,index,array)=>{……})都是将函数写在方法的......
  • PostgreSQL pgbackrest 参数与优化 与 “小作文和售货员”
    最近热度最大的新闻,可能就是“小作文”和“售货员”,这里我特别想对曾经的某“售货员”曾经不经意说的一句话进行转载:“有些人很好奇,他们问我,谁给你写的那些小作文,我想说的是,如果公司能写好这样的句子,让我读的话,那么为什么公司不找一个长得比我更好看的主播来这里读,人们好像更愿意相......
  • cocoaPod 执行 pod install 时出现警告:The `XX [Release]` target overrides the `CLA
    最近执行Podinstall安装命令时,控制台输出警告信息:[!]The`XXX[Debug]`targetoverridesthe`CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES`buildsettingdefinedin`Pods/TargetSupportFiles/Pods-XXX/Pods-XXX.debug.xcconfig'.Thiscanleadtop......
  • 【flink番外篇】5、flink的window(介绍、分类、函数及Tumbling、Sliding、session窗口
    文章目录Flink系列文章一、maven依赖二、示例:基于数量的滚动窗口与滑动窗口1、滚动窗口实现地铁进站口人数1)、实现2)、验证步骤2、滑动窗口实现地铁进站口人数1)、实现2)、验证步骤三、示例:会话窗口1、实现2、验证步骤本文介绍了Flinkwindow基于数量的滚动、滑动窗口和会话窗口示......