千里之行之思想

系统演进思想

  • 分治
  • 重构
  • 经济、简单之约束处理

分治

系统发展到一定的程度,或者初期,我们要及时对系统采取分治的思想。系统分治,首先必先分层。但是分层的层次也不应该太多,我们不能为了分层而分层。层次太多,架构太复杂、性能太差。那我们到底要分几层呢?我们来分析一下系统的基本流程,其流程大致都是这样的:客户端->服务器(CGI)->数据库。从客户端到数据库,我们现有这样的层次观,如图2.0所示。
这里写图片描述
2.0 基于分层的系统
在电商系统中,我们的服务处理的业务领域是:商品、订单、购物车、用户、促销等。
这么多业务领域,我们是糅合在一起,还是采用分割的思想,进行领域建模?糅合在一起,导致系统极其臃肿,迁一而动全身,系统升级代价大、风险也大,而且也不容易进行分工协作。因此,我们必须对服务层进行分割、领域建模,这时的系统如图2.1所示。
这里写图片描述
2.1 基于分割、领域建模的系统
很显然,各个领域之间肯定是存在依赖关系的,这时我们必须对领域进行粒度、依赖控制。如果在领域之间进行之间依赖,会是怎么样呢?假如领域A依赖领域B,B又赖领域B,领域C依赖领域A、B。各种依赖导致系统错综复杂。因此,我们要对领域服务做一些粒度控制,对服务分为:流程服务、领域组合服务、领域基础服务、服务网关。
进行这样的服务粒度、依赖管理、控制后,这时的系统架构概貌如图2.2所示。
这里写图片描述
2.2 粒度、依赖管理、控制
通过这样的服务粒度、依赖管理、控制是为了对系统做扁平化管理,同时也为外部服务变化做适配,减少外部变化对内部系统的入侵。
通过分治:分层、分割、领域建模后,这时的系统概貌如图2.3所示。
这里写图片描述
2.3 分治后的系统
但是这样的系统,服务、领域服务随着业务的发展,也会变得越来越多。这时我们该怎么办呢?

重构

对于系统,我们不能一蹴而就,毕其功于一役。好的系统是边生活边重构出来的。
但是重构出来的系统会长成啥样子,可能依赖人的系统审美观念吧。
坚固、效用、情趣
——Marcus Vitruvius(公元前22年),<>
风格是思想的外衣,良好的思想就像是穿着考究的绅士一样更具优势。
——Chesterfield 勋爵(1774)

面对复杂的系统,要再次重构,重构后要成为什么模样?不同的系统架构师有不同的品味,不同的品味的人,重构出来的系统也是不一样。而且重构也受具体的业务驱动影响,重构出来的系统也是为了满足业务需求,不能为了重构而重构。但是无论如何,我们重构的出发点就是为了让系统简单一点、干净一点。
因此我们对2.3的系统,可能会重构成如图2.4所示。
这里写图片描述
2.4 重构后的系统

经济、简单之约束权衡

大到一个复杂系统,小到一个简单系统,都要先设计、再实现,只是不同的系统,需要不同程度的设计。那什么是设计,或者说设计是一种什么活动?

设计是构思、精神(实现)、以及交互的一序列循环活动,是对问题形成计划或模式,运用思维整理或考量,以便后续执行的活动。这代表着:
1)概念性构想的形成;
2)在真实的媒体中实现;
3)在真实的体验中与用户交互。【摘自设计原本】

设计必需运用思维整理或考量,尤其是考量。考量意味着对一件事进行权衡考虑,不断斟酌、反复推敲。设计是天马行空的,还是约束的?天马行空的设计会使任务变得更加困难而非更加简单,因为约束会缩小设计的探索空间。譬如有个客户走到你的跟前说:小伙子,给我设计一个我需要的桌子。这里唯一的约束就是设计出来的桌子需要满足客户的需求,除此之外没有任何约束条件。这个任务貌似很简单,其实是很难的,你要不断探索什么样的桌子是客户需要的?探索空间如图2.5所示。
这里写图片描述
2.5 系统探索空间

随着探索的深入,以及你对客户的需求不断了解,你会发现在形状、材料、美观、成本、期限、功能之间是存在约束的,而你的设计就是权衡这几个约束,在规定的期限内设计出满足客户需要的桌子。
因此,一个良好的设计,就是妥善处理好各种约束的设计,但我们如何处理好各种约束条件呢?譬如我们怎么认为一个桌子是美的。有人认为简单是美,也有人认为相对不简单才是美的。
不管是哪一种观点,系统设计都逃脱不了处理约束关系。
系统的美,就是合理、简单地处理了彼此之间的约束关系。
在处理约束关系,我们可以采用经济策略。经济策略的核心就是经济,即最小投资最大回报。小到一个系统,我们必须用经济策略去处理CPU、内存、I/O、数据拷贝、网络传输的关系;大到一个集群系统我们得处理网络传输、网络带宽、节点负载、节点交互数次的关系。
或许有人会说,既然是经济策略,那一切都按最少的来考虑吧。这个或许是对,或许是不对的。举个例子,假如你要运10顿的沙,运沙方案如下:

方案运量(千克)价格(元)数次(小时)成本
1100010001010000
2500450209000
32502604010400
4100701007000

