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

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

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

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

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.mzph.cn/news/51851.shtml

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

相关文章

怎么检测UI卡顿?(线上及线下)

什么是UI卡顿? 在Android系统中,我们知道UI线程负责我们所有视图的布局,渲染工作,UI在更新期间,如果UI线程的执行时间超过16ms,则会产生丢帧的现象,而大量的丢帧就会造成卡顿,影响用…

Matlab彩色图像转索引图像

索引图像 索引图像是一种把像素值直接作为RGB调色板下标的图像。索引图像包括一个数据矩阵X,一个调色板矩阵map,也称为颜色映像矩阵。其中,数据矩阵X可以是8位无符号整型、16位无符号整型或双精度类型。调色板矩阵map是一个m3的数据阵列&…

亚马逊云科技CEO谈及企业领导力原则的核心:坚持顾客至上

亚马逊云科技首席执行官Adam Selipsky几乎从一开始就在那里:他于2005年加入,在效力亚马逊11年后于2016年离开,转而经营Tableau,并于2021年成为亚马逊云科技首席执行官。当时亚马逊云科技前首席执行官安迪贾西(Andy Jassy)接替杰夫…

大数据(一)定义、特性

大数据(一)定义、特性 本文目录: 一、写在前面的话 二、大数据定义 三、大数据特性 3.1、大数据的大量 (Volume) 特性 3.2、大数据的高速(Velocity)特性 3.3、大数据的多样化 (Variety) 特性 3.4、大数据的价值 (value) 特性 3.5、大…

废品回收抢单派单小程序开源版开发

废品回收抢单派单小程序开源版开发 用户注册和登录:用户可以通过手机号码注册和登录小程序,以便使用废品回收抢单派单功能。废品回收订单发布:用户可以发布废品回收订单,包括废品种类、数量、回收地点等信息。废品回收抢单&#…

React通过docx-preview预览Word文档

前言 在基于React的Web应用中,我们经常遇到需要预览和展示Word文档的需求。而docx-preview是一个优秀的React组件库,可以帮助我们实现在Web页面上预览Word文档的功能。本文将介绍如何使用docx-preview组件来实现Word文档的预览,并提供一个案例…

JavaScript箭头函数

Arrow Functions(箭头函数)是 ES6 中引入的一种新的函数表达式语法,它可以更简洁地定义函数,并且不需要像普通函数一样使用 function 关键字。 例如我们上节课的代码: const peopleAge function calcAge1(birthYear)…

vue3+ts+uniapp小程序端自定义日期选择器基于内置组件picker-view + 扩展组件 Popup 实现自定义日期选择及其他选择

vue3ts 基于内置组件picker-view 扩展组件 Popup 实现自定义日期选择及其他选择 vue3tsuniapp小程序端自定义日期选择器 1.先上效果图2.代码展示2.1 组件2.2 公共方法处理日期2.3 使用组件 3.注意事项3.1refSelectDialog3.1 backgroundColor"#fff" 自我记录 1.先上…

error: can‘t find Rust compiler

操作系统 win11 pip install -r requirements.txt 报错如下 Using cached https://pypi.tuna.tsinghua.edu.cn/packages/56/fc/a3c13ded7b3057680c8ae95a9b6cc83e63657c38e0005c400a5d018a33a7/pyreadline3-3.4.1-py3-none-any.whl (95 kB) Building wheels for collected p…

哲讯科技携手无锡华启动SCM定制化项目,共谋数字化转型之路

无锡华光座椅弹簧有限公司启动SCM定制化项目 近日,无锡华光座椅弹簧有限公司顺利举行了SCM定制化项目的启动会。本次启动会作为该项目实施的重要里程碑,吸引了双方项目组核心成员的共同参与,并见证了项目的正式启动。 无锡华光座椅弹簧有限公…

计算机网络面试题

文章目录 描述HTTP和HTTPS的区别Cookie和Session有什么区别BIO、NIO、AIOTCP三次握手和四次挥手跨域请求是什么?有什么问题?怎么解决?网页输入url,到渲染整个界面的整个过程,以及中间件用了什么协议Rest、RestfulTCP的…

【C语言】动态内存管理(malloc,free,calloc,realloc)-- 详解

一、动态内存分配 定义:动态内存分配 (Dynamic Memory Allocation) 就是指在程序执行的过程中,动态地分配或者回收存储空间的分配内存的方法。动态内存分配不像数组等静态内存分配方法那样,需要预先分配存储空间,而是由系统根据程…

0103水平分片-jdbc-shardingsphere-中间件

文章目录 1 准备服务器1.1 创建server-order0容器1.2 创建server-order1容器 2、基本水平分片2.1、基本配置2.2、数据源配置2.3、标椎分片表配置2.4、行表达式2.5、分片算法配置2.6、分布式序列算法 3、多表关联3.1、创建关联表3.2、创建实体类3.3、创建Mapper3.4、配置关联表3…

【C++设计模式】用动画片《少年骇客》(Ben10)来解释策略模式

2023年8月25日&#xff0c;周五上午 今天上午学习设计模式中的策略模式时&#xff0c;发现这个有点像很多卡通片里面的变身器... #include<iostream>//alien hero是外星英雄的意思 //在《少年骇客》中&#xff0c;主角可以通过变身器变成10种外星英雄 class AlienHero{ …

手机盖板IR油墨透光率检测仪T03

手机盖板作为手机最外层玻璃面板&#xff0c;其加工一般有落料、倒边、抛光、镀膜、丝印等多道加工工序组成&#xff0c;其中任何一个工序出现差错&#xff0c;都有可能导致手机盖板产生缺陷&#xff0c;例如漏油、透光、IR孔不良、视窗划伤、油墨区划伤、內污、边花等&#xf…

CSS中如何实现元素之间的间距(Margin)合并效果?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 外边距合并的示例&#xff1a;⭐ 如何控制外边距合并&#xff1a;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff…

C语言实现状态机

关于状态机&#xff0c;基础的知识点可以自行理解&#xff0c;讲解的很多&#xff0c;这里主要是想写一个有限状态机FSM通用的写法&#xff0c;目的在于更好理解&#xff0c;移植&#xff0c;节省代码阅读与调试时间&#xff0c;体现出编程之美。 传统的实现方案 if...else : …

Nginx入门——Nginx的docker版本和windows版本安装和使用 代理的概念 负载分配策略

目录 引出nginx是啥正向代理和反向代理正向代理反向代理 nginx的安装使用Docker版本的nginx安装下载创建挂载文件获取配置文件创建docker容器拷贝容器中的配置文件删除容器 创建运行容器开放端口进行代理和测试 Windows版本的使用反向代理多个端口运行日志查看启动关闭重启 负载…

【BASH】回顾与知识点梳理(三十八)

【BASH】回顾与知识点梳理 三十八 三十八. 源码概念及简单编译38.1 开放源码的软件安装与升级简介什么是开放源码、编译程序与可执行文件什么是函式库什么是 make 与 configure什么是 Tarball 的软件如何安装与升级软件 38.2 使用传统程序语言进行编译的简单范例单一程序&#…

leetcode304. 二维区域和检索 - 矩阵不可变(java)

前缀和数组 二维区域和检索 - 矩阵不可变题目描述前缀和代码演示 一维数组前缀和 二维区域和检索 - 矩阵不可变 难度 - 中等 原题链接 - 二维区域和检索 - 矩阵不可变 题目描述 给定一个二维矩阵 matrix&#xff0c;以下类型的多个请求&#xff1a; 计算其子矩形范围内元素的总…