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

本文涉及的产品
函数计算FC,每月15万CU 3个月
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
注册配置 MSE Nacos/ZooKeeper,182元/月
简介: 【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、把相同逻辑与抽象级别内容放一个层次,易于理解和开发。
目录
相关文章
|
Java fastjson API
Springboot 整合 xxljob 动态API调度任务(进阶篇)
Springboot 整合 xxljob 动态API调度任务(进阶篇)
7689 0
Springboot 整合 xxljob 动态API调度任务(进阶篇)
|
算法 Unix API
指数退避(Exponential backoff)在网络请求中的应用
## 一、背景 最近做云服务 API 测试项目的过程中,发现某些时候会大批量调用 API,从而导致限流的报错。在遇到这种报错时,传统的重试策略是每隔一段时间重试一次。但由于是固定的时间重试一次,重试时又会有大量的请求在同一时刻涌入,会不断地造成限流。 这让我回想起两年前在查阅[Celery Task 文档](http://docs.celeryproject.org/en/latest
13606 1
|
测试技术
软件测试区分:条件组合覆盖、语句覆盖、判定覆盖、条件覆盖、路径覆盖
本文解释了软件测试中的不同覆盖标准,包括语句覆盖、判定覆盖、条件覆盖、条件组合覆盖和路径覆盖,并讨论了每种覆盖标准的特点、优点和缺点。
3466 62
|
SQL 设计模式 算法
软件体系结构 - 架构风格(8)解释器架构风格
【4月更文挑战第21天】软件体系结构 - 架构风格(8)解释器架构风格
1933 0
ELK 圣经:Elasticsearch、Logstash、Kibana 从入门到精通
ELK是一套强大的日志管理和分析工具,广泛应用于日志监控、故障排查、业务分析等场景。本文档将详细介绍ELK的各个组件及其配置方法,帮助读者从零开始掌握ELK的使用。
|
存储 持续交付 虚拟化
|
Java Spring
SpringBoot: 启动Banner在线生成工具
SpringBoot: 启动Banner在线生成工具
36322 1
SpringBoot: 启动Banner在线生成工具
|
运维 监控 Java
微服务:知识点梳理(SOA、服务拆分、服务治理、分布式事务)
微服务:知识点梳理(SOA、服务拆分、服务治理、分布式事务)
微服务:知识点梳理(SOA、服务拆分、服务治理、分布式事务)
|
Java Shell
Gradle的安装及换源
Gradle的安装及换源
7251 1