关于可伸缩性, Jonas Bonér 最近在第一届 React Conference 上的演讲中指出,要使系统真正地可伸缩,我们必须将访问局部性( locality of reference )最大化,同时将竞争( contention )最小化。
Jonas 是 Akka 项目的创建者, Typesafe 的 CTO。他认为,通过使用无共享架构( share nothing architecture ),并基于事件驱动基础设施构建( event-driven foundation ),我们可以编写真正可伸缩的系统。
Jonas 将性能定义为一个系统能够提供特定响应时间的能力,主要有三个方面:延迟、吞吐量和可伸缩性。他对可伸缩性的定义是,系统能够维持该响应时间的能力。
纵向伸缩(Scale up)意味着我们需要以有效的方式利用多核架构,而且在 Jonas 看来,干净的代码和良好的实践对实现纵向伸缩至关重要——使用做一件事和简单逻辑的小方法。有两个方面非常重要:最大化访问局部性,确保数据保存在处理上下文的本地极为重要;竞争是可伸缩性的第二个杀手,例如过度使用同步锁。
一个一般性的原则是不要阻塞。通过使用异步,完全拥抱异步消息传递,我们将得到一个设计上支持并发的系统。不同于处理低层次的线程与锁,我们可以将抽象级别提高到处理流经系统的事件。
Jonas 认为,从异步编程入手,一开始碰到的本质复杂性(essential complexity)的冲击会更高一些,但这种复杂性通常比较稳定,伴生的偶发复杂性非常低。而在同步系统中,一开始会感觉很熟悉,只有较低的本质复杂性,但随着系统的成长,很容易失控,我们可能会沉没在使用共享互斥状态和紧耦合的系统所伴生的偶发复杂性中。
要真正地可伸缩,我们需要一种方式来向系统中添加资源,水平伸缩(scale out)就是关于管理弹性、添加节点或资源的。
按需伸缩是一个重要因素,有效利用集群云计算架构,能够在线添加资源,从而支持我们的应用对负载的增减做出反应。
Jonas 的结论是,通过坚守那些长期以来已经证明有效的核心原则,我们可以编写真正可伸缩的系统。
查看英文原文: Scalability in a Reactive World
评论