DDD理论学习种类(9)– 领域事件

在中国共产主义青年团河北大学习委员员会的团协会下,抱着对于雄安新区的感叹和非物质文化遗产的志趣,大家跟随雄安新区非遗调查钻探队于十三月6日赶往安固始县城,深入雄安新区,实地考察了雄安新区的非物质文化遗产。

DDD理论学习种类——案例及目录

一方水土培养一方文化


笔者们本次担负观望标是安卫东区光淀村的唐剧。说起老调,在省里基本每种市、每种县、每种村都不翼而飞,甚至在局地所在其风头盖过了“国粹”——北昆。作为辽宁地点戏种,上四调在河南极端流行,乃至于能够与西路四股弦、河南曲剧等强势戏种分庭抗礼,因而我们能够看到,其具备深厚的公众基础。西调由流入西藏的山陕梆子演变而成,形成于清清宣宗年间。山陕梆子流入海南后,在遥远的演出进度中,为了取安妥地民众的赏爱,根据当地群众的语言习惯、情趣、爱好等,在措施上开始展览持续创新、创制,融合了黑龙江地区的民俗和特色,形成了唐剧。韩吏部在《送董邵南序》说:“燕赵古称多感慨悲歌之士”,安徽那片土地义士之多,也影响了唐剧具有高亢、激越、慷慨、悲忍的性状。

1. 引言

A domain event is a full-fledged part of the domain model, a
representation of something that happened in the domain. Ignore
irrelevant domain activity while making explicit the events that the
domain experts want to track or be notified of, or which are
associated with state change in the other model objects.
天地事件是四个世界模型中极其主要的部分,用来代表领域中发出的轩然大波。忽略不相干的圈子活动,同时鲜明领域专家要盯住或期望被打招呼的事体,或与别的模型对象中的状态更改相关联。

本着官方释义,大家得以理出以下多少个宗旨:

  1. 天地事件作为世界模型的关键片段,是领域建立模型的工具之一。
  2. 用来捕获领域中早已发生的事体。
  3. 并不是圈子中具备发生的政工都要建立模型为世界事件,要不经意没有工作务价值的事件。
  4. 天地事件是领域专家所关切的(要求跟踪的、希望被公告的、会滋生其余模型对象改变状态的)发生在圈子中的一些思想政治工作。

简简单单,领域事件是用来捕获领域中产生的富有业务价值的某些政工。它的本来面目便是事件,不要将其复杂化。在DDD中,领域事件视作通用语言的一种,是为着清晰表明领域中发生的事件概念,援救我们深切通晓领域模型。

大家本次调研地处在白洋淀的最深处,三面环水,水面上有大片大片的芙蓉和荷叶,大有“接天莲叶无穷碧,映日荷花别样红”的风光,村子里也根本卫生,不像某个农村泥泞随地,灰尘漫天。这里的老乡绝超过1/4都热衷横岐调,甚至于北昆在那里都没有何样“市场”。本来认为光淀村四面环水,会坐船过去,徜徉荷花淀之间,后来发觉有陆路直达,乡下的路也很颠簸,一路上述除了出了一些小地方之外,照旧比较顺遂的,沿途的山山水水也忽然的赏心悦目。

2. 认识世界事件

当用户在购物车点击结算时,生成待付款订单,若支付成功,则更新订单状态为已开发,扣减仓库储存,并推送捡货通告新闻到捡货中央。

在那个用例中,“订单支付成功”正是四个天地事件。

考虑一下,在你没有接触领域事件或EDA(事件驱动架构)以前,你会怎么贯彻那个用例。肯定是粗略直接的方法调用,在1个事务中分别去调用状态更新方法、扣减仓库储存方法、发送捡货布告方法。那无可厚非,终归此前都以如此干的。

那那样设计有如何问题?

  1. 试想一下,若未来供给开发成功后,需求万分发送一条付款成功通知到微信公众号,大家怎么落到实处?想必大家要求分外定义发送微信文告的接口并打包参数,然后再添加对方法的调用。这种做法纵然能够缓解必要的改变,但很鲜明不够利索耦合性强,也违背了OCP。
  2. 将两个操作放在同三个事情中,使用工作一致性能够确认保证四个操作如故全部得逞或然全体失利。在1个作业中处理多个操作,若里面三个操作退步,则全部受挫。不过,那在作业上是不允许的。客户成功开发了,却发现订单如故为待付款,这会造成纠纷的。
  3. 违反了汇聚的一大标准:在二个政工中,只对1个凑合举行修改。在这几个用例中,很显著大家在三个作业中对订单聚合和仓库储存聚合进行了修改。

