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

本文涉及的产品
性能测试 PTS,5000VUM额度
应用实时监控服务-应用监控,每月50GB免费额度
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 【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、把相同逻辑与抽象级别内容放一个层次,易于理解和开发。
目录
相关文章
|
7月前
|
存储 Java 数据库连接
成为工程师 - 系统分层的设计原则
成为工程师 - 系统分层的设计原则
|
10月前
|
架构师 微服务
什么是软件架构?架构的本质是什么?
定义 ”架构是什么“ 是件非常困难的事情,不同的组织对于软件架构有不同的定义,每个人心中也有自身对于系统架构定义的认知。就好比我们无法百分之百表述模型而只能产出模型不同维度的视图,对架构进行完备的定义是不可能的。
191 4
|
10月前
|
前端开发 Oracle 安全
软件架构设计 C/S与B/S架构的区别
C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle或SQLServer。
106 0
|
消息中间件 缓存 前端开发
新项目,不妨采用这种架构分层,很优雅!
新项目,不妨采用这种架构分层,很优雅!
289 0
|
存储 Oracle 关系型数据库
软件架构编年史:分层架构
软件架构编年史:分层架构
软件架构编年史:分层架构
|
前端开发 Oracle 关系型数据库
【代码分层结构设计】思想学习
本文主要摘录个人写代码的心得体会。
182 0
|
Java 数据库
架构视角-到底如何做好分层
在进行程序开发和设计时我们常常提到分层的概念,但是怎么样的分层才是好的分层呢,这篇谈谈在如何分层这个问题上的一些体会,和大家探讨一下
206 0
架构视角-到底如何做好分层
|
数据库连接 数据库
经典三层架构以及分层的原则
经典三层架构以及分层的原则
291 0
|
存储 缓存 移动开发
软件架构分层方法论(下)
软件架构分层方法论
542 0
软件架构分层方法论(下)
|
SQL 存储 分布式计算
从方法到思维:什么是应用逻辑架构的正确姿势?(上)
本文分享阿里资深技术专家六铢的架构方法论,这套方法论中包含了详细的架构推导逻辑,希望能够帮助大家在工作中从各个粒度、各个层次来做好架构工作。较长,同学们可先收藏再看。
2211 2
从方法到思维:什么是应用逻辑架构的正确姿势?(上)