如何做好系统设计

摘要

在互联网系统架构设计中,如何用最少的资源支撑起亿级流量是每位工程师孜孜不息奋战的目标。虽然业务场景林林总总,但是万变不离其宗。本文分享了一些系统设计理论与方法,也是这两年多在工作中对系统设计的一些思考与总结。

一、善用UML工具

用例图
用于需求分析阶段,从用户角度描述系统功能。

用例图

静态图:类图、对象图、包图

静态图

交互图-时序图(注重时间)
常用组合片段:选项(Opt)、循环(Loop)、并行(Par)、抉择(Alt)、中断(Break)

时序图

交互图-协作图(注重对象)

协作图

行为图-状态图(注重状态)

状态图

行为图-活动图(注重活动)

活动图

实现图-组件图

组件图

实现图-部署图

部署图

二、遵从设计原则

设计模式基础

  • 单一职责:一个类只负责一个职能;
  • 里氏转换:在子类中不应重写、重载父类的方法,子类要能替代父类;
  • 接口隔离:不依赖不需要的接口,拆分大接口;
  • 迪米特法则:一个对象应该对其他对象保持最少的了解(低耦合);
  • 开放封闭:对扩展开放,对修改关闭;
  • 依赖倒置:抽象不应该依赖细节,细节应该依赖抽象,即针对接口编程,所有依赖关系都终止于抽象类或接口,不要对实现编程。

设计模式

创建型

  • 工厂方法(Factory Method):Creator、Product、ConcreteCreator、ConcreteProduct,父类决定实例生成方式,由子类生成实例。
  • 抽象工厂(Abstract Factory):AbstractFactory、ConcreteFactory、AbstractProduct、ConcreteProduct、Client,将零件组装成复杂结构的产品。
  • 单例(Singleton):Singleton,只有一个实例。
  • 建造者(Builder):Builder、ConcreteBuilder、Director(监工,聚合Builder)、Client,分阶段组装生成复杂结构的实例。
  • 原型(Prototype):Prototype、ConcretePrototype、Client,通过clone生成实例。

结构型

  • 适配器(Adapter):Target(对象)、Adapter(继承Target,聚合Adaptee)、Adaptee(被适配)、Client,连接填补不同接口的缝隙。
  • 代理(Proxy):Subject、Proxy(代理人,聚合RealSubject)、RealSubject(实际主体)、Client,Proxy与RealSubject实现同一接口,用于推迟实例的生成。
  • 桥接(Bridge):Abstraction(功能,聚合Implementor)、RefinedAbstraction、Implementor(实现)、ConcreteImplementor,将类的功能层次结构与实现层次结构分离。
  • 装饰(Decorator):Component(被装饰物)、ConcreteComponent、Decorator(装饰物,继承并聚合Component)、ConcreteDecorator,为Component添加Decorator,装饰边框与被装饰物具有一致性。
  • 组合(Composite):Leaf(树叶)、Composite(复合物,承载Leaf和Composite)、Component(Leaf和Composite的父类,使其一致)、Client,使容器与内容具有一致性,创造出递归结构。
  • 外观(Facade):Facade(窗口,依赖其它角色)、被组装的其它角色、Client,将复杂角色组装成简单窗口。
  • 享元(Flyweight):Flyweight、FlyweightFactory(聚合Flyweight,缓存Flyweight实现共享)、Client,共享内存,避免浪费。

