一些概念
有合理的办法应对系统的增长(数据量、流量、复杂性)
一个良好适配应用的可扩展架构,是围绕着假设(assumption)建立的:哪些操作是常见的?哪些操作是罕见的?这就是所谓负载参数。如果假设最终是错误的,那么为扩展所做的工程投入就白费了,最糟糕的是适得其反。
数据库、缓存、依赖的第三方、复杂均衡、交换机带宽都是系统扩展时需要考虑的点
分层
首先要分层,分层是实现扩展的必要条件;分了层才能让系统有更好的可扩展能力;
我们将系统分为如下几层:
接入层
主要负责负载均衡,要求负载均衡策略的时间复杂度要尽量简单,追求$O(lgn)$的时间复杂度,最坏不能超过$O(n)$。对于更坏时间复杂度的均衡策略,性能上会扛不住。
应用层
业务层:按照业务拆分、按照重要性拆分(轻重分离,核心、非核心)、按照请求来源(客户端、web、内网等)—这个跑偏了,这些点主要服务于可用性。
这里侧重点在于无状态,我们一定要确保我们的服务无状态。
存储层
存储层做扩展会更麻烦一些。
一般情况下,要求我们根据业务量提前估计好存储容量。根据计算出来的总的存储量,提前做足够的数据分片。
换言之,对于存储层,我们的一种思路是:早做扩展,以确保将来不做扩展;
另外一种思路是,添加必要的路由层(数据访问路由层)或者路由算法(数据表倍增法),来确保将来的扩展对上层不可见。
manager层
- 抽象service层可能提供的一些原子能力
- 封装对第三方接口的调用