避免服务分层污水池反模式

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
函数计算FC,每月15万CU 3个月
应用实时监控服务-用户体验监控,每月100OCU免费额度
简介: 【6月更文挑战第30天】本文介绍污水池反模式,分层架构在敏捷性、部署性和性能方面得分较低,但具有高测试性和易开发性。关键在于合理分层以降低耦合和提高解耦效果。

简介

分层易调试性和可扩展性有限,但是尤其要避免无用膨胀,“污水池反模式”,即层间缺乏实质性业务处理。

虽然可能导致应用庞大和复杂,但因其良好的复用性、可维护性和递增设计支持,仍被广泛采用。

treeoflife6.png

1 不同维度分析应用分层

  • 整体敏捷性: 低

分析:整体敏捷性是对不断变化的环境做出快速响应的能力。

虽然可以通过此模式的隔离层功能来隔离更改,但由于大多数实现的单体性质以及通常使用此模式的组件的紧密耦合,因此在此体系结构模式中进行更改仍然很麻烦且耗时。

  • 易于部署性:低

分析:根据实现此模式的方式,部署可能会成为一个问题,特别是对于较大的应用程序。

对组件的一个小改动可能需要重新部署整个应用程序(或应用程序的大部分),从而导致需要在下班时间或周末计划、安排和执行部署。因此,此模式不容易用于持续交付管道,从而进一步降低了部署的总体评级。

  • 可调试可测试性: 高

分析:由于组件属于体系结构中的特定层,因此可以模拟或存根其他层,因此此模式相对容易测试。开发人员可以模拟演示组件或屏幕以隔离业务组件中的测试,也可以模拟业务层以测试某些屏幕功能。

  • 性能: 低

分析:虽然某些分层体系结构确实可以很好地执行,但由于必须通过体系结构的多个层来满足业务请求,因此该模式并不适合高性能应用程序。

  • 可扩展性:低

分析:由于此模式的紧密耦合和整体实现的趋势,使用此体系结构模式生成的应用程序通常难以扩展。

可以通过将分层架构拆分为单独的物理部署或将整个应用程序复制到多个节点来扩展分层架构,但总体而言,粒度太宽,导致扩展成本较高。

  • 易于开发:高

分析:易开发性获得了相对较高的分数,主要是因为这种模式非常有名,而且实现起来并不太复杂。

由于大多数公司通过按层(表示、业务、数据库)分离技能集来开发应用程序,因此此模式成为大多数业务应用程序开发的自然选择。(康威定律 1967)

另一种表达方式,康威定律是指任何设计系统的组织,其组织沟通方式会通过系统设计表达出来。

image.png

2 使用分层时需要避免污水池反模式

层次式体系结构是一个可靠的通用的架构,对很多应用来说,如果不确定哪种架构适合,
可以用它作为一个初始架构。设计时要注意以下两点:

  • (1)要注意的是污水池反模式。

所谓污水池反模式(architecture sinkhole anti-pattern),就是请求流简单地穿过几个层,每层里面基本没有做任何业务逻辑,或者做了很少的业务逻辑。比如一些Java项目例子,业务逻辑层只是简单的调用了持久层的接口,本身没有什么业务逻辑。

每一层或多或少都有可能遇到这样的场景,关键是分析这样的请求的百分比是多少。二八原则可以帮助你决定是否正在遇到污水池反模式。如果请求超过20则应该考虑让一些层变成开放的。

  • (2)需要考虑的是分层架构可能会让你的应用变得庞大。

即使你的表现层和中间层可以独立发布,但它的确会带来一些潜在的问题,比如:分布模式复杂、健壮性下降、可靠性和性能的不足,以及代码规模的膨胀等。

比如在不同企业组织架构不同,导致应用架构膨胀方式的不同。(图片来自网络)

image.png

3 小结

层次式体系结构设计是将系统组成一个层次结构,每一层为上层服务,并作为下层客户。

在一些层次系统中,除了一些精心挑选的输出函数外,内部的层接口只对相邻的层可见。连接件通过决定层间如何交互的协议来定义,拓扑约束包括对相邻层间交互的约束。

严格约束的环境,由于每一层最多只影响两层,同时只要给相邻层提供相同的接口,允许每层用不同的方法实现,同样为软件重用提供了强大的支持。

分层由于其易于使用和理解开发,仍然是现代普遍存在的架构,因为有如下优势

1、良好的复用性,只要接口不变可用在其它处;
2、可维护性好;
3、可扩展性好,支持递增设计
4、经过合理分层,让系统整体耦合性降低,达到解耦效果
5、把相同逻辑与抽象级别内容放一个层次,易于理解和开发。
目录
相关文章
|
6月前
|
设计模式 前端开发 网络协议
软件体系结构 - 软件架构复用
软件体系结构 - 软件架构复用
272 0
|
3月前
|
存储 Java 数据库连接
成为工程师 - 系统分层的设计原则
成为工程师 - 系统分层的设计原则
|
6月前
|
存储 设计模式 编译器
软件体系结构 - 复杂指令集架构 (CISC)
【4月更文挑战第18天】软件体系结构 - 复杂指令集架构 (CISC)
236 6
|
6月前
|
设计模式 缓存 BI
软件体系结构 - CQRS
【4月更文挑战第23天】软件体系结构 - CQRS
64 0
|
设计模式 Oracle 关系型数据库
软件架构设计原则之合成复用原则
合成复用原则(Composite/Aggregate Reuse Principle,CARP)是指尽量使用对象组合(has-a)/聚合(contanis-a)而不是继承关系达到软件复用的目的。可以使系统更加灵活,降低类与类之间的耦合度,一个类的变化对其他类造成的影响相对较少。
112 0
|
消息中间件 存储 NoSQL
【软件架构】软件架构权衡系列 - 第 1 部分
【软件架构】软件架构权衡系列 - 第 1 部分
|
设计模式 缓存 监控
【软件架构】支持大规模系统的设计模式和原则
【软件架构】支持大规模系统的设计模式和原则
|
JSON 缓存 监控
代码分层设计
在搭建一个项目之前,除了要进行架构和业务方面的设计和分析,往往还需要对代码的结构进行规范化设计。而分层思想,是应用系统最常见的一种架构模式。
597 0
|
存储 Oracle 关系型数据库
软件架构编年史:分层架构
软件架构编年史:分层架构
软件架构编年史:分层架构
|
前端开发 Oracle 关系型数据库
【代码分层结构设计】思想学习
本文主要摘录个人写代码的心得体会。
159 0