HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

系统架构系列(五):技术架构之高可扩展系统设计与实现

  • 2019-06-27
  • 本文字数:3441 字

    阅读完需:约 11 分钟

系统架构系列(五):技术架构之高可扩展系统设计与实现

可扩展性是衡量架构设计的一个因素,也经常被开发者提到。但是,一个系统要设计出比较好的可扩展性是有一定难度的,而且可扩展性体现在不同层次上,有大的可扩展性,也有小的可扩展性,本文从可扩展的本质出发,通过平时常用的框架来印证,最后通过实际案例说明如何设计高可扩展性系统。


一、可扩展的本质是什么?

可扩展的意思是在面对变化时,用最少的代价去实现,平时我们听得最多的是面向抽象(接口)编程,如果只是把这里的抽象理解成接口,那么就有些狭隘了,抽象是通式通法,而接口只是其中一个,所以在谈可扩展实现之前一定要讲清楚可扩展的本质是什么,连本质都不知道,怎么提出系统性解决方案。

1.1 扩展的本质

扩展的本质就是占位符,明确告诉你这里被占了,具体谁占了不清楚。那么问题来了:占位符到底是什么?它是怎么表达的?又要如何实现的?如果可以把这三个问题理清楚,就可以想到很多可扩展性方案,而不再是单一的面向接口编程。


  • 占位符到底是什么:占位符仅仅是一个标识,标志这里会有变化,一句话可以概括:凡是可以表达变化的就是占位符,然而具体的变化实现又没有给出,真正体现了做什么和怎么做的分离

  • 占位符怎么表达:要回答这个标识是用什么来表达,变量、接口、配置项…这些都可以表达占位符,变量能被赋值同一类型的数据;接口可以有不同的实现;配置项也可以被赋予不同的值…所以,实现可扩展的思路一下就打开了。

  • 如何实现:再往深层次思考,实现一个接口,如何在执行时动态找到实现类?如果把这个问题想清楚,在实际中实现可扩展又会有一套系统性解决方案。整个过程就两点:识别和执行,识别的意思就是要找到对应目标,接下来就是执行。


综上,到这里可能已经有自己应对可扩展的方法,上面已经给了从不同角度看可扩展性的示例,接下来就是系统化提出应对可扩展的方法。


结论一:扩展的本质就是占位符,凡是可以表达变化的就是占位符

1.2 应对可扩展的方法

先给出应对可扩展的方法:规范、识别、注册、使用,这 4 点都是从上面可推导出来的,下面一一进行详细说明。


  • 规范:规范是从占位符推导出来的,既然是标志有变化,一定要遵循一定的规范表达,否则别人是不知道的,如接口,就是很直接地表达这里是有变化的,具体的实现还不知道;变量天然地表达这里是变化的数据。

  • 识别:有了规范定义之后,接下来就是识别,之前为什么可扩展一直对我们来讲很虚,那是因为规范和识别都是系统帮我们做的,我们只是知道而没有真正实践。规范是定义,识别是找出有哪些实现了规范。

  • 注册:识别出来之后,就要把信息存储起来,可以存储在本地,也可以存储在远程,如果存储在远程就是一个注册的过程,这里的注册就是存储的意思。简单理解就是识别出来之后要集中管理。

  • 使用:使用就很简单,找到具体实现并执行逻辑处理。


上面四个单词看起来简单,除了使用是终极目标外,其它三个都是抽象的表达,比如规范如何定义、怎么识别、如何注册?通过上面的表述可以看到具体要怎么实践,这里再总结下:


  • 规范如何去定义:凡是可以表达变化的就能用它来定义,常见的有配置项、变量、接口、注解等;

  • 怎么去识别:这个要具体去看如何定义规范,如配置项的变化有一个监听变化;注解是要扫描类来识别 annotation;

  • 如何去注册:如果系统的交互只是一个,那么存储在本地就行,如果系统的交互是多个,那么要注册到一个注册中心上去。


结论二:应对可扩展的方法:规范、识别、注册、使用

1.3 扩展的经典案例

此处使用一个经典案例来说明可扩展性,并从其原理上印证上述方法。


在 Java 中,SPI 对于大部分人来讲并不陌生,最典型的加载数据库驱动就是通过 SPI 来实现的。如果你看了 SPI 的原理,再去看上面写的,会感觉两个思路很相似。


SPI 有它的规范,要到指定目录下加载对应文件;找到文件后进行解析、识别并加载;最后就是使用。整个流程能印证上面所提到的:规范、识别、注册、使用。所以,方法的提出有一个点就是从具体案例中进行抽象,提炼共性的东西,再去推演其它案例看能不能也满足。

二、可扩展性系统实践之路

此处以优惠券业务平台为例讲解可扩展性系统设计与实现,在上一篇文章中已经讲了优惠券系统是一个平台型的业务系统,要做到业务与业务的隔离、业务与平台的隔离。

2.1 识别变化

经过整体分析之后,已经确定大业务流程:建券、发券、用券、退券,以及对应的子流程,接下来就是要分析出哪些内容会变化。



