Scalable系统设计
- 伸缩自如是Java一大独特优势。
- 全球最大的微博网站Twitter 从Ruby的Rails移植到Java,以及LinkedIn和Ebay都采取Java架构,这些成功经验都说明Java独特的可伸缩性。
基本原理
- Scalable != performance
- 可伸缩性是高性能,低成本和可维护性等诸多因素的综合考量。水平伸缩,通过廉价的服务器实现分布式。
- 性能是指单用户访问时系统的快慢,当负载超出服务器可承受能力之外后急剧下降。垂直伸缩。
性能和可伸缩性
- 什么是性能问题?
如果你的系统对于一个用户访问还很慢,那就是性能问题;
- 什么是可伸缩性问题?
如果你的系统对一个用户来说是快的,但是在用户不断增长的高访问量下就慢了。
伸缩性方案
- scale up 垂直伸缩: 升级到更强大的服务器(多CPU 昂贵大中型机)。
- Scale out 水平伸缩: 增加更便宜的机器。
vertical scaling 垂直伸缩
- 垂直伸缩==集中式计算。
- 有系统最大容量限制,有天花板。
- 垂直伸缩昂贵,成本高,为了增加处理能力,需要巨资采购,推动GDP。
把握两种平衡
- 评价指标:延迟性Latency(响应时间)、吞吐量Throughput以及一致性。
- 伸缩性目标:用可接受的延迟获得最大的吞吐量。(延迟性 vs 吞吐量)
- 可靠性目标:用可接受的延迟获得数据更新的一致性,(延迟性 vs 一致性) 。
可用性(Availability)
- 客户端发出的每次请求必须有响应,响应时间长短以不影响用户体验为标准。
- 可用性或延迟性测试。
可伸缩性设计
- 状态的scalable:状态是指保存数据的地方,如内存或数据库
- 无状态的scalable:侧重行为计算方面,类似提升CPU处理能力。
状态的可伸缩性方案
- Partitioning 分区
- HTTP Caching CDN:静态页面缓存
- Distributed Caching 分布式缓存
- RDBMS Sharding
- NOSQL
- Data Grids 数据网格 集群
- Concurrency 并发模式
分区:服务器农场
- 如果有大量并发请求,可以在一个负载平衡器后加多台服务器。
- 应用程序本身必须要求是无态的,能被无条件的分发。
- 更有效的是使用云计算,这样应用程序有一个统一的API调用,服务器台数可以不断加入,应用程序丝毫无影响。
- 不要使用Session,可使用Application
更多伸缩性scalable