深入浅出 Vert.x 架构

用户头像
dinstone
关注
发布于: 2020 年 08 月 22 日

Vert.x是在JVM上构建响应式应用(reactive application)的工具集。Vert.x是事件驱动的和非阻塞的,这意味着应用程序可以使用少量内核线程就可以处理很多并发。本文基于Vertx3.0版本讲解。

Vert.x特性



  • 响应式的(Responsive):一个响应式系统需要在合理的时间内处理请求。

  • 弹性的(Resilient):一个响应式系统必须在遇到异常(崩溃,超时, 500 错误等等)的时候保持响应的能力,所以它必须要为异常处理而设计。

  • 可伸缩的(Elastic):一个响应式系统必须在不同的负载情况下都要保持响应能力,所以它必须能伸能缩,并且可以利用最少的资源来处理负载。

  • 消息驱动(Message driven):一个响应式系统的各个组件之间通过 "异步消息传递" 来进行交互。

  • 多种语言支持:只要能运行在JVM上的语言,基本都支持。

  • 简单的并发模型:就像写单线程代码一样简单,多线程并发由Vertx控制。

  • 集群支持:在同一个Vertx实例中各个Verticle 实例间可以通过Event Bus通信。同时在同一个Vertx集群也支持跨进程的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。



用户头像

dinstone

关注

还未添加个人签名 2008.11.12 加入

还未添加个人简介

评论

发布
暂无评论
深入浅出Vert.x架构