去年我们在Jdon.com狠狠地讨论了异步架构,这个异步不是一般意义上的异步,不那种无需实时返回结果的异步,而是与是否需要返回结果无关的异步,应该属于一种并发策略,是在多核时代的并行计算和分布式计算思维的体现。
今天,Thinking Asynchronous - Domain Modeling using Akka Transactors - Part 1一文介绍了使用基于Scala语言的Akka框架如何实现异步思维,异步思维已经渗透到语言中,成为一种天然的编程习惯,颠覆了顺序编程的传统。
Akka框架之前介绍过,是和DCI架构结合的,我们已经发现软件不同领域的发展最终都已经汇聚集合到一起,这本身也是一种Map/reduce哦。
闲话少说,让我们看看这篇文章是如何写的:
Evans DDD提出仓储repository概念,将对象存储持久和对象本身进行了分离,再加上NoSQL发展,文章引入了key-value存储数据库Redis作为repository的实现。
假设有一个Account对象,scala代码如下:
|
有几个字段no 号码,name名称等等,设想场景:打开一个新的Opening a New Account, 然后查询这个账户的余额, 在这个帐号加入一笔金额数字。
实现这个功能,一般是通过scala的消息机制来实现,实现命令如下:
|
其中trait是类似Qi4j中实现DCI架构的场景混合器,这里是为事件AccountEvent,Open为打开账户事件;New是新账户,Balance是查询余额事件,Post是加入新纪录事件。
这些事件被客户端发出,由Domain service领域服务拦截,最终发往仓储Repsitory,Akka transactor可以提供基于事件的容错性,如果事件发生冲突崩溃如何进行处理等都可以由代码指定。
|
从以上看出:
1。Akka是一个基于let-it-crash 任其崩溃的方针. 通过LifeCycle(Permanent)定义崩溃后处理方式,Permanent是重新启动 Temporary则是不启动而直接关闭。
2.重新启动的Hook钩子方法你可以直接定义,如postRestart 就是重新启动加载accounts集合。
3.Akka使用使用一种基于Java的事务机制 multiverse来实现事务,使用atomic {}就可以。
异步消息能够实现端对端的解耦,不会堵塞,更易于管理,典型基于领域模型的的actor实现是轻量的,可以有数百万个actors,它们之间通过消息来协作交互,非常符合对象职责和交互的领域模型。
说句题外话,jdon推出的开源框架Jdonframework通过domain events来实现领域模型与仓储repository等技术架构实现交互,虽然比不上scala+Akka这么彻底,但在设计理念上很相近,尤其还是使用Java平台。见Domain Events异步应用, JF的PPT中也有更多使用异步消息实现数据持久加载说明:http://www.jdon.com/jdonframework/