23 重构:烟囱式、平台化、中台化的架构

news2025/1/12 16:11:09

上一讲里,我们介绍了两大类型的系统升级重构方案,还介绍了如何进行重构版本的上线,以及如何平滑地完成新老版本切换的方案。在本讲里,将会具体介绍如何判断系统发展到什么阶段需要重构,以及如何实施重构。

系统稳定性的重构升级

简单、通用的微服务架构如下图 1 所示,它包含一个应用服务和一个数据库作为存储。

图 1:简单、通用的微服务架构图

当上图中展示的架构出现如下一些问题时,可以采用上一讲中提到的“微服务中纯代码维度的升级重构”。

  • 代码日志打印冗余,且因为直接使用大对象进行 JSON 序列化的方式打印日志,进而导致常常出现 CPU 飙升。

  • 代码中未增加监控报警,导致用户先感知线上问题,研发再进行修复。

  • 代码可维护性低,开发需求耗时长,且开发时代码“牵一发而动全身”,产生的 Bug 较多。具体的一些表现是:

(1)一个类中有上千或者上万行代码;

(2)一个类中的某一个方法有上百或者上千行代码;

(3)代码中没有注释;

(4)为了防止影响历史业务,新需求开发均需将原有部分能复用的代码拷贝后,才能修改。

此时,可以将出现上述问题的微服务进行代码重构。具体来说,可以采用 23 种设计模式、SOLID 原则将包含上千上万行代码的类进行重构。此时,重构后的微服务的上线即可对应上一讲里提到的“第一种重构类型:纯代码重构”。它的架构如下图 2 所示:

图 2:纯代码升级重构

完成纯代码的重构后,在日常维护中,当你发现有以下问题时,可以考虑进行包含存储的重构。

  • 随着业务的发展,微服务的流量由每秒几百的 QPS 上升至上千或上万的 QPS 时,可以将微服务的存储从数据库升级为缓存,以便有效应用业务增长带来的流量。

  • 业务或者运营需要对数据库中的四五张表进行聚合(join)分页查询,而数据库面对这些繁杂查询性能会变得非常差。此时可以将微服务的存储从数据库升级为 ElasticSearch,进而满足多维度的富查询。

上述这两类便为包含存储的重构升级,第一个是从数据库升级到缓存,第二个是从数据库升级到 ElasticSearch。它们的架构如下图 3 所示:

图 3:包含存储的架构升级

烟囱式到平台化的重构升级

完成上述两种重构之后,接下来就需要思考什么时候进行另一种存储类型均为数据库存储,但表结构不同的重构了。

在介绍具体实施步骤前,咱们先来聊聊:什么是烟囱式架构。

这里以即时通信作为讨论案例。在 PC 时代,QQ 在即时通信市场的占有率是绝对领先者,相信你也使用过。从技术的抽象层面来看,QQ 主要提供消息发送和消息接收的功能,消息可以是图片、表情、文字、视频、语音等内容。支撑 QQ 消息发送和接收的简版架构如下图 4 所示:

图 4:简版的消息发送和接收架构图

  • 图中编号 1 的模块为安装在电脑里的 QQ 客户端,它主要给用户提供可视化的聊天界面,以及发送和接收其他用户的消息。

  • 编号为 2 的模块为网络接入层,它主要的作用是维护和客户端的网络连接,负责解析客户端发送到服务端的消息和推送其他用户发送的消息给到指定的客户端。在接收和发送消息时,接入层需基于 QQ 自有的数据协议进行消息内容的解码和编码。

  • 编号为 3 的是数据接收模块,它对外提供保存消息的 RPC 接口,并由编号 2 的网络接入层在接收到客户端消息的时候调用。接收模块接收到消息后,会将消息保存至存储中并通知编号 4 的消息发送模块。

  • 编号为 4 的是消息发送模块,它接收到通知后,会读取存储中的待发送消息并进行一定的逻辑处理,然后调用网络接入层进行消息的发送。

关于即时通信后续的发展,你应该就有亲身感受了。为了抓住移动互联网的发展浪潮,腾讯又推出了即时通信的王者级应用:微信。从产品上看,微信和 QQ 在定位、应用界面设计、附加功能设计等方面存在差异。但抽象地从技术和核心功能上分析,两者的功能均是给用户提供消息发送和消息接收。因此,在技术实现上,微信研发团队也需要建设和上述图 4 类似的提供消息发送和接收的技术架构,如下图 5 所示:

图 5:简版的微信消息发送和接收的架构图

从图 5 中不难发现,除了编号 1 的微信 App 和编号 2 的网络接入层模块与图 4 有差异,其余各模块的功能基本上与图 4 类似。网络接入层之所以有差异,是因为接入层需要进行通信协议的解析,而 QQ 和微信的网络通信协议是根据各自的客户端进行定制的,因此会有格式上的差异。

除了微信外,现在大部分在线游戏也都提供了即时通信的能力。因此,游戏团队也需要按上述类似的架构实现自己的消息发送和接收业务系统。

类似上述介绍的这种模式:即系统架构大体上类似,其中只有个别模块存在差异,但各个研发团队还是从零开始建设全部模块的方式,称为烟囱式架构。为了方便你理解,我把QQ、微信以及游戏语音的架构放在一张图中,如下图 6 所示:

图 6:即时通信的烟囱式架构示意图

从上图可以看出,烟囱式架构是一种象形比喻,各个业务研发团队(如 QQ、微信、游戏语音团队)维护了一个类似烟囱式的、包含重复模块的系统架构。除了即时通信这个案例,还有很多其他会产生烟囱式架构的场景,比如电商,电商除了 PC、App、M 页面版本,现在还有很多购物场景,比如自动贩卖机、微信里的分享链接、小程序等。在实现上,如果他们的研发团队是封闭地进行自研,那么也会产生如下图 7 所示的电商版烟囱式架构。

图 7:电商版烟囱式架构示意图

经过前面的分析,烟囱式架构存在的问题其实已经比较明显了,即存在大量的模块重复,进而导致人力重复、成本增加。此时,为了解决这个问题,便可以启动本小节开头提到的升级重构:均为数据库存储,但表结构不同的重构了。

以上述消息接收模块为例,它包含了一个代码进程和对应的消息存储(假设为 MySQL)。为了解决此模块的重复,可以合并 QQ、微信和游戏语音里此模块的代码。同时在前期设计时,各个业务只考虑自己的消息格式,所以它们的数据库的表结构是偏定制的,无法直接被复用,因此在重构时,还需要设计一套全新的、兼容原有三个版本的数据库。此时消息接收模块的重构架构如下图 8 所示:

图 8:消息接收模块融合架构图(三个模块+数据库合并成一个)

完成上述模块的重构融合升级之后,消息发送模块也可以进行类似的融合重构。当所有的可复用模块均完成升级重构后,上述三个不同的即时通信软件的架构演化成如下图 9 的形态:

图 9:融合的系统架构

融合后,三款软件有差异的系统模块依然各自维护,但消息接收和发送模块已经融合为一套。此时,从多个模块融合形成的、支持不同类型使用方的模块,称为平台化模块。而这个重构过程,有一个高大上的名称:从烟囱式架构朝着平台化演化。

平台化到中台化的重构升级

升级重构完成平台化之后,后续三款软件涉及消息接收和发送的新需求,都由平台化模块直接支持。这种需求支撑的模式,看起来十分像这几年兴起的中台化架构,但其实并不是。下面我们具体分析一下,你可以从以下两点来理解。

  • 平台化架构的概念要早于中台化架构。平台化只是将重复模块进行融合,如在平台化之后,未做任何中台化的改造,便不能直接称为中台化模块。

  • 平台化是从降低技术重复的角度出发,从而提升效率,而中台化是在平台化之后,从业务复用的角度出发,进一步提升业务需求的效率。

下面,继续以上一小节的案例作为讨论对象。完成平台化,消灭重复技术之后,如果你遇到以下几种情况,则需要进一步重构,以便完成从平台化到中台化的演化。

  • 融合后的模块代码量庞大、代码中业务逻辑分散。表现就是需求承接时,需要一周时间进行评审,而开发只要一到两天时间,沟通成本巨大。

  • 当出现上述三个之外的新业务场景,融合的平台无法直接支持,而需要大量改造时。

  • 假设 QQ 的某一个需求在平台上开发上线后,微信也提出同样类似的需求,但平台无法直接复用 QQ 的需求,而需要重新开发时。

