Reactive-Vertx-Core(1) Vert.x核心组件概览

  1. Vertx Core
    1. Vertx
    2. EventLoop
    3. Context

Vertx Core

Vertx

Vertx实例(instance)可以通过静态工厂方法

Vertx vertx = Vertx.vertx();

创建,一个Vertx实例可以用于部署HTTP、TCP Server,client等等操作,可以将Vertx instance看做一个Vert.x Core API 的入口。

EventLoop

Vert.x使用了Reactor模型,通过Event driven的方式,将Events分发到handlers中进行处理,任何event都不会阻塞Eventloop线程,这样Eventloop线程可以一直保持高速分发Events的速度。假设在同一时间有很多HTTP请求到达服务器,Eventloop会将每一个http request分发到handler中处理,比如有10K个Requests,假设服务器想在1s内处理这些requests,那么平均算下来Eventloop必须能在0.1ms内分发完每个event,一旦Eventloop被阻塞,整个服务器吞吐量都会受到极大影响。所以Eventloop绝对不应该被阻塞住,所有交给Eventloop去处理的event都应该是non-blocking(I/O)的方式或者CPU执行时间较短的,这样才能确保每个event得到及时的分发。

而Vert.x不仅仅实现了Reactor模型,还实现了Multi-Reactor模型,也就是说,每个Vertx instance都会有多个Eventloop,默认的设置是Eventloop数量对应CPU核心数量乘以2,在VertxOptions类中可以看到

/**
 * The default number of event loop threads to be used  = 2 * number of cores on the machine
 */
public static final int DEFAULT_EVENT_LOOP_POOL_SIZE = 2 * CpuCoreSensor.availableProcessors();

可以通过setEventLoopPoolSize()方法改变Vertx实例拥有Eventloop的数量。

Context

Context的字面意思是上下文或者环境,在Vert.x中,Context对应的是一次Handler执行过程的执行context。在Context接口中的文档已经说的十分清楚:

当Vert.x将一个事件event分发到handler中或者调用了一个Verticle的启动停止操作方法时,该次执行execution就被关联到了一个Context。

那么Context是用来干什么的呢,Context就是用来管理控制着handlers或者handlers创建的任务执行时的scope和order的。
当使用Vert.x API把event分发到handler时,例如设置一个HttpServer的request handler时,会将该handler的callback和一个context绑定起来,
这个Context就会被用来调度callbacks。如果执行任务当前所在的线程是Vert.x线程的话,那么该任务将复用已经和线程所绑定的context;
如果当前线程不是Vert.x线程,那么就创建一个新的context。

Vert.x线程可以参考VertxThread类,继承了Netty中的FastThreadLocalThread。简略类图如下


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 wshten@gmail.com

文章标题:Reactive-Vertx-Core(1) Vert.x核心组件概览

本文作者:KevinTen

发布时间:2019-12-08, 00:00:00

最后更新:2019-12-08, 14:44:58

原始链接:http://github.com/kevinten10/2019/12/08/Reactive/Reactive-Vertx-Core(1)/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏

csdn zhihu github