话说多面,在线上面试平台中的水平伸缩平台咋样

Reactor模式(反应器设计模式)是一種基于事件驱动的设计模式,在事件驱动的应用中将一个或

Larson的文章感觉很有价值。作者分享了他在Yahoo!与Digg收获的设计可伸缩系统的架构经验在我过往的架构经验中,由于主要参与开发企业软件系统这种面向企业内部的软件系统通常不会有太大的负载量,太多的并发量因而对于系统的可伸缩性考虑较少。大体而言只要在系统部署上考虑集群以及负载均衡即可。本文给了我很多启发现把本文的主要内容摘译出来,并结合自己对此的理解

Larson首先认为,一个理想的系统对于容量(Capacity)的增长应该與添加的硬件数是线性的关系。换言之如果系统只有一台服务器,在增加了另一台同样的机器后容量应该翻倍。以此类推这种线性嘚容量伸缩方式,通常被称之为水平伸缩平台伸缩“Horizontal Scalability”

在设计一个健壮的系统时,自然必须首要考虑失败的情况Larson认为,一个理想的系統是当失去其中一台服务器的时候系统不会崩溃。当然对应而言,失去一台服务器也会导致容量的响应线性减少这种情况通常被称為冗余“Redundancy”。

无论是水平伸缩平台伸缩还是冗余都可以通过负载均衡来实现。负载均衡就好似一个协调请求的调停者它会根据集群中機器的当前负载,合理的分配发往Web服务器的请求以达到有效利用集群中各台机器资源的目的。显然这种均衡器应该介于客户端与Web服务器之间,如下图所示:

本文提到了实现负载均衡的几种方法其一是Smart Client,即将负载均衡的功能添加到数据库(以及缓存或服务)的客户端中这是一种通过软件来实现负载均衡的方式,它的缺点是方案会比较复杂不够健壮,也很难被重用(因为协调请求的逻辑会混杂在业务系统中)对此,Larson在文章以排比的方式连续提出问题以强化自己对此方案的不认可态度:

引入缓存所带来的问题是如何保证真实数据与緩存数据之间的一致性。这一问题通常被称之为缓存失效(Cache Invalidation)从高屋建瓴的角度来讲,解决这一问题的办法无非即使更新缓存中的数据一种做法是直接将新值写入缓存中(通常被称为write-through cache);另一种做法是简单地删除缓存中的值,在等到下一次读缓存值的时候再生成

整体洏言,要避免缓存实效可以依赖于数据库缓存,或者为缓存数据添加有效期又或者在实现应用程序逻辑时,尽量考虑避免此问题例洳不直接使用DELETE FROM a WHERE…来删除数据,而是先查询符合条件的数据再使得缓存中对应的数据失效,继而根据其主键显式地删除这些行

这篇文章還提到了Off-Line的处理方式,即通过引入消息队列的方式来处理请求事实上,在大多数企业软件系统中这种方式也是较为常见的做法。在我撰写的文章《》中较为详细地介绍了这种架构。在引入消息队列后Web服务器会充当消息的发布者,而在消息队列的另一端可以根据需要提供消费者Consumer如下图所示。对于Off-Line的任务是否执行完毕通常可以通过轮询或回调的方式来获知。

为了更好地提高代码可读性可以在公开嘚接口定义中明确地标示该任务是On-Line还是Off-Line。

引入Message Queue可以极大地缓解Web服务器的压力,因为它可以将耗时较长的任务转到专门的机器上去执行

此外,通过引入定时任务也可以有效地利用Web服务器的空闲时间来处理后台任务。例如通过Spring Batch Job来执行每日、每周或者每月的定时任务。如果需要多台机器去执行这些定时任务可以引入Spring提供的来管理这些服务器。Puppet提供了可读性强的声明性语言来完成对机器的配置

对于大数據的处理,自然可以引入Map-Reduce为整个系统专门引入一个Map-Reduce层来处理数据是有必要的。相对于使用SQL数据库作为数据中心的方式Map-Reduce对可伸缩性的支歭更好。Map-Reduce可以与任务的定时机制结合起来如下图所示:

Larson认为,大多数系统都是Web应用直接与数据库通信但如果能加入一个平台层(Platform Layer),戓许会更好

首先,将平台与Web应用分离使得它们可以独立地进行伸缩。例如需要添加一个新的API就可以添加新的平台服务器,而无需增加Web服务器要知道,在这样一个独立的物理分层架构中不同层次对服务器的要求是不一样的。例如对于数据库服务器而言,由于需要頻繁地对磁盘进行I/O操作因此应保证数据库服务器的IO性能,如尽量使用固态硬盘而对于Web服务器而言,则对CPU的要求比较高尽可能采用多核CPU。

其次增加一个额外的平台层,可以有效地提高系统的可重用性例如我们可以将一些与系统共有特性以及横切关注点的内容(如对緩存的支持,对数据库的访问等功能)抽取到平台层中作为整个系统的基础设施(Infrastructure)。尤其对于产品线系统而言这种架构可以更好地為多产品提供服务。

最后这种架构也可能对跨团队开发带来好处。平台可以抽离出一些与产品无关的接口从而隐藏其具体实现的细节。如果划分合理并能设计出相对稳定的接口,就可以使得各个团队可以并行开发例如可以专门成立平台团队,致力于对平台的实现以忣优化

我要回帖

更多关于 水平伸缩平台 的文章

 

随机推荐