`
flyisland
  • 浏览: 83488 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

[笔记]Loose Couple Dimensions,松耦合的维度

阅读更多

在Infoq的文章SOA的十大原则 ,专门提到了松耦合。松耦合是老生常谈了,不过这篇文章则用了好几个维度来描述:

时间 :当参与者在时间上是松耦合时,它们不需要在同一时间启动并进行通讯。这要求两者之间采用某种缓冲或队列机制,尽管这种机制与松耦合无关。当参与的一方向另一方发送消息时,交互的继续不依赖于逻辑上或物理上能否立即返回应答消息。

在互联网时代,这个需求逐渐明显,因为我们已经习惯了各种网络应用,例如我自己深度依赖Gmail, Google Docs。然而一旦断网,就只能干瞪眼。幸好Google推出Gear ,成功将互联网应用与浏览器松耦合,极大的扩充了互联网应用的可用性。

另外在企业应用中,同一时段会收到不同类型的用户请求。如果某些请求的及时性要求不迫切的话,将其置入队列中,就能在在保证业务功能完整的情况下,无需其他投资而提高了应用的性能。

位置 :如果一方参与者查询与之通信的另一方参与者的地址,另一方的地址可以透明地进行变更,不需要重新编程、重新配置或者甚至不需要通信伙伴的重新启动。这意味着查找(lookup)过程采用某种目录或地址来存储服务终端的地址。

这里提到不需要“重新配置”,在企业应用中我觉得需要商榷。因为这的确就以为需要一个目录服务,而且目录服务本身的位置永远不能改变。而应用每次访问服务之前都要执行一次查找动作是否值得呢?我可以倾向于可以重新配置,但是要做到动态配置,即无需重启应用。

类型 :同静态与动态,弱类型与强类型这些编程的概念类似,参与者既可以全部依赖也可以部分依赖文档结构来实现它的功能。

在ESB的项目中这倒是比较常见,我们使用的是Oracle Service Bus ,一般采用xml作为交换格式。既然实际格式是文本,那么两边应用的具体类型就无所谓了,例如字符串“2009-03-06 21:24:20”,在服务端是日期类型,而在客户端是字符类型。

版本 :参与者可以依赖服务接口的特定版本,也可以兼容某个范围内的版本。所需匹配的版本越确切,参与者在这个方面上的松耦合性就越差。一个好的原则是遵循 Postel法则 (译 者注:Postel’s Law——“Be liberal in what you accept, and conservative in what you send.”):服务提供者应尽可能兼容许多不同的版本,这将使它更加健壮(可能甚至需要容错),服务使用者应尽可能遵循精确的语法和文档类型。这将增加 整个系统的稳定性和灵活性。

在SOA的首期项目,根本没有所谓的“版本”问题,而随着项目的渐渐演变,版本问题就渐渐暴露出来了。尽管基于Oracle Service Bus 的丰富特性可以应付一些版本问题,但还是服务接口的初始设计其决定作用。我觉得解决“版本”问题,SOA的十大原则 提到的“面向文档”是一个很好的工具,因为面向文档能够灵活应对接口的变化。

这里的Postel’s Law——“Be liberal in what you accept, and conservative in what you send " ,中文意思应该就是我们常常说的“严以待己,宽以待人 ”。服务端的程序设计必须严格遵循相应的架构规范、设计模式和最佳实践,但是就要允许客户端以各种古灵精怪、不合逻辑的方式进行交互,这样的服务端就会更将强壮,而版本变化则不在话下了。

基数 :服务消费者和提供者可能是1对1的关系,尤其是在请求或响应交互发生时,或队列被明确使用的情况下。在别的情况下,服务使用者(在这种情况下,称作“消息发送者”或“事件源”更为合理)可能既不知道也不关心有多少人接受了消息。

这段文字有点不容易读,我理解为交互双方是一对一,或者一对多的关系。现在一般都是通过“主题队列”的订阅机制来实现一对多的关系。

查找 :参与者打算调用服务时,既可以依赖服务提供者的物理名或逻辑名,也可以先通过一组功能描述来执行查找(lookup)操作。这意味着存在一个注册表和(或)仓库,对存储其中的使用者需求和提供者能力进行直接或间接的匹配。

这段话讲的不够直白,我的理解就是如果应用要使用一个天气预报的服务,那么应用可以首先到某个地方查找能够提供天气预报能力的服务,然后使用它。说实话, 我还从来没有看过能够在“运行时”做到这一点的,曾经有一些SOA的项目标书提到这个特性,除了让销售多买一些Repository Server外,就不曾在项目实施中出现过了。

对于将使用者需求和提供者能力进行直接或间接的匹配 ,我认为只是应该在“设计时”进行,而且当企业部署了上百个服务后是很有必要的。不过我这里着重的是企业应用,不晓得互联网应用中有否在运行时进行功能查找的真实案例。

接口 :参与者可能要绑定到一个特定的服务接口或是支持一个通用的接口。如果使用通用接口,所有该接口的使用者都能与所有该接口的提供者进行交互。尽管可能乍看起来这有些笨拙,但单一通用(统一)接口的原则就是WWW架构的核心

通用接口的确是WWW的核心,不同产商的浏览器可以自如的和不同产商的Web服务器进行交互,这就是通用接口带来的奇迹。不过我对通用接口的理解还不够深 刻,这几天在看一些关于REST的争论也常常提到统一接口的问题,需要做进一步了解。我对如何在企业应用中的采用单一通用接口比较感兴趣。

---------------------------感想分割线 ---------------------------

其实松耦合真的是老生常谈,但这种多维度的分析还是让人眼前一亮的。将问题进行分解,然后分别描述是一种简单而有效的方法。在讨论问题的时候,容易泛泛而谈没有重点,或者紧紧揪住某个细节陷入其中,这个时候,如果有人说“这个问题嘛,应该分成几个方面来看,…… ”,这个人往往会被大家佩服。

其实也是,当我们开始试图从多个角度看待一个问题时,就更加能够看清问题的真相,找到相应的解决方法,而如果能够做到麦肯锡所倡导的“相互独立,完全穷尽 ”就更加完美了。

0
0
分享到:
评论

相关推荐

    强内聚松耦合与测试的关系

    #### 松耦合(Loose Coupling) 松耦合是指模块或组件之间的依赖关系最小化。在松耦合的设计中,一个模块的变化对其他模块的影响降到最低,即模块之间通过接口进行通信,而避免了直接访问其他模块的内部状态或细节...

    一种松耦合的生物医学命名实体识别算法

    针对当前Bio-NER中存在的问题和挑战,本文提出了一种名为LCA(Loose Coupling Algorithm)的松耦合Bio-NER算法。该算法通过结合启发式规则过滤器、词性模板匹配以及改良的隐马尔科夫模型(HMM)来识别生物医学命名...

    Loose & Tight.rar

    标题中的“Loose & Tight.rar”可能是指一种关于 GNSS(全球导航卫星系统)与SINS( Strapdown Inertial Navigation System,捷联惯性导航系统)组合导航系统的仿真项目,其中“Loose”和“Tight”通常用于区分两种...

    流固耦合方面的英文书籍

    "Extending the Range and Applicability of the Loose Coupling Approach for FSI Simulations" 则关注于松耦合方法的扩展与适用性。松耦合方法在处理大型或复杂系统时有较高的效率,但可能在精度上有所牺牲。该书...

    流固耦合方程的建立及耦合数据传递[参照].pdf

    3. Loose Coupling 方法:Loose Coupling 方法是指在流固耦合问题中将流体和固体分开计算,然后将计算结果耦合在一起,但不需要保证计算结果的一致性。这种方法可以减少计算复杂度,但需要保证计算结果的可靠性。 4...

    Loose-GNSS-IMU-master.zip_GNSS_IMU_countq5x_easieruqh

    【描述】"Loose-GNSS-IMU-master" 这个描述可能指的是该项目的核心特性,即松散耦合的GNSS-IMU集成。在定位和导航领域,松散耦合是指独立处理GNSS信号和IMU数据,然后将两者的信息融合以提高定位精度和鲁棒性。这种...

    spring培训的例子

    在压缩包文件 "ch03-loose-coupling" 中,可能包含了关于Spring框架中松耦合的实践案例或教程。这些内容可能涵盖了如何设置DI、使用接口编程、实现AOP切面以及如何利用Spring Boot来提升应用的松耦合程度。通过学习...

    微服务拆分原则1

    Loose Coupling(松耦合)原则强调了高内聚低耦合。这个原则的目的是为了减少系统之间的耦合度,提高系统的灵活性和可维护性。在实际应用中,Loose Coupling原则可以通过使用微服务架构和松耦合的设计来实现。 ...

    phase3-spring-di-loose-coupling-03-19-2021:phase3-spring-di-loose-coupling-03-19-2021

    di-loose-coupling-03-19-2021”以及压缩包子文件的名称“phase3-spring-di-loose-coupling-03-19-2021-master”暗示了这个压缩包可能包含了关于Spring框架的依赖注入(Dependency Injection, DI)和松耦合(Loose ...

    安全归约笔记Introducing to Security Reduction

    根据安全归约笔记的强度,可以将其分类为 loose reduction 和 tight reduction。 Loose reduction 是指将一个困难的问题实例映射到另一个困难的问题实例,但是解决后者的问题实例不一定能解决前者的问题实例。 Tight...

    babel-runtime-loose:Babel运行时的宽松版本

    babel-runtime-loose Babel运行时的宽松版本,减小最终捆绑包的大小。 USE WITH CAUTION 用法 Webpack: { " module " : { " alias " : { " babel-runtime " : " babel-runtime-loose " } } }

    GPS/SINS松组合/紧组合MATLAB仿真验证代码(GPS/SINS loose /tight )

    松组合(Loose Integration)是指GPS和SINS系统独立工作,各自的数据在特定时间点进行融合。这种组合方式相对简单,但不能有效抑制单独系统中的误差增长。 紧组合(Tight Integration)则更进一步,GPS和SINS的数据...

    PD.rar_HFSS_loose8dt

    标题中的“PD.rar_HFSS_loose8dt”暗示了这是一个与HFSS(High Frequency Structure Simulator)相关的项目,其中“loose8dt”可能是特定的参数设置或版本标识。HFSS是一款由ANSYS公司开发的电磁场仿真软件,广泛...

    http://www.w3.org/TR/html4/loose.dtd

    presentation attributes and elements that W3C expects to phase out as support for style sheets matures.... DTD when possible, but may use the Transitional DTD when support for presentation ...

    ESB-SOA-ACS.pptx

    * Loose Coupling:ESB使得不同的系统之间能够松耦合,避免了紧耦合带来的问题。 * Autonomy:ESB使得不同的系统能够自治,避免了中心化系统带来的问题。 * Abstraction:ESB提供了一个抽象层,隐藏了底层系统的复杂...

    传智播客javascript韩顺平笔记

    ### 传智播客javascript韩顺平笔记解析 #### JavaScript基本概念 JavaScript是一种广泛应用于Web开发领域的脚本语言。作为一种脚本语言,JavaScript的特点在于它并非像Java等编译型语言那样需要预先编译成机器可...

    xoss_html_loose59f_style_

    "Loose59f"可能是该项目的特定迭代或者版本号,这在软件开发中很常见,用来追踪代码的更新和改进。 "Web site style modal"进一步明确了我们的焦点在于网站的样式元素,特别是模态窗口。模态窗口是一种设计模式,它...

    藏经阁-美团点评数据平台融合实践.pdf

    * Loose Coupling:松耦合架构设计 * High Cohesion:高内聚架构设计 * Separation of Concerns:关注点分离架构设计 7. 数据平台的设计考虑: * 数据处理和分析的性能考虑 * 数据安全和隐私的考虑 * 数据平台的...

    html和css笔记

    DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">`,或XHTML的`<!DOCTYPE ...

    Android通过WebService连接SQLServer浅析.pdf

    2. loose Coupling松耦合:WebService 技术可以实现松耦合的设计,Android 应用程序和 SQL Server 之间的耦合度较低,易于维护和升级。 3. scalability可扩展性:WebService 技术可以实现可扩展的设计,Android 应用...

Global site tag (gtag.js) - Google Analytics