可伸缩的Web应用碎碎念

概念

什么是伸缩性

伸缩性是指系统可以根据需求和成本调整自身处理能力的一种能力。伸缩性常常意味着系统可以改变自身的处理能力以满足更多用户访问、处理更多数据而不会对用户体验造成任何影响。
主要从以下几个方面度量:

  • 处理更多数据
  • 处理更高的并发
  • 处理更高频次的用户交互

性能更多的是衡量系统处理一个请求或者执行一个任务需要花费多长时间,而伸缩性则更关注系统是否能够随着请求数量的增加(或减少)而相应地拥有相适应的处理能力。

伸缩性方案

有两种不同的伸缩性方案:垂直伸缩和水平伸缩。

垂直伸缩

通过升级硬件和网络吞吐能力可以实现垂直伸缩。
方案:

  • 通过使用RAID(独立冗余磁盘阵列)增加I/O吞吐能力。
  • 通过切换到SSD改善I/O访问速度。
  • 通过增加内存减少I/O操作。
  • 通过升级网络接口或者增加网络接口提高网络吞吐能力、
  • 更新服务器获得更多处理器或者更多虚拟核。

优缺点:

  • 实现简单。不需要重构任何东西。
  • 成本制约。当达到某个点以后,成本会很高。
  • 垂直伸缩是有极限的。

缓存和CDN

水平伸缩

水平伸缩是指通过增加服务器提升计算能力的一类架构方法。水平伸缩可以克服垂直伸缩带来的地位计算成本随着计算能力增加而迅速飙升的问题。

在水平伸缩架构中,每一种服务器角色都可以通过增加服务器进行扩容伸缩。构建水平伸缩系统先从那些容易的地方做起,比如Web服务器、缓存;暂缓那些难以做到的地方,比如数据库和其他持久层。

边缘缓存(edge-cache):一种距离用户较近的HTTP缓存服务器,便于部分缓存用户的HTTP流量。

应用架构概述

应用架构是关于业务模型的演化。

基础架构高层概览

将领域模型放在应用架构的核心,我们确保各种组件围绕这个核心展开,服务于这个业务,而不是其他什么东西。

前端

前端的主要职责是成为用户的接口,用户通过网页、移动APP或者Web服务器调用完成和应用的交互。无论实际交互方式是什么,前端应该是介于公开接口和内部服务调用之间的处理层,是系统向用户呈现的功能展示,因此不该是整个系统的核心或者重点。前端应该尽量地保持简单(业务逻辑简单)。

业务逻辑只存在于Web服务层,因此我们可以避免视图和业务强耦合带来的问题。

前端不应该关心数据库或第三方服务。但是,允许前端组件发送消息给消息中间件以及使用缓存等。

Web服务

SOA:面向服务的体系架构。是一种以低耦合和高度自治的服务为中心的软件架构,主要目标是实现业务需求。SOA倾向于所有的服务都基于约定由清晰的定义,并且都是用相同的通信协议。不管用什么样的技术或者协议,只要你的服务是松耦合的并解决一组特定的细分领域的业务需求就可以了。

其他架构:分层架构、六角形架构和事件驱动架构等。

无论使用什么样的架构,目的都是讲系统切分成更小的独立的功能单位。这样做的目的是构建更高层次的抽象以实现隐藏复杂性、减少依赖,各部分独立伸缩,以及每个部分并行开发。

支撑技术

支撑技术有:消息队列、应用缓存、主数据存储、搜索引擎等。这些支撑技术应该是一种即插即用的扩张组件,更换这些组件的连接就能够切换组件,保证整体架构不受影响。