Vert.x 源码阅读

VertxImpl

  • sharedNetServers(Map<ServerID, NetServerInternal>)
    • 解决多个Verticle实例监听同一个hostport的问题
    • key为ServerID,当ServerID内的hostport都相同时,代表同一个ServerID
    • 可以参考文档:共享 TCP 服务端

线程相关

ExecutorService

  • VertxImpl#eventLoopGroup(EventLoopGroup)
    • 源于transport的默认实现:Transport#eventLoopGroup(int type, int nThreads, ThreadFactory threadFactory, int ioRatio)
    • 本质为:MultiThreadIoEventLoopGroup,其children数量为:2 * CPU核数,每个child是一个:SingleThreadIoEventLoop
    • 线程前缀:vert.x-eventloop-thread-
  • VertxImpl#acceptorEventLoopGroup(EventLoopGroup)
    • 源于transport的默认实现:Transport#eventLoopGroup(int type, int nThreads, ThreadFactory threadFactory, int ioRatio)
    • 本质为:MultiThreadIoEventLoopGroup,其children数量为:1,每个child是一个:SingleThreadIoEventLoop
    • 线程前缀:vert.x-acceptor-thread-
  • VertxImpl#virtualThreadExecutor(ExecutorService)
    • 通过反射的方式获取到VirtualThreadBuilder
    • 本质为:ThreadPerTaskExecutorService
    • 线程前缀:vert.x-virtual-thread-

WorkerPool(包含一个ExecutorService和PoolMetrics)

  • VertxImpl#workerPool
    • ExecutorService本质为:ThreadPoolExecutor
    • corePoolSize/maximumPoolSize默认为:2 * CPU核数
    • 当使用WORKER的方式部署一个Verticle时,如果没有指定workerPoolName,默认是该WorkerPool
  • VertxImpl#internalWorkerPool
    • ExecutorService本质为:ThreadPoolExecutor
    • corePoolSize/maximumPoolSize默认为:2 * CPU核数
  • VertxImpl#virtualThreaWorkerPool
    • ExecutorService本质为:ThreadPerTaskExecutorService
    • 其内部的ExecutorServiceVertxImpl#virtualThreadExecutor共享同一个实例引用

stickyEventLoop

  • 本质为:ThreadLocal<WeakReference<EventLoop>>
  • 起到线程亲和作用,同一个线程调用stickyEventLoop()时,尽量返回之前的线程
  • 每次从eventLoopGroup.next()返回一个线程

ContextImpl

当调用Vertx#deployVerticle(...)部署一个Verticle时,被VertxImpl#getOrCreateContext()创建,内部包含的重要变量:

  • threadingModel(ThreadingModel):可选值为:EVENT_LOOPWORKERVIRTUAL_THREADEXTERNAL
  • eventLoop(EventLoopExecutor):TODO
  • executor(EventExecutor):TODO
  • workerPool(WorkerPool):TODO
    根据threadingModel的不同,决定了eventLoopexecutorworkerPool使用不同的线程及线程池

ThreadModel

  • EVENT_LOOP
    • executor
      • 本质为EventLoopExecutor,内部包含1个netty的EventLoop(SingleThreadIoEventLoop)的引用
      • 线程来自于:VertxImpl#stickyEventLoop()也即VertxImpl#eventLoopGroup.next()
    • eventLoop
      • executor共享同一个实例引用
    • workerPool
      • 线程来自于调用函数的参数或者VertxImpl#workerPool(当参数为空时)
  • WORKER
    • executor
      • 本质为:WorkerExecutor,内部包含1个WorkerPool的引用
      • 线程来自于调用函数的参数或者VertxImpl#workerPool(当参数为空时)
    • eventLoop
      • EVENT_LOOP下的eventLoop
    • workerPool
      • 当进行部署时,如果指定了workerPoolName,则新创建一个WorkerPool,否则使用默认的:VertxImpl#workerPool
      • workerPool的线程池和executor的线程池共享同一个实例引用
  • VIRTUAL_THREAD
    • executor
      • 本质为:WorkerExecutor,内部包含1个WorkerPool的引用
      • 线程来自于VertxImpl#virtualThreaWorkerPool
    • eventLoop
      • EVENT_LOOP下的eventLoop
    • workerPool
      • 线程来自于VertxImpl#virtualThreaWorkerPool
      • workerPool的线程池和executor的线程池共享同一个实例引用

NetServerImpl

可以通过Vertx#createNetServer创建,其实例也被HttpServerImpl#tcpServer持有,可以内部实现基于Netty。当其bind(...)被调用时,并非真正执行绑定,当且仅当vertx.sharedTcpServers()不存在相同的绑定时,执行真正的Netty Bootstrap的创建及绑定操作(可以参考文档:共享 TCP 服务端),主要成员包括:

  • worker(Handler<Channel>)
    • Channel初始化时,将channel加入到NetServerImpl#channelGroup
    • Channel配置Pipeline
  • listenContext(ContextInternal)
    • 如果是在VertxThread线程(例如在Verticle#start()函数)中调用了listen(...),则listenContext为当前线程(或Verticle)的Context,否则会触发Vertx#getOrCreateContext创建一个新的Context
  • eventLoop(EventLoop)
    • 线程来自于ContextInternal#nettyEventLoop()也即ContextImpl#eventLoop#eventLoop
    • 在执行bind(...)操作时eventLoop也会被加入到channelBalancer的workers(被用作Netty的BootstrapEventLoopGroup)列表,也就是说:Verticle的线程会参与到Netty的子EventLoopGroup中,当一个Channel被创建时,Netty会从所有的子EventLoopGroup选择一个EventLoop,当进行初始化时,Vert.x会通过Channel身上的EventLoop,找到
  • channelGroup(ChannelGroup)
    • 本质为:DefaultChannelGroup
    • 线程来自于ContextInternal#nettyEventLoop()也即ContextImpl#eventLoop#eventLoop
    • eventLoop共享同一个实例引用
    • 每一个NetServerImpl
  • handler(Handler<NetSocket>)
    • 提供给上层逻辑的回调接口,上层逻辑在调用NetServer#listen之前必须先赋值
    • 具体作用TODO
  • exceptionHandler(Handler<Throwable>)
    • 提供给上传逻辑的回调接口,HttpServerImpl的默认实现为:t -> log.trace("Connection failure", t);
  • channelBalancer(ServerChannelLoadBalancer)
    • 继承自ChannelInitializer<Channel>,实现Channel的初始化
    • 被用作Netty的BootstrapchildHandler
    • 其内部成员:workers(VertxEventLoopGroup)被用作Netty的Bootstrap的子EventLoopGroup