行为型

  • 模板方法(Temple Method):AbstractClass、ConcreteClass(继承AbstractClass),在父类定义处理流程的框架,在子类中实现具体处理。
  • 责任链(Chain Of Responsibility):Handler、ConcreteHandler、Chain(组装Handler顺序)、Client,责任节点各司其职。
  • 策略(Strategy):Strategy、ConcreteStrategy、Context(上下文,聚合Strategy),可灵活替换算法。
  • 状态(State):State、ConcreteState、Context(上下文,聚合State),用类表示状态。
  • 观察者(Observer):Subject(观察对象,聚合Observer)、ConcreteSubject、Observer、ConcreteObserver,Subject变更时通知Observer。
  • 访问者(Visitor):Visitor、ConcreteVisitor、Element(元素)、ConcreteElement、ObjectStructure(对象结构,聚合Element),遍历并处理对象结构数据。
  • 迭代器(Iterator):Iterator、ConcreteIterator、Aggregate、ConcreteAggregate(聚合具体迭代器),遍历集合数据。
  • 命令(Command):Command、ConcreteCommand(聚合Receiver)、Receiver(接收者)、Client(请求者)、Invoker(发动者,聚合Command),保存命令历史记录和重复执行命令。
  • 备忘录(Memento):Originator(生成者)、Memento、Caretaker(负责人,聚合Memento),保存对象状态。
  • 仲裁者(Mediator):Mediator、ConcreteMediator(聚合ConcreteColleague)、Colleague(组员,聚合Mediator)、ConcreteColleague,组员向仲裁者报告,仲裁者向组员下达指示。
  • 解释器(Interpreter):AbstractExpression(抽象表达式)、TerminalExpression(终结符)、NonterminalExpression(非终结符,聚合AbstractExpression)、Context、Client,解析语法规则。

分布式设计原则

高可用
降级、限流(漏桶-平滑、令牌桶-可突发、环形队列+滑动窗口)、切流、熔断、回流、可回流、超时、隔离(线程、读写、资源、热点、爬虫)、负载均衡。

高并发
无状态、拆分、服务化、队列、数据异构(异构->原子化->聚合->缓存)、缓存、并发化(Future、Callback、Completable Future)、池化。

业务设计
防重、幂等、规则引擎、状态机、审计、审批。

分布式理论
CAP:一致性、可用性、分区容错性(三选二);
BASE:基本可用、软状态、最终一致性;
ACID:原子性、一致性、隔离性、持久性。

一致性原则
XA协议:准备 -> 提交(具有阻塞、协调者单点、脑裂等缺点);
XA三段协议:询问 -> 准备 -> 提交;
TCC:try -> confirm / try -> cancel 锁定 -> 确认/释放;
最终一致性:查询、补偿、定期校对、可靠消息、缓存一致性。

超时处理
原则:谁超时谁处理,即接口调用超时,查询+补偿;接口调用成功后,接口内部服务超时须自己补偿。

  • 两状态同步接口(OK/ERR):接口调用超时,调用方查询+补偿;接口内部服务超时,内部快速失败+冲正;
  • 三状态同步接口(OK/ING/ERR):接口调用超时,调用方查询+补偿;接口内部服务超时,返回处理中,内部查询+补偿到成功,调用方轮询;
  • 异步接口:接口调用超时,调用方查询+补偿;接口内部服务超时,内部查询+补偿到成功,回调通知;接口回调通知超时,指数补偿回调;
  • 消息队列:生产者发送超时,持久化可靠发送+幂等消费;消费者消费超时,消息处理完偏移量增加。

缓存
缓存分片:客户端分片(redic)、代理分片、集群分片(一致性Hash);
缓存穿透:缓存空值、有效Key判断;
缓存并发:分布式锁、本地锁、软过期(业务过期);
缓存雪崩:错峰失效。

三、画好架构图

4+1视图

场景视图:参与者与功能用例关系,用例图表示;
逻辑视图:功能拆解后的组件边界及关系,组件图和类图表示;
物理视图:软件与硬件映射关系,部署图表示;
处理流程图:各组件流程与数据交互,时序图和流程图表示;
开发视图:模块划分及包组成,包图表示。

C4视图

语境图:梳理待建设系统用户和高层次依赖,在中间画出自己的系统,周围是用户与其它交互系统。


C4语境图

容器图:展开语境图待建设系统,用框图表示,可包含名称、技术选择、职责、框图间交互,明确外部系统边界。


C4容器图

组件图:展开某个容器,描述其内部模块组件组成、关系。


C4组件图

类图:同UML静态图,此处不再展开。

结束语

技术服务业务,如何在技术选型与实现上结合实际情况做最优的取舍,才是每位工程师的价值所在。

参考资料

《亿级流量网站架构核心技术》
《面向对象技术及UML教程》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,681评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,710评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,623评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,202评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,232评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,368评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,795评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,461评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,647评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,476评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,525评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,226评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,785评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,857评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,090评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,647评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,215评论 2 341