Vert.x是最新的企业级开发的平台框架,它旨在解决多年来传统的企业级平台如JavaEE、MS.NET、PHP等无法处理大量高并发的连接请求问题,并在基于Node.js高性能的基础上,解决Node.js编程复杂的难题应运而生的。以下vert.x平台的核心特性注定其将在未来移动应用和企业级应用中全面取代传统的服务器平台,成为软件市场的佼佼者。
1.多样性( Polyglot)
多样性是指Ⅴert.x同时支持多种语言编程,目前支持Java、 JavaScript、 CoffeeScript、Ruby、 Python or Groovy,未来新版本将支持 Scala和 Clojure。在一个Vert.x的应用项目中,可以混合使用以上语言编写Ⅴert.x的应用组件,这些使用不同语言编写的组件可以相互调用,这在其他应用平台是无法实现的。例如Node.js只支持 JavaScript, Java EE服务
器平台只支持Java,PHP平台只支持PHP语言。
任何语言都不是万能的,每种语言都有自己的强项和特性,都有自己特别适合的应用领域。在编写一个企业级应用项目中,不同的业务处理采用最适合的语言编程,这个程序开发人员的梦想目标,现在由Vert.x实现了。
2.简单性( Simplicity)
Vert.x采用单一组件结构设计,即 Verticle,所有业务功能都使用 Verticle这种单一的组件编程完成,克服以往应用框架和平台包含众多类型的组件模式,使得开发人员能极快适应Vert.x编程,加快项目的开发速度。
vert.x中所有的 Verticle组件都是完全解耦合的,任何组件之间不能直接调用,只能通过在Vert.x的事件总线上发送事件来完成,彻底解决了传统应用系统中管理组件间相互依赖的复杂性,最终使得Ⅴert.ⅹ应用编程极其简单高效vert.x使用单线程事件驱动的异步工作模式,编写Vert.x组件时,不需要考虑复杂的多线程编程难题,并不需要关注线程之间的调用、同步、加锁等繁琐处理编程,简化了编程代码,提高了编程效率
3.可扩展性( Scalability)
Vert.X的设计是基于 Actor模型的,你可以将一个或多个的程序放入到容器中去执行,可以很轻松地进行部署和升级,很方便地对应用进行水平扩展,动态升级。
4.并发性( Concurrency)
在处理多用户并发连接请求时,Vert.x摒弃了传统的多线程、同步工作、阻塞模式,而 采用简单的单线程、异步工作、非阻塞模式,通过单线程内的事件驱动实现并发处理。
在多线程模式下,每个客户连接请求,服务器都会启动一个新的线程来处理此客户的请求处理。 服务器的CPU内核是有限的,通常是双核、4核及8核, 要支持多于CPU内核的线程处理,需要操作系统 采用某种调度机制进行线程的切换,而每个线程内都需要保存自己的变量和数据,要求在切换处理线程时,需要保存和还原原来的工作场景,这些都会浪费巨大的CPU和内存资源。当线程过多时,导致处理性能急剧下降,因此多线程模式的平台无法支持大量并发连接请求, 产生了著名的C10K+问题,当并发连接超过10000+时使用传统技术会引发暂停。
当今移动互联网普及,用户大量使用手机访问应用系统,都会产生超大量用户的并发连接请
求,如微信、滴滴打车、QQ等。使用传统的服务器,如支持 Java EE的 Tomcat服务器,在请
求超过1000个并发请求时就会停顿,根本无法支持超过10万的情况。
Vert.X内置线程池机制,并使用非阻塞机制进行多用户并发连接请求,能在使用极
少线程情况下处理大量的并发连接请求,这一点通过前面与Node.js的性能比较可以
看出。
5.异步编程模型( Asynchronous Programming Model)
vert.x通过提供一整套的异步编程API实现异步编程模型,在Vert.x中所有的请求处理都是通过注册事件监听处理器机制完成的。
编程TCP处理服务器 Verticle,通过注册TCPSocket的数据到达事件监听器, 实现数据到达后的回调处理,而不是采用一直等待数据读取的阻塞模式,实现的是非阻塞的异步工作模式类似的编程;如:事件总线上的事件处理,HTTP的请求处理,WebSocket的数据传输,各种连接的打开和关闭的通知,定时器的定时处理等都采用相同的异步工作模式。
通过这种异步工作模式,Vert.x可以实现在使用很少的操作系统线程情况下并发运行许多 Verticle实例对象,进而支持大量高并发的请求处理,这是vert.x定位在开发高并发移动应用和企业级应用的关键所在。
6.事件循环( Event Loop)
vert.x的核心运行机制是事件循环,当vert.x实例启动后,vert.x框架在每个CPU的内核创建一个事件循环线程。此事件循环线程永不结束,它不断监听出现的各种事件, 如:事件总线的事件到达,WebSocket上的数据接收,HTTP上的请求到达,HTTP响应结束,定时器触发等等,并把事件分发到注册了监听此事件的 Verticle,再继续监听其他的事件,如此反复直到vert.x实例停止。
当一个普通的 Verticle(非 Worker verticle)部署时,vert.x容器会自动将 Verticle分配到一个事件循环线程上,而且每个事件循环线程可以分配无数个普通 Verticle,并把将来监听的事件分发给这些 Verticle; Worker Verticle由于会产生阻塞,vert.x引擎不会把它分配到事件循环线程上,而是使用单独的线程池运行机制。在Vert.x应用开发时,除非特殊情况如使用JDBC操作数据库,使用Java传统的I/O流读写文件,一般不要使用 Worker Verticle。
7.伸缩性( Scaling)
vert.x在设计之初就充分考虑了当应用的使用者逐渐增多而出现的高并发请求处理
的性能问题,尤其是移动互联网普及之时,超大量移动终端同时请求已成常态,如手机微信、
移动12306铁路订票系统、手机淘宝等。
传统的企业级平台由于采用多线程、同步处理模型,对每个请求采取创建单独线程,而
每个线程都需要一定的内存和CPU资源,当并发请求过多时,只能采用加大硬件投资增加
服务器集群的方式,来适应高并发请求对超大量线程的需要;
vert.x的单线程、非阻塞、异步处理的工作模式,在设计时就是为了能满足大量高并发
请求的需求。
出自清华大学出版社《Vert.x应用开发实例教程》吕海东、张坤 编著