ENode 2.6 架构和计划简介和全新案例分享

前言

ENode是一个施用开发框架,为开发人士提供了一整套遵照DDD+CQRS+ES+EDA架构风格的解决方案。ENode从披露1.0起至今之几近鲜年时,我几周周皆以更新规划或实现代码。以至于一直没有一个安定之本子可以提供给我们,分外惭愧。但自我深信,随着岁月的延期和自己的鼎力的累积,ENode一定会愈来愈稳定跟成熟的。我认为自身这时良甜蜜,因为自起和好的志趣还暴发机遇在业余时间为了协调之趣味而努力。

ENode开源地址:https://github.com/tangxuehua/enode

今是独称心快意的小日子,因为自毕竟下ENode开发有了一个比起说服力的实在案例,一个在线会议地方管理与预订系统。该案例和微软的Microfost CQRS
Journey案例
的法力雷同,只是是故ENode开发完成的。目标是以显得:

  1. 什么样使用ENode援助DDD领域层的实现;
  2. 怎么着运用ENode实现CQRS+ES的架;
  3. 怎用ENode实现事件驱动的架(EDA);

其余,在案例开发过程遭到,也不停发现了ENode,
EQueue的重重题材。所以,通过开此案例,也协理ENode,
EQueue完善了成百上千。真是要举办才可以向上啊!

图片 1

ENode架构简介

ENode时之架构已同最初的1.0本子有较充分的歧异了。比如,没有了对Redis的倚重,增添了Command
Store的设计。最新版本的ENode架构图如下:

图片 2

深谙CQRS架构的口应该针对斯图无绝陌生。需要强调的发些许触及:

  1. 新版的架构图中,Domain
    Aggregate是常驻内存的;聚合根的职责就是是包状态、业务规则,同时暴发领域事件;
  2. 增产了一个Command Store,用于落实Command的幂等处理;

至于图备受的别样部分的介绍,请参考我事先写的有关ENode体系的篇章。 

背景

日前直接在构思,工作这么长年累月生碰到的分布式系统的一念之差题材,以及针对这个题材提供的化解方案。
借这会,顺便梳理清楚那块文化,希望以及大家一块儿追下

ENode关键特性

  1. 心想事成了CQRS架构,补助分布式,基于队列的水平扩大,框架设计之新即考虑了架的相继节点的品位扩大;
  2. 面向高并发设计;架构层面,充裕考虑到了何等化解现身问题;通过用EQueue实现服务器之间的音路由、通过单机内部贯彻类似Actor
    Mailbox的计划,从而避免起的起。提升CQRS架构C端的圆写副吞吐量;即使在一些最气象下冒出并发问题,也援助电动的开阔检测,并自行重试;另外,架构层面,规定一个command只可以干一个聚合根的改动,从而规范行使开发者必须从严遵照音信令之思路来落实复杂的业务流程,而休克应用工作单元的法门,以作业之法门实现数量的胜一致性;

  3. 小心谨慎的信息幂等处理帮助;由于ENode是信让的架,所以针对音讯的幂等性处理,是框架关注之一个根本的端,并当架设层面做了支撑。这使得应用开发人员不必担心音讯的重处理带来的问题。

  4. Domain
    Aggregate常驻内存;那一个计划好增强C端command的处理性能。因为我们不用像风的方这样先管聚合根从db取出来,再修改,再保存回去了;
  5. 框架为开发人士显示了什么样重新好之贯彻Sagas,在CQRS架构中,Sagas指基于信息让之业务流程;一个Saga包含多少个聚合根以及一个(平常)流程管理器(Process
    Manager);聚合根维护流程中之有着加入者对象的状态与流程本身的状态,流程管理器负责定义及实现流程控制逻辑,无状态;流程管理器的实现是经响应事件、至极、应用层音讯,然后发送相应的指令,从而实现信息让的流水线;
  6. 用伊芙nt
    Sourcing(简称ES)的方法来持久化聚合根状态;通过ES实现聚合根状态的还原以及通用的面世控制,通过聚合根ID+事件版本号作为唯一索引的思路实现乐观并作控制;
  7. 信息除了command, domain event外,还帮忙exception message,
    application message;这有限种植音信是我们于境遇有些消息不合乎用domain
    event来表述时要拔取及;比如聚合里有时我们假诺改某状态前会先开作业规则的反省判断,假设无合法,平日会扔大,然后是很我们还要希望可以被流程管理器知道,从而流程管理器可以做前面的回滚或补给办法;此外,我们偶尔可能相会以动用规模(command
    handler里)及外外部系统发出互相,这互相的结果,使用应用层的信又合理;ENode在架设层面,对端这一个信做了联合的协助;
  8. 框架提供重返单个command执行结果跟阻塞等待command执行结果的补助,这些对于开发者希望同施行command并领悟command执行结果的时候,卓殊有帮忙;这样开发者就毫无自己去轮训了。
  9. 除去对信息的幂等处理的辅助他,ENode对domain
    event的相继处理,也举行了尽量的设想同支撑,确保当C端有的domain
    event同步到Q端时,Q端处理时,框架层面能管Q端的处理顺序不汇合乱序。从而保证C,Q两端的数是最终一致的;
  10. 担保音信会至少让处理同赖;紧要思路是承保音信的:1)持久化;2)新闻ACK后才当曾花;
  11. 协助一个聚合根一蹩脚可来五只domain
    event;尽管大部分动静,一个聚合根五回等只会合生一个domain
    event,但稍事场景,可能会面有两单或多单。此时,这多少个事件会因一个事件流的法门一并apply到当下聚合根;同时,在Q端,框架为相会经必要的伎俩,与用户代码一起包了轩然大波流中的风波的拍卖顺序的不易;
  12. ENode所使用的分布式音讯队列EQueue,参考了阿里底RocketMQ的架构思想,具有强性能、可扩展、轻量级的特征,协助非给压机器内存大小的音信堆积能力,而且是纯C#支付。同时还提供了简约实用的管理控制台,可以叫大家轻松的管制音讯队列。比如可好的动态扩充、禁用、启用、删除队列,查询新闻内容、新闻消费进度,等音讯;近日,EQueue也就通过差不六只迭代,并且都生真用户举行下,效率为主趋向成熟稳定。

