数据库解耦,代码复用?还是数据库复用,代码解耦?
这个也是我看了有些行业的有感而发
- 背景涉及微服务和中台。都是我个人观点,不代表对错
- 我们说一下20年前,那时候我觉得类似工商银行和中国移动这些的业务量远比我们现在的绝大多数非互联网公司业务体量要大吧?
- 那时候也没有微服务、没有中台更加没有Hadoop。业务也能有条不紊的进行。
- 那时候是大型机、小型机和IOE架构等。
微服务其实不一定要分库
- 但是的确如果在都在一个数据库那还做什么微服务?
- 其实有不少企业和场景不适合微服务(比如长流程的,比如to B的业务场景)
- 后来微服务让每个服务都有自己的数据库这句话带起来了分库
- 不仅仅MySQL做分库,连Oracle我看有的也分库。当然这里是为了微服务和中台去分库。而不是说去做分库分表。
有句话叫一时分库一时爽,一直分库一直爽。
- 自从分库以后带来了各种问题,但是也打开了一扇门。就是对应用程序质量直线下降。
- 原来一个数据库多少要担心自己会不会影响别人,别人会不会影响自己。
- 现在一个模块一个数据库,放飞自我了。当出现性能问题时候,先增加资源,不考虑解决问题。
- 资源无法增加,那么就继续分库。不考虑解决问题。至于反噬作用,先不考虑。
以上称之为解耦
- 数据库一拆分就是解耦了。
- 但是逻辑上来说原来在一起是有道理的,现在分开就是解除耦合了吗?有没有可能他本身就是要耦合的?
问题来了
- 很多长流程的业务,被切割成多个数据库。只要一个数据库这里有问题,影响面依然是全局(原来所有流程在一个数据库上,出问题影响面一样是全局,这里我说的是性能问题。至少我这20年数据库部署得到没发生过起不来的)
- 有不少时候这些业务流程很紧密,别说分库了,即使是两个异构数据库,但是业务上是上下游的。在一个数据库性能不行时候,整体业务依然无法完成。爆炸半径依然是全局。
- 比如一个数据库是规则,一个数据库是逻辑处理。规则无法访问,逻辑处理不下去。
- 再比如转账A用户扣款,B用户收款。按说是一个事务。但是也有为了架构而架构,把这种拆成异步处理。结果比起原来,现在慢了不少,还因为消息队列可能堵塞而迟迟数据送不过去。还有可能出现数据不一致情况。
- 本来现在绝大多数企业能上TB级别的数据也不多,核心数据还是GB级别的。好好写SQL都可以应对一般业务的OLAP。
- 但是分库导致,数据无法汇聚。这时候Hadoop全家桶到了。HDFS、Zookeeper、Hive、HBase、impala、kafka、spark等等数不清的技术栈往上堆。最后可能因为时间戳的问题,数据对不上。不是多了就是少了。为了这种事情几个部门来回拉扯能有2天到一个月的内耗。每次OLAP数据库变更,还要着急多个部门告知这次变了什么。有些数据可能还要全量重来。然后数据要重新算(等多久不知道,可能第二天还不见得算的好,更别说算的准了)
- 数据库是分了,但是如果每个数据库和其他不交互,那么就是孤岛了。交互需要通过接口,然而这个效率比本地交互差很多。select from a where a.xx in (select from B where b.yy=) 一个数据库时,关联在1ms以内。
select from a where a.xx in 调用接口/服务 多个数据库时,走网络接口关联,可能1秒以上甚至更多,还可能级联调用。性能下降1000-10000倍。 - 最奇妙的我见过有的。原本一个数据库。由于性能原因不解决,分库。分库以后需要,调用一次,就把调用的结果自己这里再存一次。多存了一份,两边数据还不一致了。
- 为了缓解(只是缓解不能解决),又来了消息队列,甚至防止消息队列漏数据或者重复(这都是基本问题没解决带来的),数据库中再记录一些log(二进制记录消息体)。结果数据库又膨胀了。
成本,成本还是成本
- 现在降薪裁员了,这么多数据库、中间件怎么办?
- 要么合并,要么关停。有时候数据库一合并发现,接口不用做了,消息队列不用了。数据一致性有了,性能提高了。
再说说代码
- 一个表可能有几十个字段到几百个字段不等。如果作为一个底层核心公共方法,应该把最核心最共用的提供给别人。然后这才是复用。
- 但是我见到各行各业也是这样select * (这包含的最多有400多个字段)作为一个公共的。也许别人就要5个字段,但是他提供了400个字段。最后送到家门口,只取5个。而这时候你说巧不巧。如果说遇到问题,要解耦,你会发现根本解不开。最底层的是包罗万象的。一动影响全局。这就是典型的双标。
- 在企业管理中,去申请权限一般来说,给一个最小的,然后逐步放开。而select * 这种提供最大化模板,等于上来就给了最高的。无法分解了。
- 说到这里又不得不抨击一下大数据(Hadoop)。我帮别人看一个问题。发现打开一个页面,这个页面运行了100个报表,这是一个公共组件。而使用者甲,可能只需要第2和第三个,使用者乙可能只要第一个。但是这个公共组件做的大而全,无法解耦。上来先运算100个。最后99%都是无用功。
小结
- 个人观点:代码应该解耦,数据库不应该。因为有时候用着用着数据就要发生联系了。很多时候数据库层面可能解不开,因为本身就是需要紧耦合的,这是由业务造成的。强行解开,后面还要强行汇聚。代价是十分大的,大到可能你觉得你的工作就是在浪费生命。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
为什么中国的软件行业不赚钱?
大家都知道中国的软件行业不赚钱,但中国的软件行业到底有多不赚钱,估计大家都不太清楚。 让我们来看看2024年中国已上市软件公司的财报情况。注:本文图表中的数据均源于上海证券交易所(https://www.sse.com.cn/assortment/stock/areatrade/trade/)。 下图是统计的国内131家上市软件公司的经营情况。 在这131家公司中,有56家公司归母净利润是负值。可以看出,近半的公司处于亏损状态。 从图中可以看出,正利润区间在10亿以上公司数量极少,而负利润区间在-10亿到-30亿的还有一定数量的公司,直观显示亏损普遍且亏损数额较大。 可以见得,2024年,软件行业中头部企业的盈利能力被尾部企业巨亏对冲,行业整体利润较少。 今年上半年已上市软件公司的经营情况也不容乐观: 看完这些数字,大家肯定会问,为什么中国的软件行业不赚钱?关于这个话题已经有很多文章讨论分析过。今天我来说说我的观点。我认为,中国软件行业不赚钱的根本原因是在一个非标准化的市场里面做非标准化的事情,这就决定了中国的软件行业很难赚到钱。 先来聊聊为什么说软件开发是非标准化的。 肯定有朋友会问...
- 下一篇
AI在实际生成环境中的提效实践
导读 随着AI时代的到来,各类AI工具层出不穷,业界都在探索一套完整的AI加成的提效方案,我们团队基于自身特色,利用起团队沉淀好的历史知识库,落地了一套深度结合AI的工作流,用AI武装研发团队,实现研发效率的提升。 背景 各类AI研发工具层出不穷,很多现成工具可使用,业界都在探索一套完整的AI加成的提效方案 团队内部规范文档完备,但是没有融入开发流程中 Code review、研发自测、接口文档更新消耗大量时间 目标 1. 拥抱AI时代,让团队更先进。 2. 用AI武装研发团队,通过资源的配合与协调,实现研发效率的提升。 思路 1. 拆分研发流程,并找到AI结合点,并将其串联起来。 2. 深度探索AI IDE,得出最佳实践。 3. 利用起团队的知识库,为AI提供辅助能力。 定位 1. 这是一个锚点,自此开始团队研发流程向AI化转变。 2. 这是一个开始,带动团队与其他同学review当前研发流程,共建更多研发工作流。 01 研发链路 对研发链路进行拆解,得到不同阶段的AI工作流形态,并基于当前形态向下一形态进行推进。 当前我们团队正处于阶段1接近完成,阶段2正在开始探索实践的阶段,因此...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS关闭SELinux安全模块
- Linux系统CentOS6、CentOS7手动修改IP地址
- 2048小游戏-低调大师作品
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池