明明服务化了,为啥耦合更加严重了?

2023-11-30 13:32

本文主要是介绍明明服务化了,为啥耦合更加严重了?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

什么是耦合?

耦合,是架构中,本来不相干的代码、模块、服务、系统因为某些原因联系在一起,各自独立性差,影响则相互影响,变动则相互变动的一种架构状态。

感官上,怎么发现系统中的耦合?

作为技术人,每每在心中骂上下游,骂兄弟部门,“这个东西跟我有什么关系?为什么需要我来配合做这个事情?”。明明不应该联动,却要被动配合,就可能有潜在的耦合。

 

但如果服务化不合理,将部分个性化业务下沉到了底层,就是一个耦合的典型案例。

 

场景还原

业务1,业务2,业务3,因为join导致数据库实例耦合在了一起。

为了实现通用数据库table-user的解耦,实施了服务化,将通用user数据的访问抽象出了服务。

由于服务化不合理,会有很少很少的个性化业务逻辑,实现在底层的服务中,典型的伪代码是:

switch(biz_type){

 case(1) : exec_logic1();

 case(2) : exec_logic2();

 case(3) : exec_logic3();

 default : exec_default();

}

 

为什么会引发耦合呢?

不妨设,业务1来了一个新的个性化需求,这个需求本来实现在业务1自己的代码里是合理的,但工程师S想到,底层的通用服务里也有业务1的一小撮个性化代码,评估后,发现实现在底层新的需求改动的代码最小,时间最短,于是来找底层服务的负责人工程师B。

 - 业务1工程师S:“有个小需求,帮个忙呗”

 - 底层工程师B:“个性化实现在底层不合理”

 - 业务1工程师S:“反正都有switch case的代码了,再改一点也不麻烦,在我这边实现特别复杂,要xxoo这么搞”

 - 底层工程师B:“确实很复杂,那我来吧”

- …

 

遗留了不合理的代码,就会有第一次妥协,妥协了业务1,就会妥协业务2,随着时间的推移,底层服务越来越复杂

(1)业务1,业务2,业务3的个性化代码越来越多;

(2)业务1,业务2,业务3的需求越来越多提给底层工程师;

(3)底层工程师慢慢成了项目瓶颈,业务1,业务2,业务3的项目逐步delay,但逐步都怪到了底层工程师的头上;

 

直到有一天,底层服务出了一个小bug,影响了业务1,业务2,业务3,历史总是惊人的相似:

 - 业务1的大boss在群里首先发飙:“技术都干啥了,怎么系统挂了”

 - 业务1的工程师S一脸无辜:“底层系统改造,工程师S的bug”

额,然而,这个理由,好像在大boss那解释不通…

 - 底层服务工程师B一脸委屈:“...”。明明需求是业务方的,为什么修改代码的是我底层呢,业务代码出了问题,为什么责怪的是我底层呢,每每心中骂娘,系统中很可能就存在耦合。

 

如何解耦呢?

业务代码上浮,通用代码下沉,服务化彻底。

解决方案并不复杂,分层架构中,每一层都有自己的职责,每一层都应该守住自己的底线。

 

你在做技术方案时,碰到过这种场景吗?

“放在你那边做代码少”

“放在你那边做时间短”

作为设计折衷的理由,而要多问:

“怎么做合理”

 

业务代码上浮,通用代码下沉,服务化彻底,只是一个很小的优化点,但对于底层服务解耦却是非常的有效。

 

希望大家每天收获一点点,这样架构就能美好一点点。

你在负责底层基础服务时,遇见过

switch case(biz_type)

走不同分支的代码吗?

相关文章

《我C,一个库里几百个表,这谁受得了?》

《我去,拷贝代码,居然还有这等好处?》

《真的痛,小小的IP,大大的耦合》

《没钱就是没钱,那不是吃苦》

这篇关于明明服务化了,为啥耦合更加严重了?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/437220

相关文章

明明的随机数处理问题分析与解决方案

明明的随机数处理问题分析与解决方案 引言问题描述解决方案数据结构设计具体步骤伪代码C语言实现详细解释读取输入去重操作排序操作输出结果复杂度分析 引言 明明生成了N个1到500之间的随机整数,我们需要对这些整数进行处理,删去重复的数字,然后进行排序并输出结果。本文将详细讲解如何通过算法、数据结构以及C语言来解决这个问题。我们将会使用数组和哈希表来实现去重操作,再利用排序算法对结果

设置zookeeper开机自启动/服务化

