luoway / blog

个人博客,issues管理
19 stars 3 forks source link

架构模式——分层(Layers) #22

Open luoway opened 4 years ago

luoway commented 4 years ago

背景

需要分解的大型系统

问题

设计一个系统,其主要特征是需要同时解决高层问题和低层问题,且高层操作依赖于低层操作。

需要平衡以下作用力:

解决方案

将系统划分成适当的层数,并将它们堆叠起来。从最低的抽象层开始,沿抽象梯度往上堆叠到顶。

每层的所有组件都必须处于相同的抽象层级。第N层提供的大多数服务都由第N-1层提供的服务组成,服务还可能依赖于同一层的其他服务。

结构

分层模式的主要特征是:第N+1层只使用第N层的服务,层之间没有其他直接依赖关系。

这种结构类似于栈或洋葱,每层都将下面的各层保护起来,禁止上面的层直接访问它们。

动态

从上往下传输的信息和控制流被称为“请求”,从下往上传输的调用被称为“通知”。

实现

实现步骤,每步并非必不可少:

  1. 定义将任务划分到不同层的抽象准则

    例如,根据离硬件的距离划分较低的层,按概念复杂度划分较高的层。

  2. 根据抽象准则确定抽象层级数

    层数太多可能带来不必要的开销,层数太少又可能导致结构不清晰。

  3. 给每层命名并分派任务

    最高层的任务就是整个系统要完成的任务。其他各层的任务是辅佐上一层。

  4. 规范服务

    实现原则是相邻层界线分明,任何组件都不跨越多层。

  5. 完善层次划分

    反复执行1-4步,直到分层结构自然而稳定。

  6. 规范每层的接口

    黑盒方法:第N层对第N+1层而言是黑盒,就应设计一个统一接口,提供第N层的所有服务。

    白盒方法:第N+1层知道第N层的内部结构,直接调用服务。

    灰盒方法:第N+1层知道第N层的部分内部组件,直接调用这些组件,但不知道组件内部构造。

    应尽可能采用黑盒方法。

  7. 确定各层的结构

    重点是确保层间关系合理。对于复杂的层,应将其划分为多个组件,避免层内部混乱。

  8. 规范相邻层之间的通信

    在层间通信方面,最常用的机制是push模型:第N层调用第N-1层的服务时,随服务调用传递所需信息。

    相反的是pull模型,指下层根据自己的判断从上层取回信息,可能增加下层对上层的依赖关系。

  9. 将相邻层解耦

    自上而下的通信,适合使用单向耦合:修改第N层时,不用考虑第N+1层,条件是被修改的服务的接口和语义保持不变。

    自下而上的通信,可使用回调:上层向下层注册回调函数,特定事件发生时调用这些函数。下层负责存储事件到回调函数的映射。

  10. 制定错误处理策略

    错误发生后,要么在当前层处理,要么转给上一层。

    应尽可能在当前层处理错误,否则至少应该将类似的错误类型合并为更笼统的错误类型再向上传播。

示例解答

TCP/IP是使用最广泛的通信协议,它没有严格准守OSI模型,只包含4层:应用程序-TCP-IP-传输介质。

TCP/IP对各层的行为,及在各层间传输的数据分组的结构,做了严格的定义。

变种

已知应用

效果

分层模式具有以下优点:

缺点: