一.什么是可扩展性?
Scalability is the property of a system to handle a growing amount of work by adding resources to the system.
可扩展性,意味着能够通过向系统添加资源的方式应对不断增加的工作量。而加资源有两种方式:
对于系统设计而言,可扩展性要求系统能够将加入进来的更多资源(如多核、多机)利用起来
一个用户请求从客户端出发,经过网络传输,达到 Web 服务层,接着进入应用层,最后抵达数据层:
对应到系统设计中的各个逻辑层:
途径的每一层都有其特定的可扩展性模式,
最后形成了如此复杂的系统架构:
其运作机制如下:
其中,许多模式在解决一些问题的同时,又带来了一些新的问题,因此,在系统设计中,大到 CAP 的抉择,小到分发策略的制定,总在不停地进行权衡取舍
至此,系统设计中常用的扩展性模式都已经梳理清楚了
回过头来再看可扩展性:
可扩展性,意味着能够通过向系统添加资源的方式应对不断增加的工作量
单从定义来看,一个系统只要能把加进来的资源利用起来,进而有能力承担更多的工作量,那它就是可扩展的,这也确实是可扩展性的基本要求
然而,实际场景中(商业化背景下),我们对可扩展性提出了更高的要求:
很多时候,无脑加资源确实能解决问题,但对于可扩展性而言,烧钱是可耻的:
Well, you can just throw hardware at the problem which is the thing that’s thrown around our industry a lot. And I think it’s a little bit of a shame, because it is just effectively like burning money.
也就是说,要求系统不仅能利用,而且要尽可能高效地利用加进来的资源,而不只是一味地靠加资源实现线性扩展
而利用率的衡量标准通常是单笔交易的成本(在非交易系统中可能是其它类似的业务指标):
单笔交易成本 = 总成本 / 交易量
其中,成本分为固定成本和可变成本两部分:
因此,在商业化背景下,可扩展性要回答的问题是,加 1 台机器进来,能多支持多少业务量:
A typical question I would ask of anyone is if you add another node to your system how many more units of work or transactions or whatever do you get out of that.
不只是确信加机器能应对更多的工作量,还要精确地知道“更多”是多少,进而优化成本,精益求精