广一致性问题

Conference案例简介

Conference是一个微软开发的,基于DDD+CQRS+ES的一个开源项目。项目主页:cqrsjourney.github.io

本条路,对大家我们学习DDD领域让设计、CQRS+ES的架构,非凡有补助。

  • 该案例从工作达成,实现了一个典型的电子商务系统的关键环节:商品管理、库存管理、下单、减库存、支付;
  • 欠案例从技术上,很好的示了CQRS架构的助益。比如可以Q端定制不同的视图,以应对不同的询问需要;
  • 欠案例很好的通向我们来得了怎么分割领域,划分边界及下文(bounded
    context),并怎么着使用不同之架构技术,实现不同之上下文,非凡富有学习价值。

幸亏因为那一个类另外如上优点,让自家来趣味使用ENode作为技术襄助,实现均等听从的网。在重复写的经过中,保留了所有非技术的东西,比如疆及下文的剪切、领域层等;所有技术有关的一部分,用ENode替代。

应用ENode实现之Conference开源项目地址:https://github.com/tangxuehua/conference

演示地址,后台:http://www.enode.me/conference,前台:http://www.enode.me/registration

指望有趣味的同室,可以去下载源代码举行探讨。领会ENode,最抢的主意就是是自案例代码初叶。如果想拓展交换,可以加QQ群:185916873,随时欢迎有趣味的道友参加。

末尾,贴一个Conference案例中订单处理的Sagas流程图:

图片 3

匪早了,实在写不下去了,就顶就吧。

 

产订单减库存

于我们召开的电商系统遭到,会出诸如此类的一个观:用户下单购买有商品,然后举办禁闭减商品库存的场景。

  • 若果先下订单,然后扣减库存,会促成超卖
  • 假若生订单失利,扣减库存成功,那么会招致少卖

当时简单种情景的发出都会师造成我们系出现一致性的题材,严重的口舌,需要对用户做出肯定的经济互补。

调用超时

工作支付之经过中,肯定会起咱保障的劳务调用其他团伙的劳动,尽管以机房内举办网络调用,也如故多或丢失之留存网调用超时的场景,如若出现那样的景色,我们该怎么解决也?

釜底抽薪一致性问题的思绪

