zookeeper server I/O

Zookeeper的I/O模式?

Zookeeper在啟動過程中有一步很重要:初始化ServerCnxnFactory
其中的實現類有NettyServerCnxnFactory和NIOServerCnxnFactory

如何配置?

QuorumPeerConfig#parseProperties中,可以看到,直接設置serverCnxnFactory的classname就行。

**Nio? **

public void run() {
        while (!ss.socket().isClosed()) {
            try {
                selector.select(1000);
                Set<SelectionKey> selected;
                synchronized (this) {
                    selected = selector.selectedKeys();
                }
                ArrayList<SelectionKey> selectedList = new ArrayList<SelectionKey>(
                        selected);
                Collections.shuffle(selectedList);
                for (SelectionKey k : selectedList) {
                    if ((k.readyOps() & SelectionKey.OP_ACCEPT) != 0) {
                        SocketChannel sc = ((ServerSocketChannel) k
                                .channel()).accept();
                        InetAddress ia = sc.socket().getInetAddress();
                        int cnxncount = getClientCnxnCount(ia);
                        if (maxClientCnxns > 0 && cnxncount >= maxClientCnxns){
                            LOG.warn("Too many connections from " + ia
                                     + " - max is " + maxClientCnxns );
                            sc.close();
                        } else {
                            LOG.info("Accepted socket connection from "
                                     + sc.socket().getRemoteSocketAddress());
                            sc.configureBlocking(false);
                            SelectionKey sk = sc.register(selector,
                                    SelectionKey.OP_READ);
                            NIOServerCnxn cnxn = createConnection(sc, sk);
                            sk.attach(cnxn);
                            addCnxn(cnxn);
                        }
                    } else if ((k.readyOps() & (SelectionKey.OP_READ | SelectionKey.OP_WRITE)) != 0) {
                        NIOServerCnxn c = (NIOServerCnxn) k.attachment();
                        c.doIO(k);
                    } else {
                        if (LOG.isDebugEnabled()) {
                            LOG.debug("Unexpected ops in select "
                                      + k.readyOps());
                        }
                    }
                }
                selected.clear();
            } catch (RuntimeException e) {
                LOG.warn("Ignoring unexpected runtime exception", e);
            } catch (Exception e) {
                LOG.warn("Ignoring exception", e);
            }
        }
        closeAll();
        LOG.info("NIOServerCnxn factory exited run method");
    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,924評論 18 139
  • ZooKeeper介紹 Zookeeper 分布式服務框架是 Apache Hadoop 的一個子項目,它主要是用...
    Coselding閱讀 11,446評論 1 37
  • 本文將從系統模型、序列化與協議、客戶端工作原理、會話、服務端工作原理以及數據存儲等方面來揭示ZooKeeper的技...
    端木軒閱讀 3,835評論 0 42
  • 今天暈臺了。很丟人。 大姨媽光顧。我知道我是實在撐不住了。 可是沒人會可憐你,只會覺得你沒用。 關于錢的事太多,想...
    茉莉小榴蓮閱讀 324評論 0 0
  • .+9+ 已是深秋,涼意很濃。單薄的裙衫已抵擋不了那樣的涼,所以,喜歡在暖暖的陽光里獨立,陽光的暖抵消了深秋的涼,...
    蘭馨若冰閱讀 492評論 31 38