`

Domain Events异步应用-2

    博客分类:
  • DDD
阅读更多

原文 http://www.jdon.com/jivejdon/thread/37712/15

 

Bang
按照你的逻辑,是不是我可以理解成,系统启动时,载入messageCount和第一次调用这个函数的时候载入的区别呢。



不是系统启动,而是当客户端访问Account的getMessageCount这个事件时。

一般传统观点是,一次请求事件,对应一次响应结果,一般都是想在一次请求把所需要的结果全部获得,就象贪心馋嘴的小孩吃糖果一样,现在就不同了,搞清楚你所要结果的主次,先获得主要的,次要的再来一趟获取。

所以,getMessageCount要两次触发调用,第一次触发调用是激活查询或计算事件,第二次触发调用是获得计算结果。

这个类似专门JOB异步模式适合那些费时的计算和查询,再往上就可以使用hadoop等云计算 来对付。

但是,千里之行,始于足下,你必须首先分辨出你的业务哪些是费时费力的,而且不能将这些耗CPU计算推给数据库,然后再在架构设计上专门对待。

 

 

由于针对messageCount有一些专门操作,我们就不能直接在Account中实现这些操作,可以使用一个专门值对象实现



这里也体现了一个DDD 实践中什么时候使用值对象的一个原则,当围绕这些值字段有一些专门复杂操作时,就有必要独立出来做一个值对象,最近InfoQ 2009一个讲座就是谈这个问题的:Power Use of Value Objects in DDD

他使用了电话号码为例子,因为在Action和Service中都涉及phoneNumber处理,所以,专门成立一个phoneNumber的值对象,如下:

 

 

 

 

 

Domain Events还可以实现懒加载大数据的预加载。

比如图片,只有显示图片时才会需要图片的二进制数据,这个数据比较大,所以,一般从持久层加载图片时,只加载图片其他核心文字信息,如图片ID,名称等,当需要显示时,再加载二进制数据输出真正图片。

下面是JiveJdon 的上传图片代码:

public

 byte[] getData() {
		byte[] bytes = super

.getData();
		if

 (bytes != null

)
			return

 bytes;
		preloadData();
		bytes = (byte[]) imgDataAsyncResult.getEventResult();
		this

.setData(bytes);
		return

 bytes;
	}

//预加载




public

 void

 preloadData() {
    if

 (imgDataAsyncResult == null

 && domainEvents != null

)
	imgDataAsyncResult = this

.domainEvents.loadUploadEntity(this

);
}




上面preloadData可以在控制帖子显示的Action中预先调用一下,当帖子被输出到浏览器中时,帖子再通过html语法img调用上述getData数据,显示图片。

所以,html语法显示图片本身的异步 性和我们服务器端异步 结合在一起,这种模式可以适合大量图片显示场合。

特点是:显示快,因为当浏览器发出html的img语法调用服务器的图片时,服务器端图片一般已经预加载完成,准备就绪,只能调用,这比img语法到达服务器端时再进行图片大数据加载更有效。

该模式不但适合图片,也适合任何大数据对象。

参考并发策略可以解决延迟

 

 

传统意义上,懒加载和异步 都是好像不被人接受的,会带来比较差的性能,高延迟性,属于边缘技术,这其实是被误导了:并发策略可以解决延迟

懒加载和异步 代表的并发策略实际是一种潮流趋势,特别是作为并行计算语言Scala和erlang的新亮点:
函数式编程functional programming的特点

而最新发布JiveJdon 3.9使用传统Java,基于Jdon框架6.2实现了领域模型层的懒加载和异步 ,可以完全克服Hibernate等ORM框架带来的Lazy懒加载错误问题。

 

JiveJdon3.0源码下载:http://www.jdon.com/jdonframework/download.html

 

在领域知识内不存在计算机技术的概念,你为什么要把技术层引入到DOMAIN呢



这是对的,但是因为Java语言的限制,如果采取基于Scala的Akka那种Actor Model ,而一个领域模型实际就是一个Actor,就非常自然了。Actor只能通过发送异步 消息和其他Actor通讯联系,这种消息发送是异步 的,属于“fire-and-forget”方式。


怎 样让领域模型驱动技术为其服务,不否认有更优雅的方式,权宜之举由领域模型发出事件消息不失是一种办法,而如果你将服务注射到领域模型,就不是一种事件驱 动架构(当然,还要将更多技术注射到领域模型)。而Domain events相当于只注射一次,首先建立一个事件通道,以后就可以通过这个管道让Domain一次次发送事件消息来命令技术架构为其做事,相当于在两者之 间建立一个管道。

个人认为这是一种模拟Scala的Actor模型做法。

 

领域对象,仅仅关注自身和其他领域对象之间关系的建立,至于一切计算机领域的概念,都不应该出现在领域对象中,因为这是违背自然规律的组合,或者说是违背业务概念的。



非常赞同,让领域对象纯净,也是我的一个目标,这也是DDD 提出后,没有很多具体实现要求,因为目前具体实现离DDD 要求还很远。

就像是DCI架构 中所谈论的一样,我们现在很多OO 可能是因为被OO 实现所误导了。

关键是我们寻找到一个理想和现实结合之处,而不被实现误导,我也相当有兴趣讨论,包括自我批判挖掘。可另外开贴于你切磋。

 

相关参考:
Jdon框架异步 Domain Events实现内部原理:
使用future实现内置 异步 API

对象的职责

 

分享到:
评论

相关推荐

    dotnetcore-domain-driven-design-monolith:用于管理中介实体的Monolith Web API,由域驱动设计(DDD)原理编写

    在C#中,我们通常使用实体(Entities)、值对象(Value Objects)、领域事件(Domain Events)、聚合根(Aggregate Roots)、工厂(Factories)和仓储(Repositories)等DDD模式。例如,"中介实体"可能是一个业务中...

    domain-driven-arch-node:NodeJ微服务中的域驱动架构

    4. **领域事件(Domain Events)**:当领域状态发生改变时,可以发布领域事件,用于通知其他服务或组件。在Node.js中,可以使用EventEmitter或第三方库如`@async/queue`来处理异步事件。 5. **领域服务(Domain ...

    Domain model manual

    通常,领域模型包含了业务实体(Entities)、值对象(Value Objects)、聚合(Aggregates)、领域事件(Domain Events)、服务(Services)以及领域驱动设计(DDD)中的其他元素。 1. **业务实体(Entities)**:...

    dotnet-一个基于DDD领域驱动设计CQRS命令查询职责分离的netcore框架

    4. **领域事件(Domain Events)**:用于记录领域内的重要变化,可以异步处理,与其他系统或服务通信。 5. **领域服务(Domain Services)**:处理跨越多个聚合的业务逻辑,不包含在任何实体或值对象中。 接下来,...

    Node.js Domain 模块实例详解

    Node.js Domain(域) 简化异步代码的异常处理,可以捕捉处理try catch无法捕捉的异常。 Domain 模块可分为隐式绑定和显式绑定: 隐式绑定: 把在domain上下文中定义的变量,自动绑定到domain对象 显式绑定: 把不是...

    Laravel开发-laravel-ddd

    2. **实体**:具有唯一标识的业务对象,如用户、订单等。 3. **值对象**:关注于其属性而非身份的对象,如地址、金额等。 4. **聚合**:一组相关实体和值对象,它们作为一个单元进行操作,以维护业务规则的一致性。 ...

    ABAP面试大全

    2. 创建ALV控件。 3. 设置ALV属性。 4. 填充ALV数据。 5. 显示ALV。 - **1.2.2 显示ALV常用的两个FM** - `REUSE_ALV_GRID_DISPLAY`: 用于显示ALV网格。 - `REUSE_ALV_LIST_DISPLAY`: 用于显示ALV列表。 - **...

    JavaScript与ActionScript3交互问题总结

    AS3通过`flash.system.ApplicationDomain`和`flash.events.EventDispatcher`监听和发送消息,JavaScript通过`window.postMessage`方法接收和发送消息。 4. 常见问题与解决方案 - **安全性问题**:由于安全限制,...

    DDD EventBase 事列

    事件在DDD中扮演着重要的角色,特别是领域事件(Domain Events),它们记录了领域模型中的重要业务变化。 **事件基础(EventBase)** "EventBase"可能是指在DDD中用于处理和存储事件的基础类或框架。这个基础类...

    abp3.2 net core.rar

    "Imagine.Mes.MesInspection.Domain"是领域层的实现,包含了业务实体(Entities)、值对象(Value Objects)、领域事件(Domain Events)和领域服务(Domain Services)。这个层专注于业务规则和业务逻辑,确保了...

    一个简单的DDD领域模型项目

    3. **领域事件(Domain Events)**:当领域中的某个重要状态发生改变时,会触发领域事件。这些事件可以异步处理,以保持领域模型的简洁性。在.NET Core中,可以使用事件总线(Event Bus)来处理领域事件。 4. **...

    领域驱动设计:软件核心复杂性应对之道

    6. ** Domain Events **:领域事件记录了业务流程中的重要事件,可以用来实现异步处理,解耦不同的系统组件。 7. ** Strategic Design **:包括子域识别、上下文映射等策略,帮助确定不同Bounded Context之间的关系...

    《领域驱动设计C# 2008实现问题.设计.解决方案》.((美)Tim McCarthy) [PDF]

    4. 领域事件(Domain Events):DDD中,领域事件用于表示领域模型中发生的有意义的业务事件。它们在业务操作完成后发布,可以用来触发异步处理或与其他系统通信。 5. 仓储(Repository):仓库是领域模型与持久化...

    DDD简易骨架

    7. **领域事件(Domain Events)** 领域事件是在业务操作完成后发布的,用来通知系统其他部分发生了什么。在ASP.NET MVC中,可以使用事件总线或者直接订阅/发布机制来处理领域事件,实现解耦和异步处理。 8. **上...

    Node.js v4.2.4 手册

    - **domain.create()、domain.run(fn)**: 创建和运行领域对象。 #### 九、事件处理 - **事件: 'exit'**: 进程退出时触发。 - **事件: 'uncaughtException'**: 未捕获异常时触发。 - **Signal Events**: 处理操作...

    CISCO 技术大集合

    Router1和Router2的E0端口均使用了C类地址192.1.0.0作为网络地址,Router1的E0的网络地址为192.1.0.128,掩码为255.255.255.192, Router2的E0的网络地址为192.1.0.64,掩码为255.255.255.192,这样就将一个C类网络地址...

    flex结合asp.net上传深入详细解说

    在Flex应用中,可以通过创建一个FileReference对象,然后监听其events来触发文件选择对话框。用户选择文件后,FileReference对象会包含所选文件的信息,如文件名、大小等。然后,我们可以调用FileReference的upload...

    牛客前端面试高频八股总结(2)

    2. **样式计算**:读取 CSS 样式并应用到 DOM 节点上。 3. **布局**:根据 DOM 和样式信息确定每个元素的位置。 4. **绘制**:将元素绘制到屏幕上。 5. **复合**:如果使用了 GPU 加速,则进行纹理上传和合成操作。 ...

    CQRS代码示例

    - **异步处理**:命令和事件可以通过消息队列异步处理,以提高系统响应速度和容错能力。 通过分析这个CQRS.Demo项目,我们可以学习如何在实际应用中有效地划分职责,理解CQRS如何提高系统的可读性、可维护性和可...

Global site tag (gtag.js) - Google Analytics