从平台化到中台化演化升级,可以从业务能力可视化、业务能力在线配置化的方法进行落地改造。

业务能力可视化

仍以上述的数据接收模块为例,可以在平台化之后,将数据接收模块对外的接口流程进行梳理并可视化地展现出来。格式为如下图 10 所示:

图 10:接收数据的接口的可视化展示

流程:数据合法性校验 → 图片压缩 → 图片尺寸裁剪 → 图片转存到 CDN → 语音自动识别成文字 → 保存。

上述这个流程图,大多数情况是在需求提出时由产品经理进行绘制,而在代码上线后便不会再实时更新。而中台化之后,需要开发建设一套业务可视化平台,将业务平台中的代码流程可视化地登记到可视化系统中,同时要保证可视化平台能够在业务代码修改后,实时更新相对应的流程。在实现上,编写业务代码时,可以增加一些代码标记,供可视化平台进行自动化扫描,进而识别业务流程,最终更新到可视化平台的显示界面上。

通过将业务能力可视化之后,前面提到的因为平台化融合了太多代码,导致代码量多、业务无法直接从代码中抽取的问题便解决了。因为可视化之后,业务逻辑可以直接在可视化平台上展现出来,业务方和产品经理不需要和研发来回沟通上周的时间来确认需求,可以极大地降低沟通时间,提升效率。

业务能力配置化

在上述图 10 的流程中,可以看到有些是实心的圆圈,有些是空心的圆圈。空心表示代码执行到此流程节点时会直接跳过,而实心表示会执行此流程节点。流程节点是为空心还是实心,是可配置的,此配置功能可以落地在上述介绍的可视化平台里。

上图 10 的可视化、可配置化流程只有一份,但假设微信在保存消息数据时,不希望图片被压缩而用原图保存;而 QQ 在保存消息数据时,不希望图片尺寸被裁剪。此时,如何通过配置化解决这样的需求呢?答案便是:基于业务身份进行业务流程的配置化。

业务身份是指给 QQ、微信及游戏语音等每一个复用中台能力的应用,都分配一个全局唯一的名称。在进行配置的时候,按业务身份进行隔离,每一个业务身份都拥有属于自己的上述流程的配置,如下图 11 所示:

图 11:按业务身份隔离的私有化流程配置图

在执行时,各个即时通信应用在调用保存消息接口时,需传入自己的业务身份标识。对应的中台模块会根据业务身份获取相对应的配置,并按配置去编排属于此业务身份的流程。

再回顾一下本小节开头提出的平台化架构会遇到的问题。

再来一个新的聊天应用时,无法快速、直接复用已有能力。采用配置化后,可以给新的聊天应用配置一个业务身份,同时基于此应用的需求,去配置它需要使用的业务节点。

QQ 先提出的某一个业务需求并开发上线后,后续微信也想要此功能,但无法快速直接复用。在完成上述业务功能可视化、配置化的基础上,当 QQ 先提出的需求上线后,可视化的工具会将此新功能直接更新到上述流程节点里。只是在 QQ 对应的业务身份的配置里,此新加入的节点为实心。而其他不使用此新功能的业务身份里,此节点为空心。当后续微信需要使用此新功能时,直接将此节点勾选为实心,便可直接复用。

至此,从平台化到中台化的重构升级便具备基本雏形。当前中台化的建设理论还处于初期,有很多种探索的实现方式,但万变不离其宗,它的核心仍然是:在面对不断出现的新的业务场景和形态时(如电商里新出现的社区购等),中台需要快速地复用已有能力,去满足业务新建站点或不断扩宽业务边界的诉求。

本节总结

罗马不是一日建成的,系统建设也是一样,它是随着业务的发展不断演化而来的。当业务体量较小且没有类似像 QQ 和微信的多个前台应用时,没有必要在建设初期就采用平台化或中台化的建设方案。因为它们的建设人力成本和消耗的机器资源也更高。

