发帖  主题  评论  推荐  标签 用户 查搜   用户 密码 自动 注册  
 
面向对象 设计模式 领域驱动设计 企业架构 框架 开发教程 微服务 大数据 扩展性 并发编程 事件驱动 分布式 CQRS

事件溯源Event Sourcing

  事件代表过去发生的事件,事件既是技术架构概念,也是业务概念。以事件为驱动的编程模型称为事件驱动架构EDA。

  一个事件代表某个已经发生的事情,在计算机系统中,事件是由一个对象表达,其包含有关事件的数据,比如发生的时间,地点等等。这个事件对象可以存在在一个消息或数据库记录或其他组件的形式中,这样一个对象称为"一个事件"。事件本身是不可变的值对象。  

  事件在技术架构上应用能提供无堵塞的高并发性能,如Nginx和Node.js,而Vert.x. 比 Node.js快好几倍?其他还有Event Stream Processing如Esper等,结合DDD实现的CQRS等。

  事件概念业务系统中应用,诞生领域事件和EventSourcing等DDD实现方式:通过引入事件,类似服务概念一样,跨越业务和技术鸿沟,同时又能表达面向函数编程思维。在业务上将事件和领域驱动设计DDD结合在一起,可以形成统一语言DSL,事件是触发状态变化的根源。

  领域事件是领域中发生的事件。如CustomerRelocated, CargoShipped, or InventoryLossageRecorded. 领域事件将领域模型的改变显式化,突出暴露出来。如下图:

领域事件

事务日志

  几乎所有数据库都支持高可用性集群,大多数数据库对系统一致性模型提供一个易于理解的方式,保证强一致性模型的安全方式是维持数据库事务操作的有序日志,理论上理由非常简单,一个事务日志是一系列数据更新操作的动作有序记录集合,当其他节点从主节点获得这个事务日志时,能够按照这种有序动作集合重新播放这些操作,从而更新自己所在节点的数据库状态,当这个事务日志完成后,次节点的状态最终会和主节点状态一致,

  这种事务日志非常类似于财务中记账模型,或者类似银行储蓄卡打印出来的流水账,哪天存入一笔钞票(更新操作),哪天又提取了一笔钞票(更新操作),最后当前余额是多少(代表数据库当前状态)。

  

Event Sourcing

  Event sourcing事件溯源是借鉴数据库事务日志的一种数据持久方式,在事务日志中记录导致状态变化的一系列领域事件。通过持久化记录改变状态的事件,通过重新播放获得状态改变的历史。 事件回放可以返回系统到任何状态。

  在ES中,事务单元变得更细粒度,使用一系列有序的事件来代表存储在数据库中的领域模型状态,一旦一个事件被加入事件日志,它就不能被移走或重新排序,事件被认为是不可变的,事件序列只能被追加方式存储。

 

  由于事件流本身具有逻辑上严格次序性,因此使用统一的事件流(事务日志)能够很自然实现事务机制,无需额外ACID机制或2PC之类同步强硬方式。

 

函数式编程

  在微服务等无状态应用架构中,我们不是需要状态时就发出命令从数据库中查询获得,这样,可变的状态会遍布整个应用代码中,带来很多副作用,而我们将这些状态操作统一为事件流声明式订阅,订阅了某个事件流,通过重播事件流中各个事件一直到最新最后的事件,也就获得了最终的状态。函数式编程Stream风格为这种播放提供了方便,具体Reactive框架有RxJS、React.js、RxJava、Reactor等等。

  这种实现其实已经在Reactive前端中有着同样实现思路,见:为什么要使用GraphQL和Falcor?,应用程序(微服务)将可变的状态被限定在一个单个的序列化对象中,从而整个应用就变成了无态,可变状态不会扩散到整个应用代码的各个本地变量中。

 

事件建模

  我们甚至可以使用领域事件直接对业务需求进行事件建模,通过事件功能的发现挖掘需求中深层次的概念。动态流的事件模型加上结合DDD的聚合实体 状态 和上下文场景Bounded context,我们实际上统一了需求分析和软件设计两个阶段的语言,使用这套统一语言分析需求以后,能够直接落地为代码,如下图是总结了在Jdon多位牛人的思想后的Jdon分析法:

event

  该图表达了用户操作者和被操作者事物之间的本质关系,以用户和购物车为案例,从购物车这个事物角度看:领域聚合实体表达的是购物车这个事物的分析设计方法,以一种静态结构性来表达事物;从用户购买者这个角度看:用户将选购的商品放入购物车,删除购物车已有商品,这些都是用户的操作行为,每一个操作行为相当于发出一个个命令command,在一定场景中转化为事件,事件会改变购物车状态,这是一种以动态行为(面向函数)来表达与人有关的需求。

 

相关文章

建模风暴(使用领域事件作为用户故事的建模案例)

事件风暴将掀起一场新革命

事件模型-下一个前沿

Jdon分析法

领域模型的行为设计

日志是每个软件工程师关心的统一数据抽象

通过实体快照实现事件建模

为什么使用Event Sourcing?

面向事件数据库Event Oriented Databases: 一种新的持久范式

Martin Fowler推荐的事件源Event Sourcing 架构:LMAX架构

Apache Kafka简单介绍

依赖注入与事件编程

事件驱动编程

Go Reactive宣言

Go 1.5的并发特性与案例(事件与转账)

使用Apache Samza对数据库进行彻底的"调教"

Lagom是一个集成ES/CQRS的Reactive微服务框架

比特币区块链是一种分布式的事件流日志

微服务的最终一致性与事件流

使用Spring Cloud和Reactor在微服务中实现EventSourcing

Twitter的分布式日志DistributedLog

如何理解Stream processing, Event sourcing, Reactive, CEP?

业务流程的新实现:微服务和事件编排

 

相关专题

领域事件专题

Event Sourcing专题

EventStore事件存储

Reactive专题

CQRS专题

Actor模型

事件模式

事件处理模式

状态模式

并发专题

异步编程

EDA专题

解道移动版 | 关注解道 | 联系解道 | 关于解道 | 广告联系 | 网站地图 | 设为首页

沪ICP证12033263 如有意见请与我们联系 Powered by JdonFramework
返回顶部