酸碱中以及

ACID : 酸, BASE:碱,其实就是是酸碱中和的法则

1. ACID

ACID,是凭借数据库管理系列于写入数据经过中,为保工作是没错可靠性。
所不可不有所的季单特点:

  • A: Atomicity 原子性
    一个事情(transaction)中之具备操作,要么全体到位,要么全体勿成功,不会面完结于中游有环节
  • C: Consistency 一致性
    事务初始从前与事情了后,数据库的完整性没有叫破坏
  • I: Isolation 隔离性
    数据库允许多独冒出事务同时针对该数据开展读写及改的能力,隔离性可以制止多单业务并发执行时由交叉执行要造成数据的非一样。事务隔离分为差级别,包括读不提交(Read
    uncommitted)、读提交(read committed)、可再一次读(repeatable
    read)和串行化(Serializable)
  • D: Durability 持久性
    事务处理停止后,对数码的修改就是永恒的,虽然系统故障为无会面少

像 MySQL、Oracle 这样提到项目数据库是永葆 ACID
特性的强一致性要求的。本身强一致性就未允出现不一致性的题目,底层都是因而MVCC 来控制落实之

凑巧下边提到的下订单减库存就可提到项目数据库的大一致性来缓解。将订单声明及库存表放在一个数据库
Instance 中,通过数据库 ACID 的特性来化解少卖或者超卖的题目。

只是一旦遇上数据量相比较老的气象怎么处置?订单讲明出差不多摆设,我们欠怎么解决吧?

实在,即便撞订单注明举办拆分,我们得一如既往以数据库 ACID
的特征来解决。怎么动手?我们可用订单表明底拆表维度与库存表的拆分维度控制在一个数目分片中,然而实际怎么拆分呢?需要各位遵照自己的事情规则来分开来

2. BASE

BASE 思想解决了 CAP 指出的分布式一致性与可用性不可能而兼的题目。BASE
思想及 ACID 思想完全不同,它事实上是满足 CAP
理论,通过牺牲强一致性来换取可用性。
BASE 理论:

  • BA:Basically Available,基本可用性
  • S: Soft State 软状态 接受状态在一段时间内部共
  • E:伊夫(Eve)ntually Consistent 最后一致性
    在自然之年华窗口中,最后数额及一致即可

软状态是贯彻 BASE 的艺术,基本可用域最后一致性是得抵达的靶子。以 BASE
的思辨由于无保险高一致性,所有受系统于自然时间内数据有未雷同,不过以处理要的历程被,需要记录理解每一趟要的状态,以后出现问题的时候,回滚到中等任何临时状态,达到最后一致性

3. CAP

当我们服务提升进一步多,是不可制止就会合用以劳动开展拆分。一旦服务开展拆分后,它便非以是一个单机的连串,而是通俗意义上之分布式系统。说及分布式系统,大家得要说下最经典的罪名理论。假若自身都无耳闻了帽子理论,我出门还无好意思打招呼。
分布式系统 CAP 理论:

  • C: Consistence 一致性 所有节点访问同一客最新的数据副本
  • A: Availability 可用性
    每一回要都可以以简单的辰外得到到应——可是未包收获之多少吧流行数据
  • P: Network partitioning 分区容错性
    即使网络达到有部分新闻丢失,但依然可持续做事

CAP 原理表明:分布式系统只可以满足三码中之星星码而非容许满意所有叔起。精通CAP 理论的顶简便方法虽然是想象两独节点处 2
个机房中。允许至少一个节点更新状态会导致数据不同等,即丧失了 C
性质。若是为保证数据一致性,将分区一侧的节点设置也未可用,那么又丧失了
A 性质。除非两单节点可以相互通信,才会既保C 又保
A,这同时会晤招致丧失P性质。

总结

此次小说介绍 ACID、CAP 和 BASE 思想。在风俗数据库领域受到接纳 ACID
理论,追求大一致性。然则当大型分布式系统中,接纳 BASE
的规划思想,通过牺牲强一致性来博取高可用性及最终的一致性。二种设计理念了不同,我们用基于自己的政工场景,来支配到底哪用艺术。

参考

  • 分布式服务架构原理、设计与实战

发表评论

电子邮件地址不会被公开。 必填项已用*标注