那什么样缓解这几个题材?大家能够依靠领域事件的力量。

  1. 解耦,能够由此发布订阅方式,发表领域事件,让订阅者自行订阅;
  2. 透过世界事件来完成最终一致性,提升系统的平稳和性情;
  3. 事件源点;
  4. 等等。

上边我们就来一一永不忘记。

那么些泛黄的老剧本是知识的薄厚

3.建模领域事件

哪些利用领域事件来解耦呢?
自然是包裹不变,应对万变。那针对地点的用例,不变的是怎样,变的又是如何?不变的是订单支付成功这些事件;变化的是针对性那几个事件的例外处理手段。

而大家要怎么着封装呢?
此时大家就要理清事件的精神,事件有因必有果,事件是由事件源和事件处理组合而成的。通过事件源我们来甄别事件的起点,事件处理来代表事件造成的下一步操作。

图片 1

到了村口,张老师便热情地来接村口大家了,张老师为人和善,笑眯眯地把我们领到了村民族事务委员会员会办公室,村干们一致热情地与我们打了照料,对大家表示欢迎,并且全程陪同着解答一些难点。其后咱们便开始了行业内部的采集,张老师和颜悦色,相当的苦口婆心地逐一为大家做出回复,讲解了光淀村上四调的来源发展和现状,以及讲河北乱弹的宗派、特点。

3.1. 华而不实事件源

事件源应该至少含有事件发生的光阴和接触事件的靶子。我们领到IEventData接口来封装事件源:

/// <summary>
/// 定义事件源接口,所有的事件源都要实现该接口
/// </summary>
public interface IEventData
{
    /// <summary>
    /// 事件发生的时间
    /// </summary>
    DateTime EventTime { get; set; }

    /// <summary>
    /// 触发事件的对象
    /// </summary>
    object EventSource { get; set; }
}

透过落实IEventData大家能够依照本身的内需添加自定义的轩然大波性质。

提起武安落子生存的现状,张老师告诉大家,首先学戏的人越来越少,因为那一个演出是不毛利的。年轻人们也更为不爱下苦功钻研,很多刀客锏都接近失传。比起以前的时候四股弦的情状不容乐观,可是与其他地方比较,光淀村里依然是一片沃土。全国梆子专业协会里的有个别正式艺人,都是从光淀村走出来的。说到此处,张老师喜出望各州笑了。

3.2. 华而不实事件处理

针对事件处理,我们领到3个IEventHandler接口:

 /// <summary>
 /// 定义事件处理器公共接口,所有的事件处理都要实现该接口
 /// </summary>
 public interface IEventHandler
 {
 }

事件处理要与事件源实行绑定,所以大家再来定义二个泛型接口:

 /// <summary>
 /// 泛型事件处理器接口
 /// </summary>
 /// <typeparam name="TEventData"></typeparam>
 public interface IEventHandler<TEventData> : IEventHandler where TEventData : IEventData
 {
     /// <summary>
     /// 事件处理器实现该方法来处理事件
     /// </summary>
     /// <param name="eventData"></param>
     void HandleEvent(TEventData eventData);
 }

以上,我们就做到了世界事件的空洞。在代码中大家通过落到实处3个IEventHandler<T>来发布领域事件的定义。

“对于光淀村唐剧的之后向上,您是抱着怎么样的眼光?”

3.3. 天地事件的公布和订阅

领域事件不是凭空发生的,它有二个宣布方。同理,它也要有三个订阅方。

那怎么样和订阅和揭发领域事件吧?
领域事件的发布能够应用揭露–订阅格局来达成。而正如宽泛的兑现情势正是事件总线

图片 2

事件总线是一种集中式事件处理机制,允许分歧的机件之间举行相互通讯而又不须求相互依赖,达到一种解耦的目标。伊芙nt
Bus就约等于2个在于Publisher(发表方)和Subscriber(订阅方)中间的大桥。它隔开分离了Publlisher和Subscriber之间的直接依赖,接管了具备事件的文告和订阅逻辑,并负责事件的转向。

此地就简单说美赞臣下风浪总线的贯彻的中央:

  1. 事件总线维护1个事变源与事件处理的投射字典;
  2. 因此单例格局,确定保障事件总线的唯一入口;
  3. 动用反射或借助注入实现事件源与事件处理的开始化绑定;
  4. 提供联合的风浪注册、撤废注册和接触接口。

终极,大家看下事件总线的接口定义:

public interface IEventBus
 {
    void Register < TEventData > (IEventHandler eventHandler);

    void UnRegister < TEventData > (Type handlerType) where TEventData: IEventData;

    void Trigger < TEventData > (Type eventHandlerType, TEventData eventData) where TEventData: IEventData;
}

在应用服务和领域服务中,大家都能够一贯调用Register格局来实现领域事件的登记,调用Trigger主意来形成领域事件的透露。

