万能钥匙-中间层
最近小菜刀重读《程序员的自我修养》,里面提到过一句名言:计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决。
上述名言概括了计算机系统软件体系结构的设计要点,整个体系结构从上到下都是按照严格的层次结构设计的。不仅是计算机系统软件整个体系是这样的,体系里面的每个组件比如操作系统本身,应用程序、软件系统甚至很多硬件结构都是按照这种层次的结构组织和设计的。
下面,本文举例带领大家体会这种中间层理念。
01
计算机软件体系结构
![](/
如图所示,每层之间都通过接口进行交互。除了硬件和应用程序,其他都是所谓的中间层,每个中间层都是对它下面层的包装和扩展。正是因为这些中间层的存在,才使得应用程序和硬件之间保持相对的独立。
例如虚拟机技术,其就是在硬件和操作系统之间增加了一层虚拟层,使得一个计算机可以同时运行多个操作系统;又如当前大火的Docker容器技术,是在操作系统和应用之间增加的一层虚拟层,为应用提供一致的运行环境。
这就是层次结构带来的好处,在尽可能少改变甚至不改变其他层的情况下,新增加一个层次就可以提供前所未有的功能。
02
计算机存储体系结构
![](/
** **
一个典型的寄存器文件只能储存几百字节的信息,而主存里可存放几十亿字节,但是,计算机处理器从寄存器文件中读取数据比从主存中读取几乎要快100倍,而且随着半导体技术的进步,这种差距还在持续增大。
于是,系统设计者在主存和寄存器之间增加了中间层:高速缓存。其利用局部性原理,即程序具有访问局部区域里的数据和代码的趋势。让高速缓存里存放可能经常访问的数据,大部分的内存操作都能在快速的高速缓存中完成。这样就很好的解决了主存和寄存器之间的性能差距问题。
其实,不止在主存和寄存器之间,在整个存储器结构中,我们都可以把上一层的存储器作为低一层存储器的高速缓存。如上图所示,寄存器文件就是L1的高速缓存,L1是L2的高速缓存,L2是L3的高速缓存,L3是主存的高速缓存,而主存又是磁盘的高速缓存,在分布式文件系统中,本地存储就是存储在其他远程系统中磁盘上的高速缓存。
通过这种高速缓存中间层的设计思想,把整个存储体系作为了一个大的存储器池。结果是,其成本与层次结构底层最便宜的存储设备相当,但是却以接近于层次结构顶部存储设备的高速率向程序提供数据。
03
缓存数据库
![](/
网站访问数据的特点一般会呈现“二八定律”,即80%的业务访问集中在%20的数据上。例如:百度搜索热词,新浪微博热门事件等,往往这些都是一小部分数据(热数据),大多数数据比较少被访问(冷数据)。
如果网站对冷热数据都通过传统RDS数据库处理,例如MySQL,那么在当该网站的访问量达到一定规模时,数据库的IO操作很容易进入性能瓶颈。因此,引入了中间层即内存数据库,作为热数据的缓存。因为内存数据库,例如Redis,它们的数据运行在内存当中,IO响应会非常的快,所以可以很好地解决上述问题。
04
中间件技术
中间件可能是诠释中间层理念的最佳实践,以下是维基百科给出的中间件示意图。
![](/
但中间件其实是一个很宽泛的概念,我国学术界一般认可的定义是:中间件是指网络环境下处于操作系统、数据库等系统软件和应用软件之间的一种其连接作用的分布式软件,主要解决异构网络环境下分布式应用软件的互连与互操作问题,提供标准接口、协议、屏蔽实现细节,以提高应用系统易移植性(北京大学梅宏)。
常见的有消息中间件、数据库中间件、web中间件,容器等。以目前很火的MQ消息中间件为例,它的出现能够帮助系统对用户请求异步处理、应用解耦和流量削峰等。
05
总结
“计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决”。中间层思想的实践在计算机科学领域中无处不在。除上述之外,代理服务、池技术、网络协议、以及现在热炒的数据中台等,无一不在践行着中间层理念。如果你现在的项目中,交互的两者存在某些不可避免的障碍,不妨考虑是否可通过引入新的中间层解决该问题。
** **
参考: