系统架构合理性的思考 | 京东云技术团队

news2024/9/28 1:25:17

最近牵头在梳理部门的系统架构合理性,开始工作之前,我首先想到的是如何定义架构合理性?

从研发的角度来看如果系统上下文清晰、应用架构设计简单、应用拆分合理应该称之为架构合理。

基于以上的定义可以从以下三个方面来梳理评估:

1、系统的上下文清晰:明确的知道和周围系统的调用关系,数据同步机制;

2、应用架构设计简单:架构分层合理,功能定位清晰,不会出现功能边界之外事情;

3、应用拆分合理:系统内的应用粒度在一个合理的范围内;应用间调用链路不应过长。

系统的上下文清晰

系统上下文图一词最早是从Simon Brown的C4模型中借用而来的,该模型”通过在不同的抽象层次重新定义方框和虚线来抽象表达架构的含义“。

C4模型把系统分为四层,每层都代表着不同的视图架构,关注点不同。第一层,讲的系统上下文,系统高层次的抽象。

如下图显示个人银行账号在浏览账户过程中发生不同的系统之间交互。 如果把Internet Banking Sysytem 当成我们的目标系统,那么E-mail System、MarinFrame Banking Sytem 就是它的伴生系统,也可以称为外部系统,它给Internet Banking Sysytem 提供系统价值,属于系统外,是黑盒。

系统上下文明确了目标系统和外部系统的关系,它和外部系统一起给目标用户提供价值。绘制系统上下文的时候,需要注意目标系统和外部系统之间的依赖方向。北向依赖意味着外部系统调用目标系统的服务,需要考虑目标系统定义了什么样的服务契约;南向依赖意味着目标系统调用了外部系统的的服务,需要了解外部系统的接口、调用方式,通信机制,甚至当外部系统出现故障时,目标系统该如何处理。

除了参考以上的画法,也可以用业务序列图表示。它脱胎与UML的序列图。序列图可以从左侧的角色开始,体现消息传递的次序。这隐含这一种驱动力:我们从左侧的参与对象开始,寻找与之协作的执行步骤,然后层层传进地推导出整个完整的协作流程。

企业序列图,代表了企业级系统的抽象,目标系统和外部系统之间的协作关系,参与的系统是一个完整的整体,所以不需要也不应该参与系统的内部实现的细节,消息的方向更多的代表系统的责任。业务序列图如下所示:

应用架构设计简单

应用本身是有架构分层的,Martin Fowler 在《企业应用架构模式》 提出合理的系统分层应该包括表现层,领域逻辑层,数据源层。 表现层主要提供服务,处理用户请求。领域层是处理逻辑,是系统的核心。数据源层与数据层、消息系统,与其他软件包通信。

后续发展的领域驱动架构设计,演变成四层,在表现层下加入了应用层,同时把数据源层改为基础设施层,突破了数据库管理系统的限制。

基于以上的系统分层,无论你是采用的三层架构还是四层架构,应用代表着功能边界,提供那些核心的能力,能做那些事情,那些事情不能做。

一个好的实践经验是参考领域驱动设计的业务域的方法论,梳理好系统的一二三级域,最多不超过四级,做好各级域的定义。好的域的定义代表着系统能力的边界,让你明白那些事情能做,那些事情不能做。

基于以上梳理好的系统业务域的定义和能力边界,我们在梳理的时候通常会两类系统,第一类是现有存量的系统且需求迭代相对频繁的系统,这类系统关键是要梳理出有哪些核心的能力,是否在上述系统的域的定义范围内的,是否其他系统有类似的能力,如果有的话,需要考虑合并。另外还需要考虑核心能力公开化、文档化,至少让部门内知道,有地可查,避免系统的重复造轮子。

遇到第二类系统是存量系统且没有需求迭代,业务上基本没有调用量的。这类系统需要和业务沟通是否有下线计划,是否有类似的系统可以替代,给业务决策提供技术参考。

应用拆分合理

需求开发中,一个项目或者需求的实现可能需要多个目标系统协同来实现,这涉及到目标系统的拆分的粒度,系统拆分成应用的粒度没有统一标准,但是要在相对合理范围内,可以参考的因素包括业务规划,系统调用量级,基于业务规划的架构设计,部门内的人数及分工。过多过少都是不好的。

如果一个新业务短期内看不到大的发展,在初步规划应用的时候,可以先粗粒度拆分,部门内人数平均不能应该超过2-3个应用,再多必然面临着一个需求实现的时候不同系统的切换成本。如果后续业务发展起来,部门内人数增多,因为分工更精细,可以考虑更细粒度的拆分,系统拆分必然会带来另一个问题,系统之间该如何的协同以及系统的调用链路的长度。

基于以上讲的系统分层的概念,部门内系统可以分为两类,一类系统是业务网关,一类是通用的业务能力。业务网关面向用户,用来协同应用的活动,不包含业务逻辑,不保留业务对象的状态,相当于领域驱动设计应用层+表现层,有人称作它为业务SOA,或者BFF层。

通用业务能力相当于领域逻辑层+基础设施层,作为软件的核心所在,保留了业务对象的状态,对业务对象的持久化被委托给基础设施层,基础设施层作为其他层的支撑层,实现了和其他系统的通信,实现业务对象的持久化。

在以上两类系统中,业务网关是依赖通用业务能力层,业务网关是北向依赖,通用业务能力层是南向依赖。 在一个功能的实现不建议链路长度不超过2。同时也要注意到系统之间相互依赖的情况,要重视,此点是系统稳定性的风险点。

成本量化:

基于以上三方面分析,梳理出的交付物:1、系统的上下文依赖;2、 系统的业务域定义及能力规划地图。3、应用调用链路的长度及相互的依赖关系;4、应用拆分粒度合理性的评估;5、系统中能力的下沉或者合并;6、业务量少的系统列表。

其中1-4,可以看作系统的行动指南或者原则,5-6是下一步的行动,更简单的说是我们常做的系统的关停并转。在业务部门系统关停并转还需要考虑到成本问题,做好成本的量化。

首先需要评估关停并转的付出的成本,其次要评估系统日常维护1-3年的成本包括人力成本和机器资源的成本,前者和后者的三年累计值相减,如果大于零,系统建议暂时不动,如果少于零,可以考虑关停并转的计划。

以上是我从研发角度系统架构合理性的思考。

架构合理性如果从业务角度来评估,可能就变成以下三个方面:一是能解决当下业务需求和问题。2、高效完成业务需求: 能以优雅且可复用的方式解决当下所有业务问题。3、前瞻性设计: 能在未来一段时间都能以第2种方式满足业务,从而不会每次当业务进行演变时,导致架构翻天覆地的变化。

视角的不同必然代表着大家对同一件事情的看法不同。

作者:京东零售 高田林

来源:京东云开发社区 转载请注明来源

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

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

相关文章

标签准备——labelIMG工具使用

当我们已经准备了大量用于图片标注所需的图片后,便需要使用labelIMG工具进行打标签的操作了。 1、标签规划 在我们开始打标签之前,首先需要注意的是,打标签是我们开展训练、识别工作的基础,我们需要准确最好标签的规划,明确都有哪些标签,并在venv/Lib/site-packages/la…

怎么压缩视频?一分钟学会视频压缩技巧

现在拍摄的视频文件体积都比较大,如果再加上后期的剪辑处理,动不动就是几个GB起步,这样一来不仅占用空间,还不方便传输,今天就围绕这个问题给大家分享几个压缩视频的方法,需要的朋友可以参考下。 方法一&am…

如何拥有观影氛围感?极米投影仪H6为你打造美好之夜

当前人们对于家庭舒适度的要求越来越高,“仪式感”也被越来越多的人关注起来,对于喜欢看电影的年轻人来说,在家里的观影氛围感当然也不能少。今天,笔者就为大家带来了一款打造观影氛围感好物极米H6。 作为极米H系列首款4K分辨率的…

Docker基本操作命令(一)

Docker基本操作命令 1、搜索镜像 docker search命令搜索存放在 Docker Hub中的镜像,此命令默认Docker会在Docker Hub中搜索镜像,可以配置了其他镜像仓库 [rootzch01 ~]# docker search centos NAME:镜像仓库名称DESCRIPTION:镜像仓库描述STARS:镜像仓…

探索聊天型AI进阶:从ChatGPT到提示工程入门

💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 导言 近年来&#xff0…

滑动验证组件---设置movable-view组件的x属性在微信小程序端失效的问题

场景 采用uniapp的movable-view组件实现滑动验证组件。 流程 滑块未滑到最右端时,回弹到原点滑块滑到最右端时,则显示滑动结束,不可再滑动 问题 频繁设置uniapp的movable-view组件的x属性,在H5端正常,但在微信小程…

实时操作系统与非实时操作系统

一、实时操作系统 实时操作系统(RTOS)是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统做出快速响应,调度一切可利用的资源完成实时任务&am…

win10 版本21H2 + vs2022 + Windows 11 版本 22H2 WDK

打开VS,工具–>获取工具和功能–>单个组件。在里面搜索SDK Windows 11 SDK(10.0.22621.0) Windows 11 版本 21H2 WDK 不支持 Visual Studio 2022。 若要使用 Visual Studio 2022 开发和测试驱动程序,请下载 Windows 11 版本 22H2 WDK。 #include…

