前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Zk NIOServerCnxnFactory

Zk NIOServerCnxnFactory

作者头像
平凡的学生族
发布2019-12-02 22:27:58
1K0
发布2019-12-02 22:27:58
举报
文章被收录于专栏:后端技术

Zookeeper源码分析--NIOServerCnxnFactory

NIOServerCnxnFactory基于NIO实现了一个多线程的ServerCnxnFactory,线程间的通信都是通过queue来完成的。NIOServerCnxnFactory包含的线程如下:

  • 1个accept线程NIOServerCnxnFactory.AcceptThread,用来监听端口并接收连接,然后把该连接分派给selector线程。
  • N个selecotr线程NIOServerCnxnFactory.SelectorThread,每个selctor线程平均负责1/N的连接。使用N个selector线程的原因在于,在大量连接的场景下,select()操作本身可能会成为性能瓶颈。
  • N个worker线程protected WorkerService workerPool;,用来负责socket的读写。如果N为0,那么selector线程自身会进行socket读写。
  • 1个管理连接的线程NIOServerCnxnFactory.ConnectionExpirerThread,用来关闭空闲而且没有建立session的连接。

这几种线程相互配合的原理如下:

  1. AcceptThread和SelectorThread都继承自NIOServerCnxnFactory.AbstractSelectThread,AbstractSelectThread会在内部维护一个Selector。因此AcceptThread和SelectorThread各自会维护一个Selector。
  2. 一般的流程大约是:
    1. AcceptThread监听新连接,并根据轮询法,选择一个SelectorThread,将新连接置于后者的acceptedQueue(LinkedBlockingQueue)中。
    2. 后者从acceptedQueue中取出连接,将读写事件注册在自己的Selector上,并监听读写事件,将触发的连接包装成IOWorkRequest,交给workerPool线程池服务运行。
    3. IOWorkRequest的doWork会被线程池运行,在这之中,会调用cnxn.doIO调用NIOServerCnxn的方法。
    4. 后者会读取4字节int数据,并交给CommandExecutor找到对应的命令AbstractFourLetterCommand,根据命令模式,去执行。这些命令可能会需要ZooKeeperServer和ServerCnxnFactory的协调。
  3. 关于过期连接的关闭,一般由private ExpiryQueue<NIOServerCnxn> cnxnExpiryQueue;维护,并由ConnectionExpirerThread周期性检查、关闭过久未被激活的连接。

ZooKeeper-ExpiryQueue詳解

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Zookeeper源码分析--NIOServerCnxnFactory
  • ZooKeeper-ExpiryQueue詳解
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档