比较明显的变化就是领券、用券门槛的变化,因为不同业务线有不同的限制条件,有的要限制不同人群,有的要限制领取次数…已经认别了变化接下来就是要处理这些变化。


结论三:找扩展点就是找系统经常变化的地方

2.2 处理变化的常见手段

2.2.1 野蛮处理


一个最简单的处理,就是在代码中写 if else,它的特点是简单直接上线,不足的点长期下去,系统会变得很难维护、可扩展性较差。


   if(productId = ProductEnum.A){       // 具体的处理   }else if(productId = ProductEnum.B){      // 具体的处理   }else if(productId = ProductEnum.C){      // 具体的处理   }else{      ......   }
复制代码


这种代码放到现在,很多系统还是这么做的,而且是在业务发展初期最喜欢用这种野蛮处理方式,搞上去就能直接上线,快速支持业务。


2.2.2 面向接口设计


对上面野蛮方式的一个常见处理就是面向接口设计,抽象出一个限制条件检查的接口,不同的业务线有对应的实现,通过配置指定业务线下所有的实现,将这些实现放到一个映射中,在程序执行过程中,通过业务线就可以执行所有的接口实现类并依次执行。


     List<Rule> ruleList = RuleFacotry.getByProductId(prodcutId);
复制代码


这种方法比第一种明显要好,体现了一定的可扩展性,新加一个规则限制,重新实现接口就行,然后在配置项中加上这个新的实现,代码的改动量也还好。它有一个明显的问题就是每次新加一个实现就要发布上线,有没有办法不发布上线就能满足目的呢?有,就是下面提到的一类可扩展性设计的方法。

2.3 一类可扩展性设计的方法

再来明确一下目标:系统具备可扩展性和不发布系统就能实现新增功能。


还是使用上面说的方法:规范、认别、注册、使用,下面结合这个具体的案例来说明。


  • 规范:这里是用接口来作为规范描述限制条件,包含入参和出参,这里有一个开放平台,实现了一个接口后就可以提交代码。

  • 识别:在建优惠券时,会加载业务线有哪些业务规则实现,在领取、使用时可以进行配置选择,此时只是插入一个变量标识使用某个限制条件(如限人群,这个实现的逻辑可能会变化,通过变量名来标识变化)。

  • 注册:系统在执行的过程中,发现有限制条件的变量名,拿这个变量名从开放平台中拉取具体的实现存储在本地(有一个缓存时间,具体的过期时间依业务考虑,我们取的是 30 分钟)。

  • 执行:拿到具体的实现后,依次执行。


再整理下流程步骤,让大家更进一步掌握该设计方法:


  • 在开放平台提交限制条件接口的实现代码,有限制人群的实现、限制领取券次数…

  • 在开放平台提交之后,会入库存储,数据库里会存储一个业务线对应的多个限制实现。

  • 创建优惠券时,会加载业务下的限制规则,通过配置选择具体要使用到的限制规则(相同业务线下的不同优惠券可以有不同的规则限制),配置选择后,会在规范字段中存储规则实现的 id(规则实现可能会变化,会有多次提交),所以这里存储的是 id,在执行的时候可以拿到这个 id。

  • 在领券、用券时,会检查规则限制有哪些,通过 id 列表从远程开放平台拉取具体实现,把 java 代码拉下来之后就可以编译,并存储到本地或者集群缓存中。

  • 最后就是执行具体的实现逻辑。



结合这张图看就会清晰很多,整体的业务平台架构比较清晰,分为开放平台、配置平台、业务平台和数据平台,一个新业务方接进来很简单,简单配置下就可以使用。

三、小结

本篇文章主要讲可扩展性系统的设计与实现,从可扩展的本质讲起,可扩展的本质就是占位符,凡是可表达变化的都可以称之为占位符,常见的有变量、接口、配置项、注解等,然后提出应对可扩展性的方法:规范、识别、注册、使用四个步骤,虽然只有 8 个字,但它包含了一套系统的处理方案,不再是单一的面向接口编程,最后结合具体的案例进行说明如何设计可扩展性系统。


作者介绍:


高福来,先后在 Oracle、阿里工作,目前在滴滴小桔车服加油团队负责营销基础(优惠券、奖励金),在分布式中间件和系统架构方面积累了一定的经验,擅长用通俗易懂的语言描述复杂问题。


相关文章:


《系统架构系列(一):如何用公式定义该概念?》


《系统架构系列 (二):应对这一概念的方法》


《系统架构系列 (三):业务架构实战上篇》


《系统架构系列(四):业务架构实战下篇》


2019-06-27 08:3516456

评论 10 条评论

发布
用户头像
这个系列讲的不错
2019-09-13 13:40
回复
用户头像
看着有点难理解,希望可以详细讲解, 业务平台和业务方应用在运行态的关系 , 是否可以理解为业务平台只保存定义和配置,在运行时还是由业务方应用拉取到本地来编译运行
2019-06-27 23:45
回复
业务平台里有固定的业务流程,由于每个业务线相同功能也有不同的实现,就提供一个扩展点出来,可以是业务平台来实现,也可以是业务方自己实现,把这个实现上传至开放平台上,业务平台在配置的时候会记录规则id,业务方应用调用业务平台时,业务平台会根据记录的规则id去开放平台拉取对应扩展点的实现代码编译运行
2019-06-28 09:35
回复
同感;系列中1、2、3文笔流畅,思路清晰,4,5当中”平台“字眼有些多,平台之间的关系阐述的有些拗口,难理解;
仍然为作者的分享点赞
2019-06-28 16:32
回复
感谢您的反馈,为您的持续关注点赞
2019-06-28 16:40
回复
用户头像
深入浅出的讲解了系统架构:
系统架构=解决待定的问题+连接+要素。
实践这个的方法:系统性思考 分解 抽象 模式
非常感兴趣,希望有机会线下交流
2019-06-27 16:48
回复
期待 可以先加个微信哈(gaofla)
2019-06-27 18:28
回复
我也想加大佬微信
2020-12-10 09:08
回复
没有更多了
发现更多内容

Carbon Copy Cloner for Mac(磁盘克隆/同步/备份软件)v6.1.1(7323)

Mac相关知识分享

磁盘克隆软件

支持m1/m2/m3 graphpad prism 10激活直装版下载 医学绘图工具

Rose

mac系统状态监控工具istat menus激活码 (istat menus中文版下载)

Rose

基于51单片机设计的热敏电阻测温系统

DS小龙哥

8月月更

HarmonyOS SDK助力美团单车提供便捷流畅扫码新体验

HarmonyOS SDK

HarmonyOS

NTFS Disk by Omi NTFS for mac(NTFS 磁盘管理器)v1.1.4中文版

Mac相关知识分享

磁盘管理器

ChatGPT 人工智能助理 Assistant

测试人

软件测试

【第2期】2024 搜索客 Meetup | Elasticsearch 的代码结构和写入查询流程的解读.md

极限实验室

elasticsearch Meetup easysearch 极限科技 搜索客社区

成就江旻憓奥运金牌的背后:权威型教养

心大陆多智能体

AI大模型 心理健康 数字心理

Reallusion Cartoon Animator for Mac(2D动画设计制作软件)中文激活版

Mac相关知识分享

Mac软件 动画设计软件 动画设计

深入理解 RDMA 的软硬件交互机制

阿里技术

nvidia 分析 网卡 RDMA

终极自托管解决方案指南

NocoBase

开发工具 解决方案 云服务

NGINX Gateway Fabric 如何实现复杂的路由规则

NGINX开源社区

JavaScript 开源 HTTP 经验分享 API

在 Confluent Cloud 上使用 Databend Kafka Connect 构建实时数据流同步

Databend

零信任产品联动能力持续提升,全面整合协同运行

芯盾时代

iam 统一身份认证 零信任 mfa

[Paper Reading]: Self-Improving Alignment with LLM-as-a-Meta-Judge

吴京

LLM LLM-as-a-Judge

iOS数据恢复Disk Drill for Mac v5.4.1425中文版 含Disk Drill激活码

Rose

macos 10.15系统:macOS Catalina for mac 正式版

你的猪会飞吗

mac软件下载 mac破解软件下载

望繁信科技荣获第六届“中国创翼”创业创新大赛二等奖,将代表上海市参加全国总决赛

望繁信科技

流程挖掘 流程智能 上海望繁信科技 现代企业服务 业务流程管理优化

MySQL UDF 提权初探

GreatSQL

智能化库存管理:1688商品详情API的革新应用

代码忍者

简化流程:京东商品详情API的快速集成指南

代码忍者

Maxon Cinema 4D Studio S22 for mac(C4D动画设计工具)中文激活版

Mac相关知识分享

动画设计工具 C4D动画

深度解读昇腾CANN小shape算子计算优化技术,进一步减少调度开销

华为云开发者联盟

CANN 昇腾 企业号 8 月 PK 榜 2024企业号8月pk 算子优化

小红书API接口最新指南:笔记详情数据接口的接入与使用

tbapi

小红书笔记详情接口 小红书API 小红书笔记详情数据采集

AirPods耳机管理工具AirBuddy for mac 兼容macOS14系统 支持m芯片

Rose

mac篮球游戏:NBA 2K23 Arcade Edition for Mac

你的猪会飞吗

mac单机游戏 mnac软件

黑神话悟空是什么游戏 黑神话悟空配置要求 苹果电脑怎么玩黑神话悟空 黑神话悟空和西游记的联系

阿拉灯神丁

游戏 Mac 软件 苹果电脑 CrossOver Mac下载 黑神话悟空

蓝易云 - linux压缩webfile文件夹 webfile.tar.gz和webfile.tar的区别

百度搜索:蓝易云

云计算 Linux 运维 云服务器 压缩

贝壳的面经!怎么好像有点简单?

王中阳Go

Go 面经

axure rp8安装包下载 Axure RP 8 for Mac中文永久密钥分享

Rose

系统架构系列(五):技术架构之高可扩展系统设计与实现_文化 & 方法_高福来_InfoQ精选文章