为什么RESTful微服务和异步编程是一种趋势?

从Gilt迁移到Scala以及Paypali迁移到Node.js,我认为原因有两个,这两个代表了现在和未来的一种趋势:

1. Node.js和Play框架倡导的微服务。
微服务这种架构使得维护拓展方便,打破了原来Java和Rails的铁板一块的整体式系统,这种微服务架构特点是RESTful接口+微服务。而传统Java和Rails是一种“MVC+服务"传统架构,为什么“MVC+服务”容易导致铁板一块的系统呢?MVC是一种面向前端的模式,当你使用这种组合时,你的重点就不免放在MVC的实现上,“服务”变成一种附加的次要的为MVC服务的架构,而轻量的RESTful接口使得我们重点又会到“服务”上,我们可以专注将我们的服务设计成一种微服务。

从可测试角度看,MVC架构因为比RESTful多了一个页面视图,也就是直接绑定了终端页面,或者说绑定了前端页面,这就难于方便进行后端业务逻辑的测试,见要么TDD死,要么后端MVC死,而对RESTful的URL进行测试,或者对微服务进行测试都是非常轻量方便易观察的,不和具体框架绑定,基本都是纯粹业务。

2. Node.js和Play框架倡导的异步Reactive编程。
异步编程最大的特点是吞吐量大,延迟小,因为没有堵塞,这就容易挖掘现有硬件和操作系统等底层系统的潜力,同样的成本投入,异步系统要比传统铁板一块的同步系统更能应付爆发式涌潮的瞬间大流量。

基于异步的Reactive编程引入事件驱动概念,是一种自发式Reactor,能够将原来在一个请求中完成的繁重工作分发成并行等多任务方式完成,大大提高了系统的可扩展性可伸缩性,当一台服务器硬件已经挖掘到极致,也就是说这种垂直扩展已经完全挖掘了多核CPU的潜力,可以再通过水平扩展假设多台服务器提升整个系统的处理能力。

这种垂直和水平立体式的扩展能力完全颠覆了传统Rails和Java Spring的顺序编程模型,因为顺序编程方式很容易导致同步堵塞式系统,具体可参考:http://www.jdon.com/46372,这个贴虽然使用了Node.JS作为异步编程案例说明,同样也适合Scala的Play框架和Akka的异步Reactive编程。

总之,微服务体现了面向对象的细粒度松耦合原则,发挥了设计上的优势;而异步编程则体现面向函数编程的精确能力,发挥了性能上的优势。一个架构如果兼顾设计与性能两者能不是一种优秀的架构吗?

[该贴被banq于2014-05-19 12:50修改过]