最近一直在思考一个问题:有没有这样一种可能,就是一个领域模型的状态不依赖于外部,它只负责接收外部的事件,然后根据这些事件做出响应;响应分两种:
创新互联成立于2013年,先为睢阳等服务建站,睢阳等地企业,进行企业商务咨询服务。为睢阳企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
1)根据模型当前的内存状态进行业务逻辑处理,然后产生事件,注意:这个过程不会改变模型当前的内存状态;
2)根据事件改变自己的状态;
另外,也是最重要的,领域模型不用关心自己所产生的事件到底怎么样了,比如不关心有没有持久化,不关心是否和别的事件有并发冲突。它只管根据自己当前的内存状态做上面这两点的响应;
如果这样的设想有可能,那领域模型就是真正的中央业务逻辑处理器了,和CPU很类似了。这样它才能真正快起来。
简单的说就是:事件->模型->事件
模型只管响应事件,然后产生新的事件
领域模型就是一黑盒,它只能帮你处理业务逻辑,其他的什么处理结果它一概不关心;当然,领域模型肯定有它自己的状态,但这个状态是驻留在内存的,和领域模型是一体的。
我为什么会有这个想法是因为,我在想,为什么要让领域模型的处理逻辑依赖于它的处理结果是否被正确顺利持久化了?感觉这很荒唐。
既然领域模型有自己的内存状态空间,他的所有逻辑也应该只依赖于这个状态空间,不再依赖于其他任何外部的东西。
当然,以前我们设计的IRepository,实际背后都是直接从数据库取。这样的话,领域模型的状态空间就是数据库了。但是这样其实很不好,因为为什么不用内存作为领域模型的状态空间呢?
现在再想想LMAX就是我刚才的想法的一个实际例子。
事件->模型->事件,这样的设计,理论上并不需要必须要求单线程来访问模型,因为领域模型不依赖于任何外部的状态,只依赖于自己所在存活内存空间;单线程有一个很大的好处就是可以防止并发冲突的产生。我们其实完全支持多线程或集群的方式,只不过这样会有可能访问到的领域对象的状态是了老的,因为不同的机器之间的领域模型内存对象的状态需要做一些同步,访问到老数据的可能性的大小取决于并发的大小以及机器之间数据同步的快慢;
LMAX之所以用单线程,是考虑了,这单线程的领域模型和性能之间,性能已经可以达到他们的要求了。
这样的架构,领域模型中的任何一个对象的一次状态更新至少会响应两个事件,举个例子:
1)先响应ChangeNoteCommand(command也是一种事件,可以理解为NoteChangeRequested),然后Note模型产生一个NoteChanged事件;
2)然后该事件(NoteChanged)最终又被发送到领域模型让其响应,此时,领域模型才去更改自己的Note状态;
经过这两个事件的响应,才完成了Note的最终状态的修改;而我们以前都是从数据库取Note,然后更改,然后保存到数据库。这样不慢才怪!
通过上面的两次事件响应,可以换来领域模型***的吞吐量。剩下的我们只要考虑:消息的序列化和反序列化、消息传递的速度、事件持久化的速度、并发冲突后重试的设计,以及消息丢失,等问题。但这些都不是领域模型该考虑的问题。这些外围的任何问题,都不要让领域模型自己去考虑,我们应该对出现的各种问题逐个寻求解决方案。
每个问题的解决方案我大概理了下我的对策:
另外,如果是多线程访问模型,或集群访问,那很多时候访问到的内存的领域对象的状态都是老的,那怎么办?其实这不是问题,因为事件持久化的时候会被检测到这种并发重复,然后对应的command会被重试。
另外,这种架构,传输的是事件,事件都是很小的,所以不用担心消息传输的性能。
目前就想到这些。后续再完善思路,
***,我一直认为:知识决定命运,学习积累知识,而正确的思维方式是一切高效学习的基础。所以要学会如何清晰地思考!
所以,我们最重要的是要学会如何思考。
呵呵!
分享题目:关于如何设计一个基于事件驱动架构的思考
地址分享:http://www.csdahua.cn/qtweb/news33/242733.html
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网