业务团队如何统一架构设计风格?

简介: 首次上线应用,面对业务框架搭建你是否曾感到无从下手?维护线上应用,面对大量历史包袱你是否正避坑不及深陷泥潭?为何同样是业务应用,不同人的设计风格千差万别?为何最初的设计经过多个迭代后总是面目全非?新人来到团队,怎样才能快速了解业务,不被大量技术细节折磨?如果你也有这些困扰,希望本文能提供些许帮助。

image.png

作者 | 木沉
来源 | 阿里技术公众号

首次上线应用,面对业务框架搭建你是否曾感到无从下手?维护线上应用,面对大量历史包袱你是否正避坑不及深陷泥潭?为何同样是业务应用,不同人的设计风格千差万别?为何最初的设计经过多个迭代后总是面目全非?新人来到团队,怎样才能快速了解业务,不被大量技术细节折磨?如果你也有这些困扰,希望本文能提供些许帮助。

一 初衷

1 细节割裂架构

业界的成熟应用框架有很多。无论是SpringMVC/SpringBoot还是SofaBoot,都对工程结构给出了明确的规范约定,职责边界看似非常清晰。但在实践中,再简单的业务应用都避免不了业务逻辑分散各处,打破module边界出现隐式耦合的现象。分散的业务细节必然导致应用架构的割裂,如果没有持续的重构调整,最终总会变得复杂臃肿(当然,是持续有新需求的前提下),老人沉默新人流泪,只能依靠天降猛男重做2.0。究其原因,个人认为主要在于:

  • 框架灵活性过高:应用框架给出的是工程规范,而非业务设计规范,为开发者保留了非常大的灵活性,一个业务功能可以有很多种实现方式。
  • 架构约束力不足:业务架构的搭建和维护是在不同时段由不同人分别投入的结果,设计思维的不同,自我要求的不同,项目进度压力的不同,都会对应用的现状产生影响。

若以法律和道德的关系做类比,通用框架约束了技术编码的“法律”底线,而设计原则就是开发人员对自身的“道德”要求。在简单的业务场景下,满足需求是第一优先级,设计能力的诉求并不突出。但在多方协作的业务团队下(真实情况大多如此),没有统一的“道德标准”,将很难形成合力完成复杂项目。《Java开发手册》(阿里巴巴Java开发规约)在推进编码标准的道路上迈出了很大一步,极大提升了工程人员的专业素质,大大提高了“道德共识”。那么在业务架构设计的领域里,是否至少能在某个问题域内,也建立一套面向业务研发同学的“设计规约”。

2 技术沉淀流失

另一方面,进入阿里巴巴后,自身研发经历虽然并不多,但接触过不少优秀设计。这些产出无论是否最优方案,都体现出了技术同学对优秀设计的美好愿望和强大落地能力,也确实在一定的历史时期内高效地保障了业务发展。然而,令我困惑的是,尽管每个业务项目和业务产品都能沉淀出一些可复用的组件或框架,参与研发的同学也能总结出一套面向未来需求的设计原则和实践经验,但这些财富始终难以维护和传承。可能的原因有(对前端/测试/数据/平台等研发经历不太了解,这里仅针对一线业务研发):

  • 坚持设计成果而非设计原则:有成功经验的研发同学,倾向于用曾经的架构设计来套用当下的业务场景。这种思路本身没有对错,但如果钉不配锤,往往会在短期内引入大量额外成本,反倒丧失了原本的设计优势。面对具体问题域,只有坚持一贯的设计原则,在需求分析的过程中结合诸多因素进行动态权衡,才能打造真正符合当下和未来需求的设计。
  • 喜欢造新轮子而非持续重构:研发同学的设计原则和代码洁癖可能是一种“玄学”,对前人代码的不待见倒是更具确定性的常态,其实这不难理解。即使都是DDD流派,方案沟通时也未必互相认可;即使经过让步对架构设计达成一致,编码实现的风格也是各领风骚。理解前人的设计思路和代码癖好更重要,还是按时完成业务需求更重要?按自己擅长的设计风格重写更简单,还是在他人的“过时”设计上持续重构优化更简单?
  • 靠文档传承而非工具化复用:对新人来说,文档里的再多建议和快速上手指南,都比不上一个开箱即用的工程DEMO;在成熟应用上持续开发的人,不会因为历史文档上大写的注意事项就抵抗住临时代码换取早点下班的现实诱惑,除非应用工程中有编译/部署失败的强制约束让你不得不放弃。

相比于缺少“设计规约”导致的低效协作,已经沉淀的“规约原型”被轻易抛弃更加令人可惜。业务研发的日常工作,本质上是拆解问题域的复杂性,用分层解耦/工具化/平台化/业务抽象的多种思路将子问题逐个击破。如果部分子问题已被很好解决,为何不站在前人肩上?放弃造不造新“轮子”的纠结心态吧,或许我们更需要搭“积木”的心态。

二 思路:业务架构设计规约

结合蚂蚁链-应用技术团队近年来的技术实践,我们试图从自身需求出发,搭建一套或许能满足更多业务场景的业务架构设计规约。重点说明下,本文是从有限的问题域出发提出的解决思路,不奢求成为通用解决方案。如果其他业务线也有类似的痛点,希望能有些许借鉴。

  • 标准:统一业务设计框架,用标准化架构简化技术细节
  • 沉淀:从业务场景中持续沉淀“积木”
  • 重构:持续重构“积木”,减少重复建设
  • 集成:基于业务服务编排引擎快速集成

1 标准——减少细节

理想情况下,业务技术只需关注领域建模,但现实中却不得不考虑更多通用的技术细节。以供应链金融场景下简化版的应收账款发行流程为例,需要考虑的有:

  • 领域建模:应收账款领域模型及其行为的设计
  • 流程编排:流程模型的设计及发行流程的状态机设计
  • 数据转换:领域模型<->数据模型及流程模型<->数据模型的双向转换
  • 并发控制:业务锁机制的设计
  • 业务幂等:流程中各业务环节的幂等控制
  • 异常处理:异常捕捉,错误码约定
  • 监控报警:摘要日志,异常日志,边界日志
  • 其他

在以上未完全列举的几项中,除了“领域建模”以外,基本都是与具体业务无关,但对于一个稳定可靠的业务应用不可缺失的部分。如果能建立一套标准化的框架方案,用统一的规范解决掉业务无关的大量细节,是否就能让业务技术同学真正的专注于“领域建模”?

2 沉淀——能力复用

沉淀和复用是技术群最常出圈的几个词,可见认同度之高。能力复用不局限于形式和粒度,能够切实降低技术成本,提高业务扩展性,就是不错的沉淀,可作为“积木”供后续使用。以蚂蚁链应用技术团队场景为例,近年来沉淀的能力包括但不局限于:

技术类

  • 工程规范系列:约束编码规范和边界接口定义风格,日志打印,异常处理,仓储行为,状态机等等
  • 读写分离机制:屏蔽交易类需求与查询类需求对数据模型的设计冲突,降低设计复杂性,提升查询性能和灵活性

业务类

  • 网银核身:提高网银核身签名在不同业务流程中的扩展性
  • 合约上链:提高智能合约对接在不同业务流程中的扩展性

平台类

  • 配置中心:灵活定义和管理业务流程需要的各类配置项
  • 产品中心:平台功能打包和隔离,实现业务流程的全局视图

3 重构——持续优化

沉淀来源于业务需求,却常常落后于新需求。对于设计者以外的人来说,维护他人的“积木”常常会踩到不少坑,反倒不如自己重写。这也是为何每个团队都在说沉淀,但能够横向复用,甚至在同一个团队内持续复用的能力都少之又少。虽然这个现象没有完美解法,但个人建议采取以积极的心态看待这些“积木”:

  • 分析历史背景,了解“积木”出现的技术和业务背景
  • 明确该能力能够解决的问题,和不适用的场景
  • 分析当下业务需求,是否可以重构该能力后直接复用
  • 与创作者沟通,评估重构落地方案

这里没有强调重构复用和重写这两种方案的ROI对比,是因为个人看来,即使前者成本更高,重构的过程对个人技术成长和团队文化统一都是有利的。相对于不断推翻和发明新“积木”,持续优化的过程,是对自己和他人经验的不断回顾和反思,看清历史的坑,才能避免新风险的出现。

4 集成——灵活搭建

标准能够落地,除了有足够趁手的“积木”库外,更重要的一点,是要有灵活便捷的“粘合剂”,以完成业务功能的快速搭建和灵活调整。在供应链金融的场景下,业务需求主要体现为各种各样的业务流程,比如发行/转让/清分等等。为了简化“积木”搭建,灵活复用底层能力,我们基于以下目标,设计了面向业务的服务编排引擎:

  • 标准化:遵循设计规约,将业务无关的通用技术细节屏蔽
  • 插件化:对“积木”友好,可持续沉淀和复用新能力
  • 业务化:面向业务,有业务描述能力的流程编排
  • 配置化:通过配置即可完成流程编排,最好能做到可视化配置

5 产品——业务大图

“积木”+“粘合”能够满足技术落地的低成本高扩展,但从业务视角,还需要一个全局大图来描绘业务线的全域能力和功能流程。本文中暂不涉及。

三 实践——业务架构标准方案

如前所说,只靠文档形成的共识,对技术没有足够的约束,极难维持。因此,我们基于上述规约的各项原则,搭建了一套标准化的业务架构设计方案,通过组件化工具化的方式约束业务应用,形成团队共识。一个标准的业务应用架构如下:

image.png

1 组件——规范技术细节

通过组件化约定,约束通用技术细节的行为,包括但不局限于:

交易模型

描述业务流程的核心交易模型,用于管控状态推进,维持与业务模型的关联。

仓储行为

数据持久层的通用行为,包括锁定查询/插入/更新/普通查询等。

事务模板

定义事务边界,确保模版内业务逻辑的事务一致性;支持幂等能力。

通用业务模板

定义业务逻辑边界,无事务性保障,但包含了异常处理/日志埋点等通用能力。

通用查询模板

定义查询逻辑边界,与通用业务模板类似,但主要面向单项/批量/分页等查询场景。

消息

对消息中间件的简单封装,适配业务应用规约,降低配置成本。

调度

对调度中间件的简单封装,适配业务应用规约,降低配置成本。

服务开放

api组件规范对外服务能力,通过注解识别服务定义和服务实现,自动生成接口文档,描述接口参数/返回/业务域/错误码等等。

其他——日志/异常处理/请求参数/返回类型

这里不做展开。

以上是所有业务应用都会遇到的技术细节,用组件屏蔽细节的思路也没有复杂之处,我们想要表达的重点是:尽可能沉淀和复用技术组件,尽可能使用他人的成果,不要重复搭建,把重心放到业务上!

2 领域——专注业务建模

再次强调,对业务技术来说,业务建模是核心,业务建模是核心,业务建模是核心!本文的初衷和方案都是为了让开发解放出来,直面核心业务的设计和思考。本小节仅给出领域产出的基本要求,后续在【案例分析】再做详述。

领域实体

建模的核心是抽象出领域实体及其关联关系,不同的业务场景和设计思路,会有很大差异,最终会体现为一到多个领域模型。需要明确在不同业务流程下,各交易模型内需要包含的领域模型(比较抽象,后续在【案例分析】再做详述)。

领域仓储

