Reactive-Vertx-Core(1) Vert.x核心组件概览
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" 转载请保留原文链接及作者。