解耦

标签: IT咨询 | 发表时间:2013-06-13 20:34 | 作者:人月神话
出处:http://blog.sina.com.cn/cmmi
耦合是指两个或两个以上的体系或两种运动形式间通过相互作用而彼此影响以至联合起来的现象。 解耦就是用数学方法将两种运动分离开来处理问题,常用解耦方法就是忽略或简化对所研究问题影响较小的一种运动,只分析主要的运动。

而对于软件架构设计中模块间的解耦或者说松耦合,则需要包括两个层面的含义,拿A,B两个模块来举例。第一个层面的解耦是指A不用了解到B模块内部的细节,B模块内部细节的变化不会影响到A模块对B模块能力和服务的消费;第二个层面则是A模块的完整运行不受到B模块任何状态变化的影响,即使是B模块完全失效也不至于影响到A模块本身的业务。对于第一个层面重点是模块本身的高内聚,松耦合划分,服务层的设计,通过服务层来完成模块间的解耦;对于第二个层面则重点是消息中间件,异步和事件驱动机制。所以在进行组件化架构和解耦的设计时候一定要关注到我们真正关注的目标。

不是模块间调用通过服务进行就是解耦,如果两个模块间有大量的服务调用和交互,两个模块的本质仍然是紧耦合,而且大量使用服务交互反而带来大量性能消耗。出现这种情况的核心原因还是在于我们进行业务模块划分和组件化设计的时候对业务流程,业务场景考虑的不足,导致模块本身结构划分不合理导致。

为了达到B模块内部细节的变化不会影响到A模块,不是简单的封装和暴露服务的问题,而是在架构设计上是否考虑可扩展性的问题。在面向接口的设计思路下面,AB两个模块间相互影响只应该体现在接口层面,只要接口本身不出现变化,则AB间相互不应该出现大的影响。面向接口设计下真正实现了将接口契约的定义和接口的实现彻底分离,实现变化不影响到接口契约,自然不影响到基于接口的交互。

对于A,B两个模块,如果前期的模块划分出现过多的AB模块相互调用和影响的情况,在整个设计上可能存在不合理的地方。双向交互和调用比单向交互耦合性更强,更难以真正的解耦,同时由于模块间存在的这种复杂依赖关系也增加了模块间集成的复杂度。在这种模式下最好的方式还是将共性依赖部分移出到第三方模块组件,即AB间的相互依赖转换为AB同时对底层C模块的依赖。这种迁移本质可以看作是各个模块内可复用内容的抽取,基础平台层的构建基础。

模块间的解耦,是贯彻整个模块多层架构的,即需要考虑从展现层,逻辑层,数据层到数据库的彻底解耦。很多时候我们在进行模块化设计的时候,发现展现和逻辑层解耦开了,相互直接没有API调用,结果实际审查的时候发现大量交互都转换到数据库层交互,这反而是使两个模块出现了更强的耦合性。只要在底层数据库彻底封闭的时候,我们在设计中往往才会考虑业务组件本身交互和接口,在业务组件和领域服务层需要设计和开放的服务。数据库完全不隔离,也是直接导致前面说过的贫血的领域服务层的一个重要原因。

对于一个完整的业务系统构成,可以看到在考虑平台层的时候,整个应用架构底层是一个共性的平台层,在共享的平台层上面才是各个业务模块。平台层作为一个最底层的支撑,本身和业务模块间就是一个紧耦合的关系,任何一个业务模块不可能脱离平台层而单独存在。而对于平台层上面的业务模块,则应该是一种松耦合的关系,可以按照最终用户的需求进行上层业务模块的配置的组装,这即是一个比较理想的组件化架构情况。

对于第二个层面的解耦,即A模块的完整运行不受到B模块任何状态变化的影响,这个往往需要通过消息中间件,异步消息机制来实现。而这仅仅是技术实现层面的事情。更加重要的是EDA事件驱动架构思想在业务建模和架构设计中的使用。EDA思想不是对传统业务建模和OO设计思想的否定,而是其关注重心从传统的业务流程,业务对象朝业务事件和状态的变化。事件的识别,分析,设计,开发和测试存在一个完整的生命周期,这个设计思想会对我们传统的同步模式下的设计方法造成大的影响。

要做到这一点可以看到在进行AB模块间交互和接口设计的时候,AB两个模块间交互的接口或服务都需要由传统的同步接口或服务转换为异步消息模式。即AB两个模块间的交互应该更多的是数据推送模式,而不是实时的拉式查询模式,这对于我们在服务设计上也提出了相应的要求。在这种架构下,消息中间件本身的可靠性将直接影响到业务模块的可靠性。

能否真正的做到模块间在第二个层面的彻底解耦,以及这种解耦的必要性和付出的代价,将是后续重要思考的一个问题和方向。

  青春就应该这样绽放   游戏测试:三国时期谁是你最好的兄弟!!   你不得不信的星座秘密

相关 [IT咨询 ] 推荐:

新领域的探索

- Fay - 人月神话的BLOG
在信息技术领域,任何新领域都是已有知识领域,已有技术和研究成果的进一步组合和创新,新领域一分解到底层你会发现全是已有技术,方法和工具. 这些很可能都是我们熟悉的内容,而新领域仅仅是对已有知识和技术的进一步组合,形成一套完整的方法和技术来解决新的问题. 当接触一个新领域的时候,首先是大量的阅读,在一开始没有机会实践的时候,那只有先补充和学习基础的理论,了解新领域的知识体系和结构,了解新领域所涉及到得关键技术.

谈大数据-架构维度

- - 人月神话的BLOG
本篇作为在构思大数据平台架构时候维度方面的简单点滴思考记录. 前面关于大数据平台架构的核心功能的时候谈到过,基本应该包括数据采集和集成,数据存储,数据处理,数据分析这些核心层面. 我在前面谈大数据平台的时候也谈到过平台不仅仅是云和分布式相关技术的引入,其架构一方面和传统的BI相似,但是更加重要的则是对外部应用涉及到大数据的应用场景的支撑和大数据平台本身的大数据服务能力的开放问题.

谈领域服务

- - 人月神话的BLOG
对于跨系统和模块间的SOA服务识别和分析我前面文章谈的比较多,这块的SOA服务重点是实现跨系统和模块的业务交互和协同,而对于领域服务而言则更加关心的是对于单个系统或模块,其应该如何抽象领域对象并将其能力以粗粒度服务方式保留给应用层用. 在领域建模中的整体思路中,我们做两个层面的理解,其一是领域模型层重点是隔离传统的数据表并抽象为领域对象;而对于领域服务层重点是则将应用层和领域模型层解耦,模型层提供的能力是以领域服务的方式暴露到应用层使用的.

再谈垂直和水平切分

- - 人月神话的BLOG
本篇为在应用集中化背景下,数据库集群本身的垂直和水平切分方法的点滴思考. 首先我们看应用的垂直切分,应用本身包括了两大类型的应用,一种是以核心数据为中心的应用,一种是以纯粹的流程工单为核心的应用. 前者如资产管理,主数据管理等相关应用;后者如运维工单管理,OA办公管理等应用. 对于工单型应用各种工单流程之间相互耦合性非常底,共享的基础数据也相当少,因此这类应用相当容易进行垂直切分,而且切分的也相当干净;而对于资产管理这类应用,.

解耦

- - 人月神话的BLOG
耦合是指两个或两个以上的体系或两种运动形式间通过相互作用而彼此影响以至联合起来的现象. 解耦就是用数学方法将两种运动分离开来处理问题,常用解耦方法就是忽略或简化对所研究问题影响较小的一种运动,只分析主要的运动. 而对于软件架构设计中模块间的解耦或者说松耦合,则需要包括两个层面的含义,拿A,B两个模块来举例.

企业内PAAS基础平台-开篇

- - 人月神话的BLOG
关于企业内私有云和PaaS平台将是今年关注的一个重要内容,对于PaaS平台前面已经有部分文章在阐述,后续将根据项目实践情况进一步思考和总结. 可以讲后续IaaS将已经不是企业内部私有云得重点,对于IaaS层得云化和资源池的形成如果不和内部的PaaS平台结合和集成,将很难真正的发挥具体的作用. 而对于PaaS平台本身我们在10年就看到电信运营商针对外部互联网应用,移动互联网应用开发的PaaS平台,主要是电信侧CT能力的开放和集成,形成统一的开发平台,集成平台和运行环境.

谈大数据分析

- - 人月神话的BLOG
对于数据分析层,我们可以看到,其核心重点是针对海量数据形成一个分布式可弹性伸缩的,高查询性能的,支持标准sql语法的一个ODS库. 我们看到对于Hive,impala,InfoBright更多的都是解决这个层面的问题,即解决数据采集问题,解决采集后数据行列混合存储和压缩的问题,然后形成一个支撑标准sql预防的数据分析库.

再谈数据架构

- - 人月神话的BLOG
本篇为杂谈,主要是想谈下企业架构中数据架构部分的一些关键点. 首先在TOGAF的ADM方法论中将数据架构部分的内容放在了信息系统架构-数据架构部分,这个方式是不合适的. 前面一直强调了企业架构的两条重要线索,一个是流程,一个是数据,这两者都是既涉及到业务架构部分,也涉及到应用架构部分. 在最终架构的分析和分解,业务建模到IT实现的转换过程中,自然就会过渡到应用架构部分的内容.

再谈应用架构

- - 人月神话的BLOG
前面谈了业务架构和数据架构,接着谈下应用架构,对于应用架构的描述将参考togaf信息系统架构部分的内容,但是不完全相同,总体思路是围绕在IT架构层面来谈应用架构包括的内容. 为了区分高层架构(包括多个应用的总体架构)和底层架构(针对单个业务系统的架构),前者采用企业架构中的应用架构这个词,后者采用系统架构这个词以进行区分.

再谈企业架构

- - 人月神话的BLOG
本篇为杂谈,谈下最近关于企业架构的一些思考. 对于企业架构有很多定义,简单来说的话可以说企业架构包括了三个方面的内容,一个是业务的现状和建模,一个是IT的现状和建模,还有就是业务和IT的匹配. 业务重点是流程和数据,IT的重点是应用和技术. 所有的企业架构基本都包括了这三个方面的内容,只是前面增加了企业愿景和业务目标驱动,后面增加了可落地的实施策略和计划.