定义数据模型,及其与领域模型的对应关系(各种converter)。基于上文提到的仓储组件,配置数据库表和连接,实现锁定查询/插入/更新/普通查询等业务行为。

领域服务

基于业务行为,抽象出原子化的领域服务能力。该服务无需关注数据仓储,无需关注业务流程,仅抽象出领域实体的原生能力。以上文中提到的应收账款模型为例,至少需要包含:

  • 应收账款的创建
  • 应收账款的拆分/流转
  • 应收账款的销毁

等等基本行为。

交易实体

用于承载交易流程的业务实体,上文中交易模型的业务实例,内部关联一到多个领域实体。

交易仓储

用于管控交易实体以及内部各领域实体的仓储行为。

3 服务编排引擎 —— 积木+粘合

但凡涉及复杂业务流程的应用,都需要引入流程引擎来编排状态机的流转。业界有很多成熟的流程引擎框架,也有很多足够可用的简化版本。但如前文所说,这类通用引擎的优点也是其最大的弱点:过强的灵活性无法对设计风格形成约束,大量业务细节会分散在不同状态节点间,不直观也难维护。从自身需求出发,我们设计了面向业务的服务编排引擎,以遵循业务设计规约的方式约束技术,以直观的形式描述业务流程。与传统流程引擎相比,其业务友好性主要体现在:

  • 约束业务模型:需明确指定业务交易模型/状态及仓储定义,遵循业务设计规范
  • 托管仓储行为:只需配置业务模型及仓储实现,无需再关注数据持久化的时机和细节
  • 编排领域服务:通过转接层,将领域服务开放到引擎中自由编排。领域的原子能力是引擎编排的最小执行单位
  • 灵活增减状态:流程中的状态迁转和业务行为均可被灵活插拔
  • 支持“积木”扩展:将可复用的领域服务组合打包,形成固定模式,作为“积木”在其他流程中重复使用

总的来说,服务编排引擎基于通用组件屏蔽技术细节,重点专注于业务行为的编排和复用,对“积木”进行“粘合”,以编排出符合业务需求的业务流程。

四 总结

本文从业务技术团队的现实痛点出发,尝试以业务架构设计规约(理论标准)结合业务架构标准方案(工程约束)的思路统一团队的技术风格,将技术同学从细节中释放出来,专注于技术能力的积累和对业务价值的思考。希望传达的想法有:

  • 用标准约束技术细节:降低业务设计的灵活性,也是为了减少成本
  • 用技术工具而非文档推行标准:持续沉淀的组件,胜过没有约束力的文档
  • 持续重构而非造新轮子:正视自己和他人曾经的产出,持续改进能带来成长
  • 重视业务建模:好好思考业务和行业吧,用DDD武装自己,提升建模思维和能力

原文链接

本文为阿里云原创内容,未经允许不得转载。

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

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

相关文章

一文详解物化视图改写

简介&#xff1a; 本文主要介绍什么是物化视图&#xff0c;以及如何实现基于物化视图的查询改写。 作者&#xff1a;阿里云数据库OLAP产品部 云曦 预计算和缓存是计算机领域提高性能以及降低成本的最常见的手段之一。对于那些经常重复的请求&#xff0c;如果可以通过缓存回答…

close_wait过多服务器无响应,记一次大量CLOSE_WAIT连接导致的服务宕机

最近线上服务出现了一段时间的无法响应&#xff0c;在此总结一下问题的排查过程。监控信息监控显示CPU和内存没有异常波动&#xff0c;TCP连接中有大量的CLOSE_WAIT状态的连接。看一下TCP连接断开的过程&#xff1a;也就是说客户端发起了断开连接的包&#xff0c;服务端收到数据…

【Java JVM】Java 实例对象的访问定位

Java 程序会通过栈上的 reference 数据来操作堆上的具体对象。 但是 reference 类型在《Java虚拟机规范》里面只规定了它是一个指向对象的引用, 并没有定义这个引用应该通过什么方式去定位, 访问到堆中对象的具体位置, 所以对象访问方式也是由虚拟机实现而定的&#xff0c;主流…