而有关事件总线的切实可行落到实处,可参考笔者的那篇博文——事件总线知多少

“笔者对武安平调的腾飞现象依旧很明朗的,它在大家这一片(指雄城、安新、任丘等地)是分外流行的。不过再过2个四五十年吗?大家就不得而知。”

4. 最终一致性

说到一致性,大家要先搞精通上面多少个概念。

事情一致性
工作一致性是是数据库事务的八天性子之一,约等于ACID特性之一:

原子性(Atomicity):事务作为一个整机被实施,包涵在里边的对数据库的操作依然全体被实践,要么都不举办。
一致性(Consistency):事务应确保数据库的景况从3个一样状态转变为另3个一律状态。
隔离性(Isolation):八个工作并发执行时,1个作业的实施不应影响别的工作的实践。
持久性(Durability):已被交付的业务对数据库的改动应该永久保存在数据库中。

笔者们用一张图来通晓一下:

图片 3
在工作一致性的承接保险下,上边的图示只会有五个结果:

  1. A和B三个操作都成功了。
  2. A和B八个操作都失利了。

数量一致性
举个简单的事例,假若11个人,每人有九十多个虚拟币,虚拟币仅能在那拾一人内流通,不管怎么流通,最终的虚拟币总数都以一千个,那正是多少一致性。

领域一致性
总结精晓就是在领域中的操作要满意领域中定义的工作规则。比如你转账,并不是你余额足够就足以转化的,还供给账户的场合为非挂失、锁定状态。

回到我们的案例,当支付成功后,更新订单状态,扣减仓库储存,并发送捡货文告。依据大家现在的做法,为了有限帮助订单和库存的数据一致性,大家将这多少个操作放到贰个应用服务去做(因为应用服务管理工科作),事务的一致性能够确认保障要么全部打响依旧全体破产。不过,试想一下,客户开发成功后,订单依然为待付款景况,那会引起纠纷。其它,由于仓库储存没有及时扣减,很恐怕会招致库存超卖。如何做吧?
将事情拆解,使用领域事件来完毕最终一致性。

末段一致性
“最后一致性”是一种设计情势,能够通过将某个操作的施行延迟到稍后的年月来进步应用程序的可扩张性和品质。

图片 4

对于普遍于分布式系统的结尾一致性工作流中,客户同样在系统中执行贰个限令,但那几个系统只为维护理工科人作中的领域一致性运转部分的操作,剩余的操作在允许延后实践。针对上海体育场合的结果:

  1. A操作实施成功,B操作将延后执行。
  2. A操作失利,B操作将不会履行。

而针对性大家的案例,我们如何利用领域事件来开始展览业务拆分呢?大家看下上边那张图你就理解了。

图片 5

浅析一下,针对我们案例,大家发现三个用例必要修改多少个聚合根的动静,并且不一样的聚合根还处于分歧的境界上下文中。当中订单和仓库储存均为聚合根,分别属于订单系统和仓库储存系统。大家得以那样做:

  1. 在订单所在的聚合根中创新订单支付情形,并发表“订单成功开发”的圈子事件;
  2. 然后仓库储存系统订阅并拍卖库存扣减逻辑;
  3. 公告系统订阅并拍卖捡货公告。

经过那种办法,大家即确定保证了聚众的规格,又保证了数额的结尾一致性。

随后张先生引导大家去了村里专门放置戏剧行头的房子,并还为大家展示了衣服与道具。作为二个民营的、完全非赢利的非正式组织,其所具备的服装数量之多、种类之艰苦远超大家想象。蟒袍、官衣、箭衣、褶子等等,触目皆是。张先生怀着欢喜的心理,用骄傲的意在言外为我们逐条讲解戏服的野史与渊源,还有它们所制成的资料。在那之中有机绣的,有手绣的,甚至还有苏州刺绣的。那几个昂贵的衣着鲜明都以老百姓们融洽出资所选购,从侧面又展现了地面百姓对老调这一个戏种深深的热爱之情。大家逐条看去,不得不说衣裳制作之精良,看见戏服就能想象到影星在台上的行云流水般的表演,唱念做打客车赏心悦目。使大家再壹遍面临了感动。

5. 风云存款和储蓄和事件起点

至于事件存款和储蓄(伊夫nt Store)和事件本源(Event
Sourcing)是二个比较复杂的概念,大家那里就总结介绍下,不做过多展开,后续再设章节详述。
图片 6

事件存款和储蓄,顾名思义,即事件的持久化。那为啥要持久化事件?

  1. 当事件宣布失利时,可用以重新宣布。
  2. 通过音信中间件去分发事件,进步系统的吞吐量。
  3. 用来事件源自。

