目录
- 写日志模块
- 怎么实现写日志模块
- 为什么要设置分离属性,守护线程来写日志?
- zookeeper是用来干什么的
- zookeeper为什么选用多线程版本mt 而不是单线程版本st
- zookeeper的节点需设置为临时节点
- zookeeper的watcher机制
- watcher机制是什么?
- zookeeper别的功能
写日志模块
写日志是个磁盘IO,很慢,如果让主线程来等是很耗时间的,所以肯定需要开线程。
怎么实现写日志模块
需要一个日志队列,一把锁,一个条件变量。当多线程写日志的时候将队列上锁,写完后下锁并通知其他线程队列不为空了可以取数据了。(在静态获得实例函数中定义静态变量,这样所有线程操作的都是同一个静态变量)
为什么要设置分离属性,守护线程来写日志?
单纯为了懒得回收这个线程的资源,怕它变成僵尸线程。
zookeeper是用来干什么的
解除耦合,在本项目中起到服务注册中心。将在服务端的方法都注册到znode节点上去,节点的内容储存该服务端的ip地址和端口(znode节点只存储简单的byte字节数组),当客户端访问的时候先访问服务注册中心,如果服务注册中心有相应的方法就get节点的内容,然后根据内容的ip与端口进行远程程序调用。
zookeeper为什么选用多线程版本mt 而不是单线程版本st
因为在init的时候会创建多个线程,zookeeper的API提供了三个线程,分别是
- API调用线程 :负责创建句柄,也就是当前线程,执行zookeeper_init的线程
- 网络I/O线程 :负责与zkserver服务端连接
- watcher回调线程:完成watcher机制
zookeeper的节点需设置为临时节点
zk服务端和服务端通过心跳包进行通信,证明服务方法还可以使用,当断开连接的时候,心跳包不再发送了就将服务注册中心上的相应方法节点自动删除。心跳包是由zookeeper帮我们发送的。
zookeeper的watcher机制
watcher机制是什么?
通知回调机制,用来监听父节点中子节点的变化,如果有变化,会有zk主动的告知。本项目这个回调函数起到的作用是zkserver给zkclient发通知,根据宏值的判断连接是否成功,连接成功后给信号量加一,主线程就继续执行了。
当有服务注册的时候,监听watcher只能是一次性的,每次触发后需要重复设置。
zookeeper别的功能
zookeeper还有全局分布式锁的功能,同一个进程内的两个线程可以有锁来控制临界资源但是两个进程就没有办法了,就需要用到全局分布式锁的功能。