这四个运沙方案,该怎么选?如果,我们考量的目标只是成本,那么毫无疑问我们会选择方案4;再假如考量的目标只是时间,那么我们会选择方案1;又假如我们考量不仅是成本,还有时间,那么我们则会选择方案2.
因此经济策略,要求在既定的目标约束下做出合理的方案,不存在无目标约束的策略。所以经济策略的第一要素就是确认目标。
在确立好目标后,我们就开始对各个因素进行计算、衡量。举个例子,假如让你设计一个FTP程序,传输大文件(1G),那你该如何设计出传输最快的FTP程序?对于FTP程序设计,我们理出了目标:快速传完用户下载的大文件。但是,好像光有目标,我们也无从下手。
因此经济策略,第二要素就是:认识约束因素、理清关键约束因素。
那FTP程序,有哪些关键约束关系呢?

因素描述
内存使用量FTP 进程最大能够使用多少MB的内存。
CPU利用率FTP 最多能够占用多少CPU时间。
I/O BUFFER大小4K/1MB/2MB/…/XMB 的I/O延迟。
用户并发数同时并发下载的用户数量。
线程(进程)数需要开启的线程(进程数),线程(进程)调度时间。
网络传输时间4K/1MB/2MB/…/XMB 网络I/O传输时间。
文件系统不同的文件系统,性能不一样。
硬盘固定是7200转的SATA 硬盘。

有了约束因素,我们仍然无法利用经济策略,但也柳暗花明了。经济策略,就是组合因素,度量出目标,最终选择出一个度量值合理的组合。
因此经济策略,第三要素就是:衡量因素的度量,获取因素的度量值。
但有些因素是很难度量,该怎么办?一般,我们也都是在单一因素的条件下去衡量、计算因素的度量值,即用理想实验方法(可以回忆高中、大学物理实验方法理想实验方法)。
假如,上面线程、(进程)调度时间,很难衡量、计算。那我们唯一的方法,就是通过测试,选出测试方案中最好的方案,或者根据经验选择。
经济策略三要素:目标、因素、度量,是系统设计思考的出发点,也是处理约束关系的出发点。
在设计活动中,我们很难只是为了单一目标而设计,而是为了多个目标而设计。而多个目标,就有必要权衡下,对目标分主次、轻重,然后再对因素进行权衡取舍。
举一个例子,假如我们设计一个系统调用,该系统调用的设计目标:
1、实现功能(正确性)
2、调用者简单(接口简单)
3、实现者简单(实现简单)
那对这样的设计目标,我们该如何取舍? 在“The Rise of ‘Worse is Better’”中有这样的一个例子:
一位MIT的教授一直困恼于Syscall处理时间过长出现中断时如何保护用户进程某些状态,从而让用户进程能继续执行。他问新泽西人,Unix是怎么处理这个问题。新泽西人说,Unix只支持大多数Syscall处理时间较短的情况,如果时间太长出现中断Syscall不能完成,那就会返回一个错误码,让用户重新调用Syscall。但MIT人不喜欢这个解决方案,因为这不是“正确的做法”。
这个例子涉及到两种不同的设计哲学:MIT方法、新泽西方法。那什么是MIT方法,什么是新泽西方法?
MIT方法:
• 简单性:设计必须简单,这既是对实现的要求,也是对接口的要求。接口的简单要比实现的简单更加重要。
• 正确性:设计在任何值得注意的方面都要保证正确。不正确是绝对不允许的。
• 一致性:设计必须保持一致兼容。设计可以允许轻微少量的不简单和不完整,来避免不一致。一致性和正确性同等重要。
• 完整性:设计必须覆盖到实际应用的各种重要场景。所有可预料到的情况都必须覆盖到。简单性不能过度的损害完整性。
新泽西方法:
• 简单性:设计必须简单,这既是对实现的要求,也是对接口的要求。实现的简单要比接口的简单更加重要。简单是设计中需要第一重视的因素。
• 正确性:设计在任何值得注意的方面都要求正确。为了简单性,正确性可以做轻微的让步。
• 一致性:设计不能过度不兼容一致。为了简单,一致性可以在某些方面做些牺牲,但与其允许设计中的这些处理不常见情况的部分去增加实现的复杂性和不一致性,不如丢掉它们。
• 完整性:设计必须覆盖到实际应用的各种重要场景。所有可预料到的情况都应该覆盖到。为了保证其它几种特征的品质,完整性可以作出牺牲。事实上,一旦简单性受到危害,完整性必须做出牺牲。一致性可以为实现的完整性作出牺牲;最不重要的是接口上的一致性。
MIT方法、新泽西方法没有好坏之分,只是对设计目标做了不同的主次取舍而已。
Unix/C开发于1970年前后,那时离1964年刚推出的IBM System/360没几年,软件刚摆脱硬件束缚,能移植到不同的机器上,从而变成了一种可单独出售的产品。新泽西这种“简单实现”的理念,被证明是更有效的。

**坚固、效用、情趣**

——Marcus Vitruvius(公元前22年)[Do Architecture]

好的系统要满足坚固、效用,在两者的基础上满足情趣。系统设计不像做饭,按照菜谱就能做出一顿好饭。虽然我们根据分治、重构的思想进行系统构建,但在构建的过程中,我们如何处理系统内的依赖、约束关系,又如何处理系统之间的依赖、约束关系?这些依赖、约束关系的处理,需要我们去权衡。但是无论如何,我们都是为了把这些关系处理得更经济些、更简单些。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值