独家对话阿里云函数计算负责人不瞋:你所不知道的 Serverless

简介&#xff1a; 如果你是一名互联网研发人员&#xff0c;那么极有可能了解并应用过 Serverless 这套技术体系。纵观 Serverless 过去十年&#xff0c;它其实因云而生&#xff0c;也在同时改变云的计算方式。如果套用技术成熟度曲线来描述的话&#xff0c;那么它已经走过了萌芽…

nginx location 匹配 多个规则_三道小练习助你弄懂 Nginx location 匹配

在 Nginx 中我们可以通过配置 location 指令块&#xff0c;来决定一个请求 url 如何处理。如果我们编写了多条 location 指令块&#xff0c;如何保证各个 location 不会产生冲突&#xff1f;如何理清 location 的匹配顺序&#xff1f;带着这两个问题&#xff0c;我们先来做几道…

手机淘宝轻店业务 Serverless 研发模式升级实践

简介&#xff1a; 随着 Serverless 在业界各云平台落地&#xff0c;阿里内部 Serverless 研发平台、各种研发模式也在业务中逐步落地&#xff0c;如火如荼。在此契机下&#xff0c;淘系团队启动了轻店 Serverless 研发模式升级战役&#xff0c;基于阿里集团底层设施建设、上层技…

服务器 独立显卡 显示不出来,dell服务器R720+独立显卡GTX1650,进不去系统,UEIF报错...

戴尔服务器dell R720的显卡问题。操作系统是win2008R2。现在是安装的华硕750ti&#xff0c;运行ok&#xff0c;多个屏幕。买了技嘉gtx1650&#xff0c;刚出的显卡安装了。在集成显卡情况下打了驱动&#xff0c;设备管理显示识别了。但是切换到GTX1650显卡下启动系统&#xff0c…

饿了么EMonitor演进史

简介&#xff1a; 可观测性作为技术体系的核心环节之一&#xff0c;跟随饿了么技术的飞速发展&#xff0c;不断自我革新。 序言 时间回到2008年&#xff0c;还在上海交通大学上学的张旭豪、康嘉等人在上海创办了饿了么&#xff0c;从校园外卖场景出发&#xff0c;饿了么一步一…

注入点批量收集工具_原来微信群也是能够批量管理的,学到了

运营微信社群的人都知道&#xff0c;在没有工具的时代&#xff0c;自己总会人肉管理的一批微信群&#xff0c;少则几个&#xff0c;多个几十个上百个&#xff0c;那么现在微信群的管理到了工具时代&#xff0c;怎么批量管理比较好呢&#xff1f;微信群区别于论坛&#xff0c;作…

宿主机进程挂载到容器内_迄今为止最严重的容器逃逸漏洞:Docker cp命令漏洞分析(CVE201914271)...

摘要在过去几年中&#xff0c;我们在各种容器平台(包括Docker、Podman和Kubernetes)中发现了copy(cp)命令中存在多个漏洞。其中&#xff0c;迄今为止最严重的的一个漏洞是在今年7月被发现和披露的。然而&#xff0c;在该漏洞发布的当时&#xff0c;并没有立即引起太多关注&…

知乎的 Flink 数据集成平台建设实践

简介&#xff1a; 本文由知乎技术平台负责人孙晓光分享&#xff0c;主要介绍知乎 Flink 数据集成平台建设实践。内容如下&#xff1a; 1. 业务场景 &#xff1b; 2. 历史设计 &#xff1b; 3. 全面转向 Flink 后的设计 &#xff1b; 4. 未来 Flink 应用场景的规划。 本文由知乎…

阿里云总裁张建锋:新型计算体系结构正在形成