设置启动zk的用户为zookeeper 设置启动zk的用户为zookeeper用户,而非root用户,这样比较安全。 可以使用root用户进行zookeeper的管理(启动、停止…),但对于追求卓越和安全的的人来说,采用新非root用户管理zookeeper更好。 步骤: 1. 创建用户和用户组 2. 相关目录设置用户和用户组属性 3. 采用zookeeper用户启动进程 设置z

【hdu】敌兵布阵(线段树,更加结点,区间求和)

最近开始刷线段树,主要围绕notonlysuccess的线段树总结刷。 结点修改还是比较简单的,不需要什么懒惰标记,直接二分递归就可以了。 #include <iostream>#include <cstdlib>#include <cstdio>#include <string>#include <cstring>#include <cmath>#include <vecto

黑神话:悟空》增加草地绘制距离MOD使游戏场景看起来更加广阔与自然,增强了游戏的沉浸式体验

《黑神话:悟空》增加草地绘制距离MOD为玩家提供了一种全新的视觉体验,通过扩展游戏中草地的绘制距离,增加了场景的深度和真实感。该MOD通过增加草地的绘制距离,使游戏场景看起来更加广阔与自然,增强了游戏的沉浸式体验。 增加草地绘制距离MOD安装 1、在%userprofile%AppDataLocalb1SavedConfigWindows目录下找到Engine.ini文件。 2、使用记事本编辑

人工智能时代开启ai代写模式,让创作变得更加简单!

随着人工智能技术的飞速发展,我们的生活和工作方式正在发生翻天覆地的变化。在这个信息爆炸的时代,内容创作领域也迎来了新的变革——ai代写。这一模式的出现,让文章写作变得更加简单高效,为创作者们打开了新的可能。   一、ai代写的优势   提高写作效率   在传统写作过程中,创作者需要花费大量时间和精力进行资料搜集、构思和撰写。而ai代写能够在短时间内完成这些工作,大大提高了写作效率。创

mysql中,字段类型为tinyint(1),在查询时为啥不显示正常的数字而是true或false?

背景 在查询数据的时候发现gender字段应该显示1,2,3,4等这样的数字,但是查出来却是true或false这样的boolean类型 分析 不免产生疑问,为何education字段也是存的数字,就能正确显示出数字,而gender不行,我又查看字段,发现这两个字段的类型不一样 gender字段的类型是tinyint()类型,那在不想改变字段类型的情况下,该如何能查出正确的数据呢?

file | 某文件夹【解耦合】下的文件查找功能实现及功能单元测试

文件查找工具 概要思路OS模块 --- 学习版os.getcwd()os.path.dirname(os.getcwd())os.path.dirname() 和 os.path.basename() OS模块 — 实战版单元测试解耦合 概要 梳理业务主逻辑: 查看存放被采集JSON数据的文件夹内的文件列表【所有 包含文件夹下的文件夹下的文件】 这是本节内容聚焦的点和My

数据库查出来的明明是时间返回却变成一串无规律的数字。解决方法 /** * 时间戳转时间格式 * @param jsondate 得到的number 型时间数 */ function

数据库查出来的明明是时间返回却变成一串无规律的数字。解决方法 /**  * 时间戳转时间格式  * @param  jsondate 得到的number 型时间数  */   function getLocalTime(jsondate) {  jsondate=""+jsondate+"";//因为jsonDate是number型的indexOf会报错 if (jsondate.ind

分支线定向耦合器宽带化设计和ADS仿真

分支线定向耦合器宽带化设计和ADS仿真 工程下载链接:分支线定向耦合器宽带化设计和ADS仿真-ADS工程文件 之前经常分析分支线定向耦合器,例如在15、ADS使用记录之耦合器设计和基于AWR的微带线分支线耦合器设计-从原理到版图中都有涉及,但是由于其基本电路结构中包含大量的四分之一波长线,其实际上是窄带的结构: 但是,我们经常可能需要用到宽带的分支线定向耦合器(例如在LMBA等架构中)。那

【案例67】Npart批量启动服务卡顿严重分析过程

问题现象 通过Npart启动NC服务,发现只启动一个,大概3min左右即可启动成功。但是批量启动服务需要几十分钟才可以把服务启动成功,启动卡在获取“wenjian”图标处。 绕过Npart直接写脚本并行启动相关服务,发现也需要30min+ 问题分析 查看nc-log.log发现有大量报错:获取参数FIP020失败,根据CPU个数获取最大线程数,请检查参数配置。 怀疑是JVM参