ZK-3.5.8 客户端发送写请求
2021-07-13 14:29:04 6 举报
ZK-3.5.8 客户端发送写命令
作者其他创作
大纲/内容
读事件或写事件
selected = selector.selectedKeys();
写事件
拿到客户端的连接
doIO(...)
有事件发生跳出阻塞,处理事件
receiveMessage(buf);
submitRequest(si);
waitingEvents.add(pair);
new ClientCnxn
Zookeeper Atomic Broadcast
watchManager.defaultWatcher存放watcher
message.readBytes(bb);font color=\"#323232\
eventThread.start();
sock.write(p.bb);
这个firstProcessor在哪里初始化的?参考ZK启动源码,选举状态变为leading时,会构造处理链
sendThread.getClientCnxnSocket().packetAdded();
阻塞住
读事件
cnxn =createConnection(...)
ClientCnxnSocketNIO.connectClientCnxnSocketNetty.connect早期是用稳定的NIO,Netty是对NIO的封装,早期的Netty是不稳定的
如果要用netty,通信加上启动参数:-Dzookeeper.serverCnxnFactory=org.apache.zookeeper.server.NettyServerCnxnFactory
outgoingQueue.add(packet);
processEvent(event);
finishPacket(packet);
封装成Packet添加到outgoingQueue阻塞队列
Packet p =findSendablePacket(...)
连接事件
clientCnxnSocket.connect(addr);
2
SelectionKey k : selected
NettyServerCnxn cnxn= ctx.channel().attr(CONNECTION_ATTRIBUTE).get();
watcher.process(pair.event);
eventThread = new EventThread();
p.finished = true; p.notifyAll();
selector.select(waitTimeOut);
SendThread.run()
服务端leader
客户端
OP_CONNECT
zk=new ZooKeeper(...)属性赋值相关操作
sendThread.readResponse
SocketChannel sock = createSock();
data封装成 RequestHeader
sendThread.start();
1
服务端反序列化,最终封装到Request对象 si
从outgoingQueue阻塞队列中取数据
写到服务端
默认使用NIO连接
完成客户端的处理
看到这里联想可能是watcher监听机制
cnxn.submitRequest(...)
唤醒阻塞线程底层发空数据触发写事件
while (!packet.finished)packet.wait();发送zk命令阻塞住,收到客户端响应才会继续执行
处理客户端发送的消息
封装收到的服务端事件
event = new WatcherEvent();we = new WatchedEvent(event);eventThread.queueEvent( we );
对于客户端来说:建立连接事件对于服务端来说:接收连接事件
详见服务端处理责任链
3、创建节点数据
clientCnxnSocket.doTransport
startConnect(serverAddress);// 开始连接服务端
cnxn.processMessage((ByteBuf) msg);
selector.wakeup();
event = waitingEvents.take();
sock.connect(addr);
OP_READ || OP_WRITE
触发客户端监听事件
firstProcessor.processRequest(si);// Debug 断点打到这里,F5
for循环:事件
zk.create
死循环
如果是getData请求,客户端注册Watcher
cnxn.start();// 开启两个线程
sockKey.isReadable()
处理客户端的请求
CnxnChannelHandler.channelRead
queuePacket(...)
与服务端建立连接
sockKey.isWritable()
向服务端发送命令
sendThread = new SendThread(clientCnxnSocket);
p.createBB();序列化,生成实际请求的内容
0 条评论
下一页