一个系统在建设时,假如预期未来的三到五年的用户量并不会增长太大,可以先采用烟囱式的架构,快速地满足业务需求。当发展到一定体量后,再发起从烟囱式到平台化及中台化演化即可。毕竟能够发展到百万、千万用户体量的系统是少数,所有的系统都提前建设会存在较大可能的成本浪费。

最后,我再给你留一个讨论话题:当前你所负责的系统处在什么样的阶段,是烟囱式、平台化或中台化的架构吗?它存在什么样的问题,你觉得是否有必要准备启动升级计划了。欢迎你在留言区说出你的想法,我们一起讨论。

这一讲就到这里,感谢你学习本次课程,下一讲是本专栏的最后一篇内容,我想和你聊聊关于程序员发展的话题:抓住本质,是成为技术专家的不二法则。

最后,我邀请你为本专栏课程进行结课评价,因为你的每一个观点都是我和拉勾教育最关注的点。点击链接,既可参与课程评价。编辑会随机抽 5 位同学送精美礼品喔。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1635605.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新版本Qt Creator安装配置

新版本Qt Creator安装配置 文章目录 新版本Qt Creator安装配置1、前言2、环境3、安装配置4、总结 更多精彩内容👉个人内容分类汇总 👈👉Qt开发经验 👈 1、前言 Qt是一个跨平台的C应用程序开发框架,而Qt Creator是专为Q…

LLM大语言模型原理、发展历程、训练方法、应用场景和未来趋势

