【ZooKeeper】Leader和Learner交互的一些思考

在经过Leader选举之后,现在集群中的所有服务器都已经确定了自己的角色。
主要由Leader、Follower和Observer,我们把Follower和Observer统称为Learner。那么在ZooKeeper中,是如何进行Leader和Learner之间的交互的呢?原来,这两者之间的交互采用的是一种典型1+N的线程模型。即一个线程用来处理连接请求,然后N个线程用来处理彼此之间的io。话不多说,下面我们就来看看具体都是怎么实现的吧。

两个线程

  • LearnerCnxAcceptor
  • LearnerHandler

LearnerCnxAcceptor是一个Follower接收器,专门用来接受来自Learner的连接请求。
Leader接受来自其他服务器的连接请求之后,会创建一个LearnerHandler实例,每个LearnerHandler的实例都对应着一个Learner和Leader之间的连接,主要负责两者之间的消息通信以及数据同步。

总结一下,一个线程专门处理连接请求,然后有多少个连接,就创建多少个LearnerHandler线程。

那么,为什么可以采用这种方式?因为,一个集群中的服务器个数一般是有限的,IO处理线程一般不太需要考虑线程是不是太多了,是否会有性能瓶颈的问题。这点不像一些线上的高并发的网站,如果采用那么一连接一线程的模式的话,那么很快就会达到性能瓶颈,因此频繁的创建线程是否需要时间和io开销的,并且线程的上下文切换带来的开销也是非常大的,一些系统支持的线程个数是有限制的,在这类场景下,一般都是后端的IO线程一般都是采用线程池的技术来实现。

你可能感兴趣的:(ZooKeeper)