自定义目录高亮的锚点计算位移

如果可以实现记得给个星星,谢谢老铁~ 一、问题的描述 一个支持目录树形结构,自定义目录高亮的锚点计算位移,且支持选中该目录后锚点对应的内容。这里只提供左边的组件思路,右边展示对应的内容最好自己自定义组件控制更为灵活&am…

MyBatis(一)执行流程概述

目录 一、简介二、MyBatis执行流程1.读取核心配置文件 mybatis-config.xml2.构建会话工厂 SqlSessionFactory3.创建会话 SqlSession4.Executor 执行器5.MappedStatement 对象6.输入参数处理(map,list,String,Integer,pojo)7.操作数据库8.输出结果处理&am…

[C语言]分支语句和循环语句

[C语言]分支语句和循环语句 文章目录 [C语言]分支语句和循环语句C语言语句分类分支语句if语法结构else的匹配规则switch语句switch语句中的breakswitch语句中default 循环语句while循环while循环中的break和continuefor循环for循环中的break和continuefor循环的变种do while循环…

ARM汇编【1】:数据类型

与高级语言类似,ARM支持对不同数据类型的操作。我们可以加载或存储的数据类型可以是有符号和无符号字、半字或字节。这些数据类型的扩展名是:-h或-sh表示半字,-b或-sb表示字节,不表示字的扩展名。有符号数据类型或无符号数据类型之…

二重积分小技巧---交换积分

又一个奇技淫巧。 【例1】 ∫ 0 1 d y ∫ y 1 x 3 1 d x ? \int _0 ^1 dy \int _{\sqrt y} ^ 1 \sqrt{x^3 1} dx ? ∫01​dy∫y ​1​x31 ​dx? 解析: 不说话,看下图: ∫ 0 1 d y ∫ y 1 x 3 1 d x ∫ 0 1 d x ∫ 0 x 2 x 3 1 d…

照亮虚拟网络流量“盲区”:超融合网络流量可视化功能解读

云计算时代下,网络虚拟化使网络管理更加集中、灵活和便捷,但同时也让云内的网络变得更加复杂。传统网络流量诊断方法和工具,难以对云内虚拟网络的“东-西向流量”进行可视化呈现和分析,形成了网络运维管理的盲区,提升了…

Shopify独立站也会被封店?告诉你这背后深藏的玄机!

很多人觉得做独立站就完全自由了,不被平台监管,也不会被封店。但事实真的是这样吗?其实独立站只是相对自由,受到的监管相对较少,封店的风险较小,但并不是完全高枕无忧。想知道什么情况下会被封店&#xff1…

无涯教程-PHP - 全局变量函数

全局变量 与局部变量相反,可以在程序的任何部分访问全局变量。通过将关键字 GLOBAL 放置在应被识别为全局变量的前面,可以很方便地实现这一目标。 <?php$somevar15;function addit() {GLOBAL $somevar;$somevar;print "Somevar is $somevar";}addit(); ?> …

MyBatis快速入门以及环境搭建和CRUD的实现

目录 前言 一、MyBatis简介 1.MyBatis是什么 2.MyBatis的特点 3.mybatis的作用 4.MyBatis的应用场景 5.MyBatis优缺点 二、相关概念 1.ORM概述 2.常见的ORM框架 3.什么是持久层框架 三、MyBatis的工作原理 1.框架交互 2.工作原理 ​编辑 四、MyBatis环境搭建 1…

SQL - 开窗(窗口)函数

什么是开窗函数&#xff1f; 开窗函数对一组值进行操作&#xff0c;它不像普通聚合函数那样需要使用GROUP BY子句对数据进行分组&#xff0c;能够在同一行中同时返回基础行的列和聚合列 开窗函数的语法形式为&#xff1a;函数 over(partition by <分组用列> order by …

Vue2到3 Day7 全套学习内容,众多案例上手(内付源码)

简介&#xff1a; Vue2到3 Day1-3 全套学习内容&#xff0c;众多案例上手&#xff08;内付源码&#xff09;_星辰大海1412的博客-CSDN博客本文是一篇入门级的Vue.js介绍文章&#xff0c;旨在帮助读者了解Vue.js框架的基本概念和核心功能。Vue.js是一款流行的JavaScript前端框架…

【C语言】三子棋游戏——超细教学

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;C语言 &#x1f525;该篇将结合之前的知识来实现 三子棋游戏。 目录&#xff1a; &#x1f31f;思路框架&#xff1a;测试游戏 &#x1f31f…