10月19日&#xff0c;在2021云栖大会上&#xff0c;阿里云智能总裁张建锋以“云深处&#xff0c;新世界”为主题&#xff0c;首次阐释了一个全新的云上世界。他认为&#xff0c;一个以云为核心的新型计算体系结构正在形成&#xff0c;随着云网端技术进一步融合&#xff0c;未来…

汽车之家基于 Flink 的数据传输平台的设计与实践

简介&#xff1a; 数据接入与传输作为打通数据系统与业务系统的一道桥梁&#xff0c;是数据系统与架构中不可或缺的一个重要部分。数据传输系统稳定性和准确性&#xff0c;直接影响整个数据系统服务的 SLA 和质量。此外如何提升系统的易用性&#xff0c;保证监控服务并降低系统…

exe打包工具哪个最好_一键分发工具哪个最好用?30万人选择这款

因为现代化媒体的优势不断显现&#xff0c;最近这几年&#xff0c;新媒体领域异常被人们注重&#xff0c;其门槛低、流量效果无可挑剔、转化比较快速等优点&#xff0c;于是聚拢了无数想改变命运的人&#xff0c;为了种种目的&#xff0c;想弄到极其喜人的数据流量&#xff0c;…

融合趋势下基于 Flink Kylin Hudi 湖仓一体的大数据生态体系

简介&#xff1a; 本文由 T3 出行大数据平台负责人杨华和资深大数据平台开发工程师王祥虎介绍 Flink、Kylin 和 Hudi 湖仓一体的大数据生态体系以及在 T3 的相关应用场景。 本文由 T3 出行大数据平台负责人杨华和资深大数据平台开发工程师王祥虎介绍 Flink、Kylin 和 Hudi 湖仓…

阿里云推出“磐久”云原生服务器系列 能效和交付效率大幅提升

10月19日上午&#xff0c;在2021杭州云栖大会上&#xff0c;阿里云正式推出面向云原生时代的“磐久”自研服务器系列&#xff0c;首款搭载自研芯片倚天710的磐久高性能计算系列也同时亮相&#xff0c;该款服务器将在今年部署&#xff0c;为阿里云自用。 据悉&#xff0c;磐久服…

代码评审中的代码协同

简介&#xff1a; 代码评审中同样存在着“Talk is cheap. Show me the code”&#xff0c;语言无力时&#xff0c;直接上代码吧。这就是我们今天要讨论的话题——代码评审中的代码协同。 作者 | 知忧 来源 | 阿里技术公众号 大神说&#xff1a;“Show me the code”&#xff0…

山东师范大学志愿推荐系统邀请码_快看点邀请码填写HGC1QK快看点邀请码填写HGC1QK快看点邀请码大家千万不要乱填写哦...

快看点邀请码填写HGC1QK快看点邀请码填写HGC1QK快看点邀请码大家千万不要乱填写哦快看点官网下载是一款非常好玩的软件&#xff0c;喜欢此类风格的用户可以体验一下哦。快看点官网下载特色系统:如此好玩的快看点官网下载&#xff0c;千万别错过&#xff0c;来下载体验吧&#x…

10种编程语言实现Y组合子

简介&#xff1a; Y组合子是Lambda演算的一部分&#xff0c;也是函数式编程的理论基础。它是一种方法/技巧&#xff0c;在没有赋值语句的前提下定义递归的匿名函数&#xff0c;即仅仅通过Lambda表达式这个最基本的“原子”实现循环/迭代。本文将用10种不同的编程语言实现Y组合子…

7读不出来卡显示无服务器,win7识别不了网络如何解决_win7显示未识别网络的处理方法...

我们在使用萝卜家园win7系统系统久了之后难免会出现各种问题&#xff0c;例如最近就有网友向小编反映说自己的win7出现了识别不了网络的情况&#xff0c;不知道怎么解决很是苦恼。没关系&#xff0c;下面本文就为大家整理了关于win7显示未识别网络的处理方法。处理方法如下&…