漫遊ZooKeeper nio通訊過程
0.引子
最近在看分散式併發工具menagerie,藉助ZooKeeper,實現常用的collection、lock。
menagerie 含金量高,可以作為工具儲備,也可以借鑑開發技巧。
1.ZooKeeper通訊
- 建立ZooKeeper物件,構造過程中會建立ClientCnxn物件,用於命令的傳送、接收
- ClientCnxn 核心包含兩個工作執行緒:sendThread 和 eventThread
- ZooKeeper物件構造完成,會內部呼叫ClientCnxn.start,也就是啟動兩個核心執行緒
- ClientCnxn 負責伺服器通訊,關鍵方法submitRequest,sendThread 完成nio的過程
- 所有的通訊以Packet queue的形式體現
2.ClientCnxn.submitRequest分析
上原始碼:
// 提交操作命令request,結果回填response
public ReplyHeader submitRequest(..., Record request, Record response, ...) {
ReplyHeader r = new ReplyHeader();
// Packet 入佇列,喚醒select()
Packet packet = queuePacket(h, r, request, response, null, null, null, watchRegistration);
// 典型的執行緒同步操作
synchronized (packet) {
while (!packet.finished) {
packet.wait();
}
}
return r;
}
類似於執行緒池的設計,任務的提交和處理分開實現,或者稱之為生產者消費者的排程。具體的消費、通訊實現,參考SendThread 的run方法。
3.SendThread 分析
- 初始條件,sockKey 是null,觸發startConnect(),典型的nio初始化操作
// 初始化SocketChannel
SocketChannel sock = SocketChannel.open();
sock.configureBlocking(false);
sock.socket().setSoLinger(false, -1);
sock.socket().setTcpNoDelay(true);
// 註冊至selector
sockKey = sock.register(selector, SelectionKey.OP_CONNECT);
// 發起連線操作
conReq.serialize(boa, "connect");
- doIO方法 完成伺服器讀寫的排程
- readResponse方法 完成協議解析,回填response
- finally, packet.notify,至此,通訊完成
// 收尾,執行緒同步完成
private void finishPacket(Packet p) {
if (p.watchRegistration != null) {
p.watchRegistration.register(p.replyHeader.getErr());
}
// 如果沒有callback,則直接notify,否則加入事件佇列,EventThread負責排程
if (p.cb == null) {
synchronized (p) {
p.finished = true;
p.notifyAll();
}
} else {
p.finished = true;
eventThread.queuePacket(p);
}
}
相關文章
- 漫遊jedis-RESP通訊實現
- Java Nio通訊Java
- https的通訊過程HTTP
- Flink - 元件通訊過程元件
- TCP/IP的通訊過程-VeCloudTCPCloud
- 一次HTTP通訊過程HTTP
- 使用tcpdump觀察DNS通訊過程TCPDNS
- PHP-FPM 與 NGINX 通訊過程PHPNginx
- Java基礎(Socket通訊和NIO)Java
- 漫畫通訊:一圖看懂通訊發展史
- 最新最全的Portlet 通訊過程詳解
- 融雲漫話:通訊中臺
- 儲存過程——遊標儲存過程
- MySQL過程和遊標MySql
- 圖解Flutter建立Isolate的過程及通訊圖解Flutter
- 網易來聊聊子彈簡訊的訊息漫遊技術
- 漫遊HttpURLConnectionHTTP
- 記一次https通訊除錯過程HTTP除錯
- Java面試必問通訊框架NIO,原理詳解Java面試框架
- 【Zookeeper】原始碼分析之網路通訊(一)原始碼
- 移遠 EC20 模組(4G通訊模組)AT指令測試 TCP 通訊過程TCP
- [Alink漫談之三] AllReduce通訊模型模型
- 【漫畫技術】Android跨程式通訊Android
- 服務端漫遊服務端
- CCNA - Part10 資料包的通訊過程
- 例項詳解不同VLAN間通訊(轉發過程)
- 揭祕得物客服IM全鏈路通訊過程
- 客戶端到伺服器端的通訊過程客戶端伺服器
- mysql 遊標的使用(儲存過程)MySql儲存過程
- oracle 儲存過程遊標的使用Oracle儲存過程
- 漫畫:軟體開發評估過程
- WiFi漫遊卡頓嚴重,如何有效改善實現無縫漫遊WiFi
- Java通過SSLEngine與NIO實現HTTPS訪問JavaHTTP
- 微服務通訊之feign的註冊、發現過程微服務
- zookeeper原始碼 — 五、處理寫請求過程原始碼
- Thinking in Java--使用NIO實現非阻塞Socket通訊ThinkingJava
- IO通訊模型(二)同步非阻塞模式NIO(NonBlocking IO)模型模式BloC
- Java NIO通訊框架在電信領域的實踐Java框架