人类的智力存在上限和没法扩容多是人类文明发展的最大障碍。为了解决这一问题,人类发展史上全部的科技发明,无一不是千方百计来扩容脑力。软件做为一种模仿人类脑力活动的“生命体”,在其发展早期,也遇到相似问题,Frederick P. Brooks, Jr.教授著名的“人月神话”观点就是对这一现象的总结。为了解决这一问题,软件科学发展了不少方法论和技术,好比分布式,好比咱们今天的主题:软件架构和模式。html
学习一个概念,若是知道这些概念要为了解决什么问题,解决谁的问题,对深刻掌握它有事半功倍的效果。对于软件架构这个概念,业界并无一个统1、标准的定义,若是要看透看全面,咱们也须要从不一样视角来了解它。程序员
什么是软件架构,不一样视角下,有着彻底不同的解读。算法
从组成的角度看:架构=组件+交互:软件系统的架构将系统描述为计算组件及组件之间的交互。这是《软件构架实践》做者Bass、《企业应用架构模式》做者Martin Fowler等人的观点。shell
从决策的角度看:架构=重要决策集:架构表示对一个系统的成型起关键做用的设计决策,架构定系统基本就成型了,这里的关键性能够由变化的成原本决定。这是UML的创始人Grady Booch等人的观点。数据库
从需求的角度看:架构实际上解决的是人的问题,系统架构的目标是解决利益相关者的关注点。编程
从演化的角度看:架构是用于管理复杂性、易变性和不肯定性,以确保在长期的系统演化过程当中,一部分架构的变化不会对架构的其它部分产生没必要要的负面影响。这样作能够确保业务和研发效率的敏捷,让应用的易变部分可以频繁地变化,对应用的其它部分的影响尽量地小。安全
首先,找到全部的利益干系人,并为他们服务。不一样干系人看待架构有不一样的视角,这就是架构视图。架构视图分不少种,常见的有逻辑架构视图、开发架构视图、运行架构视图、数据架构视图和物理架构视图等,这其中最经常使用的是逻辑架构视图和物理架构视图。逻辑视图用于指导设计开发,物理视图用于指导部署运维。服务器
其次,发现并解决利益干系人关注点背后真正的问题。发现问题永远都比解决问题来的更加剧要。网络
最后,符合康威定律,软件架构要与组织架构要一致,只有这样才可以让架构落地并推动。若是不一致,要么调整软件构架,要么调整组织架构。数据结构
模式(Pattern)其实就是解决某一类问题的方法论。而软件架构模式就是解决某一类软件组织构架问题的通用形式。现有的软件架构模式以下图所示。其中分层架构、事件驱动架构、微服务架构、面向服务架构等在阮一峰的《软件架构入门》一文有较详细的介绍。可是还有很多问题没有谈及,好比,这么多架构模式如何选择?每种架构模式解决什么问题?适用什么场景?本节想对这块重点作下比较说明,算是一个补充。
适用场景:
复杂系统的各个部分须要独立开发和演进。开发人员的关注点分离,系统模块能够独立地开发维护。
解决问题:
如何保证软件模块能够独立开发和演进,模块间尽量少的交互,模块支持可移植性、可修改性和可重用性等质量属性?
解决方案:
为达到关注点分离,软件以层为单位进行划分,层是一组提供内聚服务模块组合。层经过公共接口对外提供服务,层级调用必须是单向的。
模式缺点:
适用场景:
分布式系统。其提供的服务分布在不一样服务器上。它们的互连关系、交换信息方式等交互复杂。系统对服务的可用性有较高要求。
解决问题:
如何实现分布式软件系统,让用户不须要感知服务提供方的位置,而且用户和服务提供方之间的绑定关系能够动态变化?
解决方案:
经过Broker组件,解耦客户端和服务端。服务端注册本身到Broker,经过暴露接口的方式容许客户端接入服务。客户端经过Broker发送请求,Broker转发请求到服务端,并将请求的结果或异常返回给客户端。经过使用Broker模式,应用能够经过发送消息访问远程的服务。
这一架构模式容许动态的改变、添加、删除服务端,从客户端的角度,这些都是透明的。
模式缺点:
适用场景:
包含有人机互动介面(UI)的系统。用户但愿从不一样视角来查看数据,如柱状图、饼状图等。
解决问题:
如何实现用户界面(UI)与应用逻辑的分离,并保证系统能响应用户不一样的输入或对应用数据的修改?当底层应用数据变化时,用户界面的多视角如何建立、维护和协调?
解决方案:
model-view-controller模式将系统划分为3个组成要素:
模式缺点:
适用场景:
处理数据流的系统。输入数据后,通过一系列的数据加工转换后输出。数据转换动做重复、独立、可复用,支持并发。
解决问题:
如何将系统切分为可复用、松散耦合的组件,而且组件间的交互足够简单?如何保证组件能够弹性组合,组件通用、低耦合、可复用,而且可并发执行?
解决方案:
管道和过滤器(Pipes and Filters)架构模式由过滤器和管道组成。每一个处理步骤都被封装在一个过滤器组件中 , 数据经过相邻过滤器之间的管道进行传输。每一个过滤器能够单独修改 , 功能单一 , 而且它们之间的顺序能够进行配置。Unix shell管道和编译器都是典型的例子。
模式缺点:
适用场景:
分布式系统。系统中大量的分散的客户端对共享的资源和服务进行访问。
解决问题:
如何在资源和服务分布在多个物理服务器的分布式系统中,经过对共享资源进行集中管理,提升系统的可维护性和可复用性,改进其可扩展性和可用性?
解决方案:
CS架构模式由client和server2个要素组成。server提供服务,client请求server的服务,系统交互由client发起。系统能够有一个中央server,也能够是多个分布式server。
模式缺点:
适用场景:
分布式系统。系统中每一个组件的地位对等,均可以主动发起交互和对外提供服务。
解决问题:
地位对等组件间的互连公共协议如何实现?如何保证系统的高可用性和可扩展性?
解决方案:
P2P模式由peer和connector 2个要素组成。全部的peer地位对等,不是单点失效节点。peer间经过request/reply connector链接并直接交互。
Peer:运行在网络节点上的独立组件。特定peer组件(如图中的超级节点ultrapeer)能够提供路由、索引、查找等功能。
Request/reply connector:用于链接peer网络,查找其余peer节点和调用其余peer节点上的服务。
模式缺点:
适用场景:
异构的分布式系统。服务提供方提供服务,并由用户使用。用户不须要了解服务的实现细节,便可理解和使用它们。
解决问题:
一个系统中,服务组件运行在不一样的平台,由不一样的编程语言开发,由不一样的组织提供,分布在各网络节点中,如何保证这些组件的互操做性?
解决方案:
采用中央管理模式来确保各服务可以交互运做,服务间经过链接件交互,经过网络对外提供或使用服务。SOA模式由以下几个要素组成。
模式缺点:
适用场景:
分布式系统。基于服务的企业应用,支持网页、手机客户端等不一样的访问方式。
解决问题:
单块架构的应用可能过于庞大和复杂,难以维护,严重影响效率。并且没法进行分布式部署和弹性扩容。
解决方案:
微服务架构模式是一种将商业逻辑切分为一系列能够独立开发和部署的服务的架构。其中各项服务都拥有本身的进程,利用轻量化机制或RESTful接口实现通讯。这些服务围绕业务功能创建而成,且凭借自动化部署机制实现独立部署。这些服务匹配一套最低限度的中央式管理机制,且各服务可经过不一样编程语言编写而成,拥有本身独立的数据库,由不一样的开发团队开发。
模式缺点:
适用场景:
系统中有大量的独立的数据生产者和数据消费者,数据生产者和消费者的数量和种类动态变化。它们经过数据交互,但数据在它们之间不共享。
解决问题:
如何创建一种消息传输机制,使生产者和消费者之间相互不感知?
解决方案:
发布订阅模式由3个要素组成。组件经过消息或事件交互。发布者将消息发布到总线上,订阅者注册它们感兴趣的事件,订阅管理器负责将这些事件的副本发送给订阅者。
模式缺点:
适用场景:
系统中不一样的计算组件须要共享和操做大量数据,这些数据不单独属于某一个组件。
解决问题:
系统如何存储和操做这些持久化数据?
解决方案:
共享数据模式由三部分组成。
模式缺点:
适用场景:
一个新兴的或者不成熟的领域,没有肯定的或优化的问题解决方案。软件系统须要集成多种形态不一样的模块,以便实现复杂的、非肯定性的控制策略。如语音识别、如人工智能领域等。
解决问题:
问题设计多个专业子领域,每一个子领域都有一套独立的算法。鉴于领域不成熟,可能须要尝试不一样的算法。由于涉及不可靠的数据,只能求近似解,没法找到最优解。算法的执行顺序不肯定时还可能要求支持并行性。
解决方案:
Blackboard架构模式对还未找到肯定解决策略的问题颇有帮助。在Blackboard模式中,多个专业子系统经过集思广益,得到可能的部分解或近似解。
Blackboard架构背后的理念是,一系列独立的程序携手合做,在公共数据结构(即blackboard)上进行计算,中央控制器根据结果状态对知识源进行协调控制。
在解决问题的过程当中,系统经过合并、修正或否决部分解来完成工做。每一个部分解都针对一个子问题,是这个子问题的最终解在特定阶段的表现形式。全部的可能解构成解空间,并被组织成多个抽象层级,其中最低层为输入的内部表示,最高层包含系统要解决的整个问题的可能解。
之因此使用名称“黑板”(blackboard),是由于它让人想起专家们站在黑板前协做解决问题的情形。专家们一般自行决定接下来该由谁来到黑板前,而在这里介绍的模式中,若是有多个程序都能提供帮助,将由调停者(moderator)组件决定这些程序的执行顺序。
黑板模式包含3个要素。
模式缺点:
适用场景:
异步系统。系统对进入的独立、异步事件,无论事件量多寡急缓,都须要对事件进行按需及时处理,
解决问题:
如何构建能够处理异步到达消息/事件的分布式系统,而且具备弹性的扩展能力?
解决方案:
部署独立的事件处理器用于事件处理,对到达的事件进行排队。分发器从队列中拉取事件,并基于调度策略把事件分发到合适的事件处理器进行处理。事件驱动架构(event-driven architecture)由四部分组成。
模式缺点:
适用场景:
对PB数量级的巨量数据进行快速分析、计算的业务场景。
解决问题:
如何高效率地对巨量数据进行分布式、并行排序,并提供一种分析、使用的简单方法。
解决方案:
MapReduce模式提供一种对分散的巨量数据的并行分析方法。这种并行方法保证低时延和高可用性。map执行数据的提取和转换,reduce对map结果进行合并。改模式分为3部分。
模式缺点:
MapReduce开销较大,特别是数据集较小时。
List of software architecture styles and patterns
Software Requirements and Architecture Engineering
(完)