写在前面
对于 Web 服务而言,提升可扩展性的主要途径是将耗时的同步工作改成异步处理,从而允许将这些工作“外包”给多个 Worker 去做,或者提前完成能够预知的部分
那么,异步机制与可扩展性有什么关系?
这要从(异步)并行处理的优势说起
一.串行、并发与并行
可扩展性,意味着能通过向系统添加资源的方式应对不断增加的工作量
对于多个任务,一般有 3 种执行策略:
-
串行:一个接一个地同步执行,总耗时为所有任务之和
-
并发:多 CPU/多核并发执行,总耗时取决于最慢的任务耗时
-
并行:异步并行执行,总耗时同样取决于最慢的任务耗时
试想,如果工作量持续增长,串行模式的延迟将会越来越大,而且无法通过加资源来解决,可扩展性无从谈起
并发模式虽然可以通过加 CPU 来应对更多的工作量(即纵向扩展),但很快就会遭遇瓶颈,要么达到顶配,要么耗光预算,可扩展性也不是很好
并行模式下,由于任务能够异步执行,我们可以加任意多的 Worker 来分担工作量,可扩展性良好。并且,与并发模式相比,异步处理是非阻塞的(无需等待执行结果,单 CPU/单核就足够了),意味着在(Worker)执行任务的同时,系统仍然能够轻松响应用户请求
因此,相比之下异步(并行)可扩展性最高
二.异步的意义
除了可扩展性方面的优势外,异步更多的意义在于:
-
可打断/可暂停:允许分片执行,而不必一次做完
-
可调度:允许更细粒度的时间管理,比如闲时主动执行、甚至离线执行
-
并行的可能性:异步返回结果,意味着可以交给别人、甚至交给一支军队来做
-
解耦生产者和消费者:把 Worker 分离出去,使之能够独立扩展,比如只加 Woker 不加 Web Server,类似于分离 Web 层和应用层
所以,React 从同步的 Stack reconciler 改为 Fiber reconciler,也具有这些意义:
既然任务可拆分(只要最终得到完整 effect list 就行),那就允许并行执行(多个 Fiber reconciler + 多个 worker),首屏也更容易分块加载/渲染(vDOM 森林)
(摘自[完全理解 React Fiber](/articl
(试读结束,购买后阅读全文)
暂无评论,快来发表你的见解吧