摘要: 上章节划定了我们要讨论的范围是基于网络应用的架构,接下来对基于网络应用的常见架构风格进行了调查,并针对每个风格进行多方面的评估
风格 | 继承 | 网络性能 | 用户感知性能 | 简单性 | 可进化性 | 可配置性 | 可扩展性 | 可重用性 | 可见性 |
---|---|---|---|---|---|---|---|---|---|
PF | ± | + | + | + | + | + | |||
UPF | PF | - | ± | ++ | + | ++ | + | ++ | + |
(-)是消极影响,(+)是积极影响,(±)是表示影响的性质取决于问题领域的某个方面,(空)是没有约束
每个过滤器(组件)从输入端读取数据流,在输出端产出数据流,通常会对输入数据流应用一种转换并增量的处理它们
缺点:
在PF风格的基础上增加了必须具有相同接口的约束
如Unix操作系统中,其中过滤器进程具有一个字符输入流(stdin)和两个字符输出数据流(stdout和siderr)组成的接口
通过限定使用这个接口就可以排列组合独立的过滤器形成新的应用,理解过滤器的运转也会变得简单
缺点:
风格 | 继承 | 用户感知的性能 | 效率 | 可伸缩性 | 简单性 | 可靠性 |
---|---|---|---|---|---|---|
RR | ++ | + | + | |||
$ | RR | + | + | + | + |
利用多个进程提供相同的服务来改善数据的可访问性、可伸缩性,给客户端制造出只有一个集中服务的幻觉
优点:
缺点:
缓存风格继承复制仓库风格,复制个别请求结果以便后面的请求复用
优点:
缺点:
风格 | 继承 | 网络性能 | 用户感知性能 | 效率 | 可伸缩性 | 简单性 | 可进化性 | 可重用性 | 可见性 | 可移植性 | 可靠性 |
---|---|---|---|---|---|---|---|---|---|---|---|
CS | + | + | + | ||||||||
LS | - | + | + | + | + | ||||||
L+CS | CS+LS | - | ++ | + | ++ | + | + | ||||
CSS | CS | - | ++ | + | + | + | + | ||||
CSS+$ | CSS+$ | - | + | + | ++ | + | + | + | + | ||
LC$SS | LCS+C$SS | - | ± | + | +++ | ++ | ++ | + | + | + | + |
RS | CS | + | - | + | + | - | |||||
RDA | CS | + | - | - | + | - |
这个是最常见的架构风格,服务端提供接口(服务),客户端通过连接器发送请求执行这个接口(服务),服务端收到后进行正常操作
分层系统(Layered System,LS)是按照层次来组织的,下面一层给上面一层提供服务,底层则会隐藏细节;在基于网络的系统中(前文提到的讨论范围),分层系统仅限于与CS相结合,形成LCS风格
LCS是在CS的基础上添加了代理(proxy)组件和网关(gateway)组件,例如我们目前前端开发使用的转发代理和API网关,这样额外的工作为系统添加了多个层,从而实现例如LoadBlance和Security Check
优点:
缺点:
该风格强调的是在服务端不允许有会话状态(session state),所以客户端给服务端发的每个请求都必须包含理解(解析到)请求的必备信息,会话状态交给客户端保存
优点:
缺点:
在CSS风格基础上增加了缓存风格,在客户端与服务端中间斡旋,重用历史的请求响应
优点:
该风格属于CS的一种变体,试图将客户端的复杂性最小化,可重用性(客户端)最大化,可以理解为“客户端的分布式会话”
优点:
缺点:
该风格是CS的一种变体,将应用状态分布在客户端和服务端上,如客户端发送一个查询格式(sql或者自定义查询参数)给服务端,服务端执行这个查询,返回一个结果集,客户端可以拿到结果集进行数据筛选或拼接
有点类似在某险看到的数据服务,提供查询接口,根据自定义参数返回想要的数据
优点:
缺点:
风格 | 继承 | 网络性能 | 用户感知的性能 | 效率 | 可伸缩性 | 简单性 | 可进化性 | 可扩展性 | 可定制性 | 可配置性 | 可重用性 | 可见性 | 可移植性 | 可靠性 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
VM | ± | + | - | + | ||||||||||
REV | CS+VM | + | - | ± | + | + | - | + | - | |||||
COD | CS+VM | + | + | + | ± | + | + | - |
所有的移动代码都需要以某种方式来执行,这正是是虚拟机风格,虚拟机通常被当做某些语言的引擎,如JVM
优点:
缺点:
顾名思义,类似我们在一些开源组件看到的GLUE模式,或者说Web IDE这种,客户端将需要执行的代码发到服务端,服务端进行执行
该风格与上面的REV核心方向是相反的,由客户端访问服务端拿到想要的代码在客户端本地执行
这种风格在做流程自动化机器人有用到,访问服务端接口拿到动态脚本,客户端这边执行自动化脚本实现页面自动化操作
风格 | 继承 | 网络性能 | 用户感知的性能 | 效率 | 可伸缩性 | 简单性 | 可进化性 | 可扩展性 | 可配置性 | 可重用性 | 可见性 | 可移植性 | 可靠性 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
EBI | + | – | ± | + | + | + | + | - | - | ||||
C2 | EBI+LCS | - | + | + | ++ | + | + | ++ | ± | + | ± |
该风格也被称为隐式调用风格或者事件系统风格,通过消除了解连接器接口的标识信息的必要性,降低了组件之间的耦合
组件调用是通过发布事件或者广播,由系统本身来调用订阅该事件的组件,基于事件的这种风格为可扩展性、可重用性和可进化性(这些架构属性在第二篇基于网络的架构有详细介绍)提供了强有力的支持
缺点:
C2风格是对上面EBI的一个加强,通过增加分层-客户-服务器(LCS)风格来达到支持大粒度的重用和解决了可伸缩问题
异步通知
消息向下传送,异步请求
消息向上传送