Vert.x是在JVM上构建响应式应用(reactive application)的工具集。Vert.x是事件驱动的和非阻塞的,这意味着应用程序可以使用少量内核线程来处理很多并发。本文基于Vertx3.0版本讲解。
Vert.x特性
响应式的(Responsive):一个响应式系统需要在合理的时间内处理请求。
弹性的(Resilient):一个响应式系统必须在遇到异常(崩溃,超时, 500 错误等等)的时候保持响应的能力,所以它必须要为异常处理而设计。
可伸缩的(Elastic):一个响应式系统必须在不同的负载情况下都要保持响应能力,所以它必须能伸能缩,并且可以利用最少的资源来处理负载。
消息驱动(Message driven):一个响应式系统的各个组件之间通过 "异步消息传递" 来进行交互。
多种语言支持:只要能运行在JVM上的语言,基本都支持。
简单的并发模型:就像写单线程代码一样简单,多线程并发由Vertx控制。
集群支持:在同一个Vertx集群,各个Verticle 实例间可以通过Event Bus通信。同时也支持跨进程的TCP Event Bus。
Vertx使用Netty4处理所有的网络IO。
概念模型
通常,一个进程会创建一个Vert.x实例,Vert.x负责部署Verticle和管理运行时资源。
Verticle实例之间可通过EventBus发送异步消息来通讯,Verticle中的Handler处理发送来的消息。
在集群模式下,通过ClusterManager可发现远程Verticle,EventBus从而可将消息路由到远程Verticle。
架构模型
Vertx的AcceptorEventloopGroup只有1个AcceptorEventloop,即通过1个线程监听所有客户端的连接,连接建立后会交由VertxEventLoopGroup中的一个EventLoop来处理。
Vertx可以将server(HttpServer,TcpServer,UdpServer)部署在多个verticle实例中,这些verticle实例共享这个server。AcceptorEventloop监听和处理连接事件,但NIO读写事件的触发和处理都在VertxEventLoopGroup的EventLoop中执行。
每部署1个verticle实例,都会为该verticle创建1个执行context(每个context都绑定一个EventLoop和Handler处理线程),传入的业务request事件都在此context对应的Handler处理线程中执行。
对于标准模式的verticle,context对应的Handler处理线程就是该verticle绑定的EventLoop线程;对于worker模式的verticle,context对应的Handler处理线程是worker线程。因此,对于标准模式verticle,编解码handler、request handler都在context绑定的EventLoop中执行;对于worker模式verticle,编解码handler会在context绑定的EventLoop中执行,但request handler会在context对应的worker线程中顺序的执行。
任何verticle中通过excuteBlocking方法提交的任务,都会由worker线程池执行;
当部署的verticle数量小于VertxEventLoopGroup的EventLoop数量时,会造成部分EventLoop空闲;当部署的verticle数量大于VertxEventLoopGroup的EventLoop数量时,多个verticle可能绑定同一个EventLoop。