.NET现代化应用开发 - CQRS&类目管理代码剖析

本周MASA Framework 进行了第四次课程直播,课程主题为类目管理的开发,直播中进行了理论讲解和实战演练(CQRS实践的演示可直达推文底部观看直播回放)

开始环节我们围绕三个点介绍CQRS的原理

首先,我们先对之前的事件流概念进行简单的回顾

事件风暴回顾 - 事件流

接下来到我们本节课的主题内容

CQRS

命令查询职责分离

大白话:读和写分开

信息来源:https://docs.microsoft.com/zh-cn/azure/architecture/patterns/cqrs

.NET现代化应用开发 - CQRS&类目管理代码剖析_第1张图片

优势

1.独立缩放
2.根据读写分别优化数据结构
3.更轻松地确保仅正确的域实体对数据执行写入
4.关注点分离,读关注读取性能,写关注复杂业务逻辑
5.物化视图的读模型可有效减少复杂的表链接

什么时候用

1.源于访问频次、数据量或者是数据模型数量等因素导致查询和更新的需求差距逐渐变大
2.最大限度地提高性能
3.控制细粒度的缩放
4.控制不同应用的安全级别
5.降低多开发者协作冲突,事件的粒度可以足够细

注意

1.命令应基于任务,而不是数据
2.命令可入队,使用异步而非同步
3.查询不包含修改动作和领域知识
4.事件溯源支持重播,比如用于通知读模型

事件溯源

只追加存储来记录对数据采取的完整系列操作

而不是仅存储域中数据的当前状态

.NET现代化应用开发 - CQRS&类目管理代码剖析_第2张图片

优势

1.事件不可变
2.事件有助于领域专家了解过程
3.事件只增不改,不需要考虑并发冲突
4.事件存储有助于监控数据变化
5.事件重播可轻易的对系统状态进行还原,调试,测试
6.事件可被不同的应用多次,异步消费

注意

1.事件驱动是异步的,读模型会有一定程度的延迟
2.修改事件的唯一方式只能通过补偿事件
3.事件顺序至关重要,事件存储有责任保证事件顺序完整性

不管是上面讲到的CQRS,还是事件溯源,这些都是为事件驱动做准备

事件驱动

  

事件驱动的小知识点

事件驱动里有一些值得注意的点

事件不等于 命令

1事件不会告诉订阅者如何做
2.事件只通知某个事件发生了
3.事件是不可变的

4.事件被执行时,可能会产生新的事件并形成事件流

事件标准化

支持过滤/转换/查询等

事件其实是需要标准化的,那有没有标准呢?

那就是CloudEvents

CloudEvents

包含了事件发生的上下文和相关数据,事件代表了已发生的事实,不包含任何目的地相关信息。消息能够传达事件内容,从而将事件数据从源头传输到指定的目的地

1.发送的消息符合规范,那么它就是一个有效的 CloudEvent

2.支持的云厂商包括微软,谷歌,阿里,甲骨文等

那我们来看事件和订阅者的关系,事件和订阅者可以是一对多、一对一、多对一,但事实上事件和订阅者的关系是多对多

事件驱动的使用场景

微服务解耦,跨集群通信

兼顾遗留,系统对接

游走在云与非云中

部分 AOP类场景

流计算

Event Bus

简单来说,Event Bus主要的功能是接收消息、处理消息、转发消息,作为发布者和订阅者中转站的角色

发布订阅模式

发布者通过调度中心将消息发送给订阅者。调度中心解决发布与订阅者之间的关系,保证消息可以送达订阅者手中

最常见的是并行执行顺序执行

.NET现代化应用开发 - CQRS&类目管理代码剖析_第3张图片

MASA 事件处理

MASA 是如何进行事件处理的?

MASA 事件处理主要分为两部分一个是MASA Dispatcher,另一个是MASA DDD

.NET现代化应用开发 - CQRS&类目管理代码剖析_第4张图片

MASA Dispatcher>>

Event Bus>>进程内事件总线

Integration Event Bus>>集成事件总线(跨进程)

MASA DDD>>Domain Event Bus>>领域事件总线(自动协调进程内事件和集成事件调度)

通过前面的学习,我们已经了解了Event Bus 和MASA 事件处理流程,那MASA Event Bus 是怎么样的一个事件流程?

MASA Event Bus

.NET现代化应用开发 - CQRS&类目管理代码剖析_第5张图片

发布者把事件发布到Even Bus

关系链表
支持特性Handler
中间件
分布式事务
UoW
更多...

发送到订阅者

本次课程内容到这里就全部结束,CQRS实战演示部分可以点击下方链接,观看直播回放。

.NET现代化应用开发 - CQRS&类目管理代码剖析_哔哩哔哩_bilibili

你可能感兴趣的:(framework,MASA,Framework,.net,CQRS)