使用DDD提高性能和可伸缩性

通常软件需求有功能性需求和非功能性需求,在以往数据库驱动方式下,这两个目标是分别需要考虑的,是一个需要分别衡量的指标,但是因为使用DDD,就可以将这两个需求融于一身实现,这不但对象OO的功能,更是DDD定义的聚合边界的功能,Improving performance and scalability with DDD一文对此进行了详细阐述。

这篇文章大部分观点可见我以前讨论中,当然我没有看过这篇文章,完全是我自己的总结,今天看到这篇文章观点和我类似,或者说,仔细阅读DDD后就会有此感悟。

主要分几个点:
1.Aggregates are about units of consistency – not about pointers
聚合是一致性的基本单元,但不是一个点,大多数人认为,根以外对象只能引用聚合根,而聚合根不能引用这些对象,聚合不只是一个技术词语,应该和领域专家一起讨论。

我们需要确保一个聚合体内所有变化都是作为一个事务部分被保存,一旦我们这样做,我们就做了一件非常有意义的事情, 这就潜在地给我们提供者一种自由:以并行或分离的事务处理不同的聚合体。(也是我所说的引入异步也提供可能)


2.If you don’t aggregate enough, even the fastest computers will spin their wheels in vain
如果你不足够聚合,那么最快的计算机也只是让轮子进行空转。

延迟是分布式系统的一个经典问题,直接将聚合体一起装上,在分布式系统中传输,就能避免延迟。


3.If you aggregate too much, baggage becomes a problem
如果你聚合太多,就成了包裹。

序列化是分布式系统第二个经典问题,如果你聚合太多对象,这些对象需要序列化才能在分布式系统传输,那么耗费性能。

4. If you don’t aggregate enough, things are going to be broken just when you need them
如果你聚合得不够,但你需要某个模型时会断线。这其实是同步原子更新和聚合开始工作之间的关系问题。

5.If you aggregate the wrong things, deadlocks galore
如果你聚合了错误方式,死锁就光顾了。

具体可见原文:Improving performance and scalability with DDD

[该贴被banq于2009-10-23 15:53修改过]
[该贴被banq于2009-10-23 15:53修改过]

多谢banq老师推荐。在前天给部门内部培训DDD的时候,我也重点说了DDD如何将功能性和非功能性需求统一,以及DDD如何使得系统具有良好的伸缩性和性能的。

>>这篇文章大部分观点可见我以前讨论中,当然我没有看过这篇文章,完全是我自己的总结,今天看到这篇文章观点和我类似,或者说,仔细阅读DDD后就会有此感悟。

非常认同。