领导者追随者

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了领导者追随者相关的知识,希望对你有一定的参考价值。

领导者/追随者模式是多个工作线程轮流获取事件源集合,轮流监听、分发并处理事件的一种模式。在任意时间点,程序都仅有一个领导者线程,它负责监听IO事件。而其他线程则是追随者,它们休眠在线程池中等待成为新的领导者。当前的领导者如果检测到IO事件,首先要从线程池中推选出新的领导者线程,然后处理IO事件。此时,新的领导者等待新的IO事件,而原来的领导者则处理IO事件,二者实现了并发。
领导者/追随者模式包含如下几个组件:句柄集(HandleSet)、线程集(ThreadSet)、事件处理器(EventHandler)和具体的事件处理器(ConcreteEventHandler)。它们的关系如下:

技术分享图片

  1. 句柄集
    句柄(Handle)用来表示IO资源,在Linux下通常就是一个文件描述符。句柄集管理众多句柄,它使用wait_for_event方法来监听这些句柄上的IO事件,并将其中的就绪事件通知给领导者线程。领导者则调用绑定到Handle上的事件处理器来处理事件。领导者将Handle和事件处理器绑定是通过调用句柄集中的register_handle方法实现的。
  2. 线程集
    这个组件是所有工作线程(包裹领导者线程和追随者线程)的管理者。它负责各线程之间的同步,以及新领导者线程的推选。线程集中的线程在任意时间必出于如下三种状态之一:
    ? Leader:线程当前处于领导者身份,负责等待句柄集上的IO事件。
    ? Processing:线程正在处理时间。领导者检测到IO事件之后,可以转移到Processing状态来处理该事件,并调用promote_new_leader方法推选新的领导者;也可以制定其他追随者来处理事件(Event Handoff),此时领导者的地位不变,当处于Processing状态的线程处理完事件之后,如果当前线程集中没有领导者,则它将成为新的领导者,否则它就直接转变为追随者。
    ? Follower:线程当前处于追随者身份,通过调用线程集的join方法等待成为新的领导者,也可能被当前的领导者指定来处理新的任务。
    技术分享图片
    需要注意的是,领导者线程推选新的领导者和追随者等待成为新的领导者这两个操作都将修改线程集,因此线程集提供一个成员synchronizer来同步这两个操作,避免竞态条件。
  3. 事件处理器和具体的事件处理器
    事件处理器通常包含一个或者多个回调函数handle_event。这些回调函数用于处理事物对应的业务逻辑。事件处理器在使用前需要绑定到某个句柄上,当该句柄上有事件发生时,领导者就执行与之绑定的事件处理器中的回调函数。具体的事件处理器是事件处理器的派生类。它们必须重新实现基类的handle_event方法,以处理特定的任务。
    技术分享图片
    由于领导者线程自己监听IO事件并处理客户请求,因而领导者/追随者不需要在线程之间传递任何额外的数据,也无需像半同步/半反应堆模式那样在线程之间同步对请求队列的访问。但领导者/追随者的一个明显的缺点是仅支持一个事件源集合,因此无法让每一个工作线程独立管理多个客户连接。

以上是关于领导者追随者的主要内容,如果未能解决你的问题,请参考以下文章

两种高效的并发模式(半同步/半异步和领导者/追随者)

转:领导力基因:如何让别人自愿追随?

转:领导力基因:如何让别人自愿追随?

Raft 基础

zookeeper超时解读

转:领导力基因:为什么别人愿意追随你?