3、zk源码阅读--zk如何开启服务端与客户端之间的网络通讯组件

上一篇讲到QuorumPeer中的start()方法主要做了几件事情

1、检查myid

2、恢复数据到内存中

3、开启ServerCnxn网络通讯组件

4、进行leader选举

5、开启jvm监听器

6、开始线程

以上的2、3、4、6是重点

我们先跳过第二点,先来看看第三点,如何开启ServerCnxn网络通讯组件

    private void startServerCnxnFactory() {
        if (cnxnFactory != null) {
            cnxnFactory.start();
        }
        if (secureCnxnFactory != null) {
            secureCnxnFactory.start();
        }
    }

这个代码很容易读懂,不得不再次称赞,zookeeper的代码写得非常好,可读性非常高

可以看到,主要是执行cnxnFactory的start方法

start()方法跟进去看看

    @Override
    public void start() {
        stopped = false;
        if (workerPool == null) {
            workerPool = new WorkerService("NIOWorker", numWorkerThreads, false);
        }
        for (SelectorThread thread : selectorThreads) {
            if (thread.getState() == Thread.State.NEW) {
                thread.start();
            }
        }
        // ensure thread is started once and only once
        if (acceptThread.getState() == Thread.State.NEW) {
            acceptThread.start();
        }
        if (expirerThread.getState() == Thread.State.NEW) {
            expirerThread.start();
        }
    }

我们可以发现,上面这段代码只要做了一下几个事情

1、创建WorkerService线程池

2、开启所有的selectorThreads线程

3、开启acceptThread线程

4、开启expirerThread线程

这里涉及几个概念还有网络通讯模型,非常重要!

1、工作线程池

2、selector线程、accept线程、expirer线程,接下来我们就着重分析网络通讯模型是怎么样的
 

上一篇:所以说读者们才是最优秀的 | 某读者喜提offer(+85%)后的分享


下一篇:python 操作zookeeper详解