写日志模块与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还有全局分布式锁的功能,同一个进程内的两个线程可以有锁来控制临界资源但是两个进程就没有办法了,就需要用到全局分布式锁的功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值