软件系统设计-架构(3) 架构模式
架构模式是一组架构设计决策,适用于重复出现的设计问题,并进行了参数化处理以解决出现该问题的不同软件开发环境。
An architectural pattern is a set of architectural design decisions that are applicable to a recurring design problem, and parameterized to account for different software development contexts in which that problem appears.
架构模式与DSSA相似,但适用于较低级别,范围更窄。
Architectural patterns are similar to DSSAs but applied at a lower level” and within a much narrower scope.
课本227页
1. 领域特定的软件架构 Domain-Specific Software Architecture
- 领域特定的软件架构(DSSA)是软件组件的组合
Domain- Specific Software Architectures (DSSA) is an assemblage of software components- 专用于特定类型的任务(域)
specialized for a particular type of task (domain) - 泛化以在该领域有效使用
generalized for effective use across that domain - 由标准化结构(拓扑)组成,可有效构建成功的应用程序
composed in a standardized structure (topology) effective for building successful applications.
- 专用于特定类型的任务(域)
- DSSA是最大限度地重用知识和进行先期开发并因此开发新的架构设计的卓越手段
DSSAs are the pre-eminent means for maximal reuse of knowledge and prior development and hence for developing a new architectural design.
2. (程序)设计模式 (Program) Design Patterns
3. 架构模式 Architectural Patterns
- 架构模式 Architecture pattern
- 是在实践中反复发现的一套设计决策
is a package of design decisions that is found repeatedly in practice, - 具有允许重复使用的已知属性,并且描述了一类架构
has known properties that permit reuse, and describes a class of architectures.
- 是在实践中反复发现的一套设计决策
- 架构模式建立了以下之间的关系:Architecture pattern establishes a relationship between:
- 上下文:一个世界上经常发生的普遍情况,会引起一个问题
A context: A recurring, common situation in the world that gives rise to a problem. - 一个问题:在给定的上下文中出现的问题,经过适当概括
A problem: The problem, appropriately generalized, that arises in the given context. - 解决方案:针对问题的成功架构解决方案,并进行了适当抽象
A solution: A successful architecture resolution to the problem, appropriately abstracted.
- 上下文:一个世界上经常发生的普遍情况,会引起一个问题
- 在实践中找到模式 Patterns are found in practice
- 模式不是发明的,而是发现的 One does not invent patterns, one discovers them
- 永远不会有一个完整的模式列表 There will never be a complete list of patterns
3.1 分层模式 Layered Pattern
对应4+1视图中的逻辑视图
3.1.1 解决方案 Layered Pattern Solution
层间的访问必须按照逐层进行访问
3.1.2 堆叠盒表示法 Stack-of-boxes Notation
3.1.3 基于分层模式的系统 Layered Pattern Based System
3.1.4 分层模式变体 Layered Pattern Variants
- 上面的A、B、C:不是一种分层模式
- 分层的核心是为了实现关注点分离
- 不是分层模式:
- 形成了环状依赖
- 没有实现关注点分离,一个的修改可能有多个原因
- 是一种软件的坏味道
- 下面的A、B、C、D:是一种分层模式
- 也可以是一种分层模式,D不期待A的结果且D不期待B的结果
- 而严格意义和其他场景中,不认为是一种分层模式
3.1.5 分层模式对质量属性的影响
- 可修改性
- 可模块化
- 可维护性
- 可复用性
3.2 代理模式 Broker Pattern
Broker可以理解为中间人,撮合双方达成交易。
3.2.1 解决方案 Broker Pattern Solution
3.2.2 概述图
3.2.3 质量属性体现模式的优缺点
- 优点
- Interoperability:根本目的,提高Server-Client之间的交互性
- Scaliability:可伸缩和扩展
- Modifiabiliy:
- 两面性:
- Security:代理对象屏蔽了系统内部的具体实现
- Reliability:服务降级和实例重启
- Availability:
- 缺点
- Security:成为被攻击的对象
- Reliabiliy:可靠性会降低
- 两面性:
- Performance:整体大集群的性能可能会提高(QPS等提高),但是局部单点性能会下降,多次网络请求、多次匹配,有可能会抵消。
3.3 模型-视图-控制器模式 Model-View-Controller Pattern(MVC)
- 使用运行时、动态、相互之间的关系来审视,集成到了开发框架中,也是分层架构的变种(会强调各模块之间的约束关系,model不可以直接返回到controller)
- model 业务逻辑
- view 处理用户展示,接收用户操作
- controller 对用户操作进行处理,将信息通知给model
- model -> controller 不会产生通信
3.3.1 解决方案
3.3.2 概述图
3.4 管道和过滤器模式 Pipe-and-Filter Pattern
- filter:相当于component,起到数据处理、计算作用,每个filter有input和多个output,数据处理后传递给后续的部分。
- pipe:连接filter,相当于connector,将output导入到其他的filter的input中去,不会孤立存在。
- 管道和过滤模式不会孤立存在,应用在顺序处理结构,有一系列的数据结构filter,体现依赖关系。
- 场景应用在科学计算的场景中,需要避免出现环形的filter,不适用于有很多交互产生的场景。
3.4.1 解决方案
3.4.2 基于管道和过滤器模式的系统
- 每一组件表示filter,连接两个组件的部分是pipe(类似于queue交易任务的排队等待处理)
- 任何一个filter都依赖于前一个filter的输出,中间没有机会接收外部的交互来改变严格定义好的流程。
- 不适用于一些可以引入变形的场景(相互独立、不依赖前面的产出,会带来损耗)
3.5 客户端-服务端模式 Client-Server Pattern
- 包含两类不同的component
- 请求发起client、server接收请求,这里没有broker,不能动态改变client和server的关系,相对更固定,但是一个client可以连接多个server
- 一个component在一个关系中可以是client,也可能是server,非绝对,但是成对的关系相对固定。
- 会受到负载的限制。
- Server可能有性能瓶颈,但是可以通过事先规划避免。
- Server可能单点失效,但是broker可以控制
3.5.1 解决方案
3.5.2 基于客户端-服务端模式的系统
- ATM 验证身份,某一个server会给很多设备提供服务。
- ATM 操作安全监控、盗刷之类,通过 monitoring 发现问题找到记录
- 对银行工作人员而言,需要新的业务,policy发生变化,银行工作人员定义ATM上的操作
- 银行负责安全金融的根据ATM、对照用户操作行为是否有安全隐患,多对多。
- 问题:broker也存在client和server之间的关系,对质量属性的影响,做一下比较,broker是之前,c/s是90年代流行广泛应用
- 互操作性:可能导致变弱?没有broker,需要人为连接
- 安全性:Client、Server不采用broker 可能被拦截
- 伸缩性
- 性能
- 可修改性
- 小型局域网、互联网还没有普及,规模有限,直接联系,性能上安全性可能带来更大收益
- broker的一些负面影响就不必承担了,c/s会比broker投入更少,收益可能更大
3.6 Peer-to-Peer Pattern 点对点模式
- 这一刻是提供者,下一刻就是消费者,是对等的。
- 不单单提供服务,还能提供物流(对于整个网络)
- 对每一个peer可能会给他一个规定对的连接数
3.6.1 解决方案
3.6.2 基于点对点模式的系统
- 可能安全性不受保障,因为节点既是Client又是Server,被攻击可能性提高了,attack、surface受攻击面变大
- 数据分布在不同的节点上,相同数据多处拷贝,如果要的话,可能会导致数据不一致(数据一致性难度更大),不能保证数据一定可用,数据可用性不能百分之百保证。
- 可用性 availability,同一个数据多个副本,所以个别数据出问题不影响整体。
- 但又不能保证availability,不会以后任何一个节点有权限。
- Performance:多个节点同时提供服务,性能快(多个渠道获取数据,并行能力提高)
3.7 Service-Oriented Pattern 面向服务的模式
- broker架构的延续。
- component包含服务提供者、服务消费者。
- 除了这些component还有ESB、企业服务组件、连接处理,包括发现、注册。
- Registry of Services
- Orchestration Server 不同的Service按照一定的顺序进行编排,提供更高级的(申请贷款流程)
- Connectors:
- SOAP:
- REST:
- Asynchronous messaging connector
3.7.1 解决方案
3.7.2 基于SOA的系统
- 旅行社有一系列需求
- 真正提供服务的是酒店、导游之类的,系统需要通过Web Service Broker连接到不同的真正提供者。下单:商家发货。
3.7.3 SOA中的连接器 Connectors in SOA
- SOAP(简单对象访问协议):服务使用者和提供者通过通常在HTTP之上交换请求/答复XML消息进行交互
SOAP (Simple Object Access Protocol): Service consumers and providers interact by exchanging request/reply XML messages typically on top of HTTP - REST(表征状态转移):服务使用者发送依赖于四个基本HTTP命令(POST,GET,PUT,DELETE)的HTTP请求
REST (Representational State Transfer) : A service consumer sends HTTP requests that rely on four basic HTTP commands (POST, GET, PUT, DELETE) - 异步消息传递(“即发即忘”):参与者不必等待接受确认
Asynchronous messaging (“fire-and-forget”): Participants do not have to wait for an acknowledgment of receipt.
3.7.4 SOA和其他架构的区别
- 具备broker的优势,这里又不想继承broker,所以broker消失了
- 出现类似集基础设施的组件,代替单一节点broker,单点失效的问题消失了
- 商业模式的变化、看技术可用性
- 基础条件——互联网普及范围参与者人数规模比以往大这样一个背景下打破broker c-s
- 追求更高互操作性更高伸缩性
- 技术条件下提供的服务越来越多现在可以分得更细更大差异化更细粒度的组合可以实现出来社会分工越来越细(不同航空公司不同酒店细粒度体现如果固定就很难实现差异化)微服务也是这样的体现服务粒度越来越小是有很多技术条件支持的(单体系统内部复杂度外化外面复杂度可以进行动态绑定可以提供多样化服务)
3.8 发布-订阅模式 Publish-Subscribe Pattern
- subscribe注册对于publiser进行注册
- 某一个publiser发布自己的消息可能订阅其他消息(朋友圈微博)
3.8.1 解决方案
- 传统操作系统也是通过事件驱动方式来管理的
- IDE环境注册后就行结构发布的事件
- 数据发生变化会反映到环境中去
- 性能上的延迟(可限制subscriber数量订阅越多性能下降)
- scalability publisher数量不会变多
- 发布者不关心每个订阅者都收到不是guarantee
3.8.2 基于发布-订阅模式的系统
3.9 共享数据模式 Shared-Data Pattern
中间安全数据会被很多人共享登录访问
3.9.1 解决方案
- 这样一个系统模式有什么问题嘛?
- 单点失效性能瓶颈问题(都要对它操作) 安全性(攻击中心点有风险)对安全性数据来说强调强一致性如果有副本有一段时间才能到其他副本上更(可能成为漏洞任何时刻访问数据都必须一致)
- 一致性
- CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)
- 看哪个更重要只能同时实现两者
- 其他实现一致性方式:最终一致性(不保证任何时候访问数据都一致但是可以保证最终结果要一致) 互联网不可能牺牲可用性也必须是分布式结构(面对分布在很多地方保证信号要求) 一致性设计难度非常大
3.9.2 基于共享数据模式的系统
既有读又有写
3.10 Map-Reduce Pattern
- 软件和外部环境的关系 部署
- map对数据进行抽取所需要的信息信息转换
- 可以有多个map 处理数据工作内容不一样
- 相互独立可以运行
- reduce进行合并产出想要的答案
3.10.1 解决方案
- map reduce部署在不同的地方
- 词频分析案例大量数据
- Map-Reduce Based System
- 每一个partition对应一个map 每一个map任务一样不同实例
- 所有词汇使用频率标注出来
- 通过reduce进行合并
- 最后进行排序
3.10.2 基于Map-Reduce模式的系统
3.11 Multi-Tier Pattern 多层模式
- 部署的环境划分
- layer是真实存在的
- 这里是逻辑的组合没有和层的强依赖关系
- 不同的部署环境里面分层不同但是软件完成内容一样
3.11.1 解决方案
- 旅行社例子
- tier只是部署方案决定并没有改变代码本身
3.11.2 基于多层模式的系统
三大类:modular类、runtime process动态类、软件和非软件环境关系(部署关系)11个架构模式
3.12 不同的模式对于质量属性不同的影响
某一个Pattern会对一些质量属性产生积极影响,但是也会对其他属性产生不好的影响
4. 模式与策略 Architecture Patterns and Tactics
- 策略比模式简单。他们使用单一的结构或机制来应对单一的架构力量
Tactics are simpler than patterns; they use a single structure or mechanism to address a single architectural force. - 模式通常将多个设计决策组合到一个包中
Patterns typically combine multiple design decisions into a package. - 模式和策略共同构成了软件设计师的主要工具
Patterns and tactics together constitute the software architect’s primary tools. - 策略是设计的“构建块”,从中创建架构模式。
Tactics are “building blocks” of design from which architectural patterns are created. - 大多数模式包含几种不同的策略 Most patterns consist of several different tactics that may:
- 都有共同的目的 all serve a common purpose,
- 经常被选择来承诺不同的质量属性 be often chosen to promise different quality attributes
- 示例:分层模式 Example: layered pattern
- 提高语义连贯性 Increase semantic coherence
- 限制依赖 Restrict dependencies
- tactic是设计最小粒度tactic进行组合一个tactic是为了某一个质量属性也会影响其他属性(正面、负面)
- 针对某一个质量属性Modifiablity 相关的 tactic 和 pattern 之间的关系是否涉及到
- 设计深度问题
图一:
- 椭圆形——某一个 tactic 如ping/Echo
- 可用性有贡献但是可能会产生其他影响(系统复杂度、资源影响、性能)
- 如果性能很在意就对它单独进行设计成本、增加资源利用率问题
图三:
- 为了提高利用率需要引入调度机制
- 最终判断是ASR
- 负面影响系统可以容忍对最在意的 ASR 可以忽略就可以停止,每一个 tactic 都会增加系统复杂度和规模
- 没有足够人力物力实现也可以停止
- 整个过程不断迭代最后达成妥协