源代码管理工科具我们都用过,如Git、TFS、SVN等,通过记录文件每3遍的改动记录,以便我们跟踪每2回对源代码的修改,从而我们得以每1三3日回滚到文件的钦点修改版本。

事件本源的精神亦是如此,但是它存款和储蓄的永不聚合每一次变更的结果,而是存款和储蓄应用在该聚合上的历史领域事件。当须要还原某些状态时,须要把施用在集聚的园地事件按序“重播”到要还原情形对应的圈子事件结束。

随后,张老师又热情地有把大家领到他的家庭,为大家来得从前长乐会(即当地最大的相声剧协会)唱戏的老照片,老剧本,乐谱。超越五成照片都以黑白的,透流露11分年代特有的质感。照片上的人定格在四方之内,但仍是可以感受到她及时演戏的动作和姿态,就好像方块的相片可能荧幕,他已演出了数十年一般。老剧本的纸页已经泛黄,那些本子有的是从隋朝传下来的,依然保留完好,纸张也变的薄如蝉翼,历史磨砺去了它的薄厚,却使后人文化的厚度积累起来,达到另三个惊人,文化才不会断层。手抄的乐谱上用的几近是繁体字,竖排排版,充满了古典气息。光淀村的武安平调流传和封存境况比较好,没有出现濒临灭绝的危险的气象,平日上演也不少,村里老少都爱雅观,在周围县也有影响力。

6.总结

经过地方的剖析,我们知道引入世界事件的目标关键有多个,一是解耦,二是使用领域事件实行业务的拆分,通过引入事件存款和储蓄,来促成多少的结尾一致性。

说到底,对于世界事件,我们能够如此理解:
透过将世界中所发生的位移建立模型成一多元的离散事件,并将各样事件都用世界对象来代表,来跟踪世界中发生的工作。
也能够不难精晓为:领域事件 = 事件揭穿 + 事件存款和储蓄 + 事件分发 +
事件处理

如上,仅是私有掌握,DDD水很深,剪不断,理还乱,有标题或意见,欢迎指正交换。

参考资料:
在微服务中运用领域事件
动用聚合、事件源自和CQ途达S开发事务型微服务
怎么着了解数据库事务中的一致性的概念?
Eventual Consistency via Domain Events and Azure Service
Bus

考虑与记录

四十度的烈日下,张老师依然坚持不渝要送大家离开。他积极为我们找了一辆车,还叮嘱大家,有空一定要常回去看看。就像此,我们甘休了本次的无疑调查切磋。

对待别的的观念技术来说,四股弦的现状算是比较乐观的,依照我们对此外组调研守旧技术的刺探景况,别的守旧技艺大多都濒临灭绝的危险,后继无人,甚至供给给学生倒贴学习开销让她们念书。而商演的机遇很少,大概从未收入,濒临失传。对于那种地方,大家从七个方面证实的去对待:

一是东西总有一个发生向上没有的历程,有一些守旧文化中的东西发展现今,已没有很高的继承价值,随着城市化的兴风作浪,本来就在小范围里流传的东西的流失也是进化规律的一环,有的文化长时间并未前进更上一层楼,甚至未来照旧沿袭几百年前的格局,与现时代社会的节奏不相容,被淘汰掉是早晚的,与其死拉硬拽,“苟延残喘”,只等公立救济,哭诉苦衷,不如本人开始展览大破大立,适应社会的发展,不然其灭失是不可幸免的,“堡垒往往是从内部攻克的”,内因不改,何以传承。

那多少个呢,对于这么些优异的观念技艺来说,大家政党理应加大力度去救助,去推广,去宣传。有的东西流传到现在真的不应被丢掉,它们的随身全部民族的血液与烙印。同时我们年轻人是或不是也应当转变自己的价值观,去看一看大家古板的不二法门,接受古板文化的震慑呢?当大家看出那几个濒临灭绝的危险技艺传承人们消沉悲哀但依然闻风不动地百折不回着温馨的硬挺的时候,当我们看见那多少个古板技术里的光明与民族技艺时候,大家的心里会不会有一丝震撼,一丝感动啊?

此次调查研商活动,让对本国非物质文化遗产有了特别深切的精晓。在此次调研进度中发出的不幸都将变为大家美好的回忆。对于价值观文化的继承与进化,大家也有了进一步深切的合计与驾驭。被非遗调查商量队选中,大家是幸运的,此次活动改变了大家原先对价值观文化的视角。而对于那多少个美艳的历史观文化,大家坚信它们是自然不会流失的,它们将永久的留存于雄安新区那片沃土之上,存在人民的记得和历史的经过内部,散发着属于本身的光芒。

发表评论

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