LLM,全称Large Language Model,即大型语言模型。LLM是一种强大的人工智能算法,它通过训练大量文本数据,学习语言的语法、语义和上下文信息,从而能够对自然语言文本进行建模。这种模型在自然语言处理(NLP&am…

Arthas进阶

这里写自定义目录标题 六、class和classloader6、dump7、classloader 七、monitor/watch/trace/stack等核心命令的使用1、monitor2、watch3、trace4、stack5、tt6、option7、profiler 六、class和classloader 6、dump 将已加载类的字节码文件保存到特定目录:logs/…

49. 字母异位词分组 128. 最长连续序列

49. 字母异位词分组 128. 最长连续序列 把集合里面的所有元素都放入set容器里面 定义结果最大连续数量 ans for循环遍历每个元素 先判断集合里面有没有比这个元素小1的 如果没有 说明这个元素就是序列的第一个元素 然后接着找集合里面有没有比这个元素大1的 while一直找 …

CentOS安装htop工具

启用 EPEL Repository 安装Htop 首先启用 EPEL Repository: yum -y install epel-release启用 EPEL Repository 后, 可以用 yum 直接安裝 Htop: 安装htop yum -y install htop安装成功 输入htop使用工具 htop安装glances工具 yum install glances

pyqt字体选择器

pyqt字体选择器 pyqt字体选择器效果代码 pyqt字体选择器 pyqt中QFontDialog 类是一个预定义的对话框,允许用户选择一个字体并设置其样式、大小等属性。 效果 代码 from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QPushButton, QFontD…

python项目入门新手攻略

最近工作需要接手了代码量比较大的python开发的项目,平时写python不多,记录一下如何熟悉项目。 分析调用流程-pycallgraph 因为代码量比较大,所以希望通过工具生成代码调用流程,因此用到了pycallgraph。 pycallgraph&#xff0…

LiveGBS user/save 逻辑缺陷漏洞复现(CNVD-2023-72138)

0x01 产品简介 LiveGBS是安徽青柿信息科技有限公司研发的一款国标(GB28181)流媒体服务软件,可提供提供用户管理及Web可视化页面管理,开源的前端页面源码;提供设备状态管理,可实时查看设备是否掉线等信息等。 0x02 漏洞概述 LiveGBS user/save 接口处存在逻辑缺陷漏洞,未…

纯血鸿蒙APP实战开发——发布图片评论

介绍 本示例将通过发布图片评论场景,介绍如何使用startAbilityForResult接口拉起相机拍照,并获取相机返回的数据。 效果图预览 使用说明 通过startAbilityForResult接口拉起相机,拍照后获取图片地址。 实现思路 创建CommentData类&#…

树,二叉树的基本概念介绍,二叉树的性质

目录 树 树的定义 树的相关概念 树的存储结构 树在实际中的运用(表示文件系统的目录树结构 ) 二叉树 二叉树的定义 现实中的二叉树 二叉树的特点 特殊的二叉树 1.斜树 2.满二叉树 3.完全二叉树 二叉树的性质 性质1:二叉树的第…

MyBatis(XML映射器操作)

文章目录 XML映射器操作(XxxMapper.xml)文件目录1.基本介绍1.优点2.常用顶级元素 2.环境配置1.在原来的父模块下创建一个子模块2.删除没用的两个文件夹3.创建基本目录4.父模块的pom.xml5.jdbc.properties6.mybatis-config.xml7.测试使用MonsterMapperTes…

芒果超媒财报解读:科技加持下,如何蜕变为内容“全科生”?

在降本增效和内容为王的基调下,国内头部长视频平台正在拥抱增长。 爱奇艺率先公布2023年财务数据,实现归母净利润19.25亿元,与2022年亏损1.36亿元相比,扭亏为盈且增幅显著。 而近日,随着新一季《浪姐》播出&#xff…

一文全面了解 Kaggle 平台:数据科学和机器学习的理想之地

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 在数据科学(Data Science)领域,Kaggle 可以称得上是一座人人都想挑战的高峰。Kaggle 是一个国际知名的数据科学竞赛平台,由 Anthony Goldbloom 和 Ben Ha…

内网神器Cobalt Strike隐藏特征与流量混淆.

由于上次还没有写好https上线的东西,今天加班加点的弄出来了。 本文内容如有错误,望及时告知,以免误导他人. Cobalt Strike 特征隐藏与流量混淆 大致内容: 修改默认端口 服务器设置禁Ping Cobalt Strike默认证书修改 CDN隐藏…

【c++】mutable是一个关键字,用于指定一个类成员可以在一个const成员函数中被修改。

mutable是一个关键字,用于指定一个类成员可以在一个const成员函数中被修改。通常,当一个成员函数被声明为const时,这意味着这个函数不能修改它所属的对象。然而,有时候你可能需要在一个const成员函数中修改某个成员变量。这时,你就可以使用mutable关键字。webrtc的StunReq…

VOS系统录音文件REC转MP3,REC录音转WAV与WAV转MP3具体项目中实现方式,以及占用空间变化!

前面讲解了VOS3000系统的录音REC转MP3的安装步骤,不清楚的,可以移步这里查看:http://t.csdnimg.cn/OXNT9 或者 点击这里查看安装步骤,下面继续讲下他们的使用方法,以及实际项目中的运用,首先我们需要明确我…

记录一下因网络问题导致的安装Python3.8和SuperSet的报错

【报错1】Python3.8的环境报错 【背景说明】 我目前在搭建数仓最后一个环境-->将MySQL的数据用SuperSet展示,安装SuperSet需要提前在Linux上安装Python环境,下面截图就是我在创建Python3.8的环境报错 命令为:(base) [dahuahadoop102 ~]…

shell脚本,删除30天以前的日志,并将日志推送到nas,但运行出现/bin/bash^M。

删除30天以前的日志 将日志推送到nas中,然后删除pod中的日志 pod挂载到本地 运行出现/bin/bash^M 1、删除30天以前的日志: #! /bin/bash# 定义源日志目录 LOG_DIR/home/log/ # 删除日志 find $LOG_DIR -type f -name "*.log" -mtime 30 -exec…

沐风老师3DMAX一键生成桌子插件TableMaker使用方法

3DMAX一键生成桌子插件TableMaker使用教程 3DMAX一键生成桌子插件TableMaker,参数化方式快速创建各种样式桌子模型。 【适用版本】 3dMax2011-2025(不仅限于此范围) 【安装方法】 3DMAX一键生成桌子插件无需安装,使用时直接拖动…

期权交割对股市是好是坏?2024期权交割日一览表

期权交割是指期权买方在期权合约到期日或之前行使期权,卖方履行义务,按照约定的价格和数量与期权卖方进行标的物的买卖或现金结算的过程。 交割方式 期权交割可以分为实物交割和现金交割,具体取决于合约规定。 实物交割 实物交割是指期权买…