当前位置: 首页 > 网络应用技术

Zookeeper源代码6 HeartBeat检测过程和会话时间参数分析(独立服务器和客户端)

时间:2023-03-07 10:59:45 网络应用技术

  欢迎大家注意github.com/hsfxuebao。我希望这对每个人都会有所帮助。如果您认为有可能

  上一篇文章分析了ZK的架子 - 架构和一般建立的连接交互过程。本文从心跳检测的方面开始。让我们看一下如何设置ZK服务器和客户端的心跳检测,如何执行ZK心跳检测间隔的计算,一般检测过程等等。

  注意:本文基于ZK版本3.7分析,需要为ZK和重要组件的体系结构提供一定的基础。当然,在阅读了过程后,您可以了解这些架构组件,但是建议首先了解服务器并首先了解服务器端的服务器和侧面,并且客户端上的体系结构组件在本文中不执行。

  对于ZK,无论是使用Nio或Netty还是解决通信数据传输问题,客户端和服务器的交互过程都值得学习。

  此交互过程仅考虑正常连接,并将其过程分为三个步骤,即:1。客户端启动连接服务器端请求;2.接收到接收PING响应更新的最后一个心跳测试时间。一般交互流程图如下:

  让我们看一下三个步骤的特定详细交互式流程图。

  三个步骤的第一步的第一步如下:如下:

  发送数据包涉及的情况与SendThread类不可分割。因此,但是一般的治疗过程相似。在此图中,如果您阅读了先前的有关ZK服务和客户端的重要组成部分,您可以清楚地知道它具有一般角色,但有些NIO类添加到tig.next,分析每个步骤中的一些小细节:

  对于ping的发送阶段,源代码过程将两次称为dotransport()。当然,如果当时有写作事件,则只能执行一次。

  服务器侧交互处理过程的三个步骤中的第二步如下:

  从ZK系列的第二篇文章中,您可以知道,NioservercnxnFactory在ZK启动时也会在Guardian线程的对象上运行。它将始终询问是否有通过Selector进行新的IO事件。LET详细分析特定的交互过程:

  最后一步分为三个步骤的交互式流程图如下:

  与新过程相比,这个过程无疑非常简单。它只是使用NIO的选择()方法来监视NIO事件,并从插座类型中读取数据数据。相应的判断。特定的过程分析如下:

  据推测,如果您没有对ZK进行深入研究,您会看到ZK的各种参数配置只会停止大致哪个参数,以及该参数之间的紧密相关性将如何具有角色和密切相关性的相关性因此,这是ZK的一些参数配置,以分析ZK中各种重要参数的生成和影响。

  关于ZK服务器会话的到期时间有三种配置:

  例子:

  假设TickTime = 10000(10s),MinsessionTimeOut = 5000,MaxSessIntimeOut = 20000,那么客户端的SessionTime Out值范围为:5000 <= SessionTimeOut <= 20000;

  假设未设置TickTime = 10000(10s),MinsessionTimeOut和MaxSessIntiemout,则客户端的SessionTimeout值范围为:100002 = 20000 <= SessionTimeOut <= 2010000 = 200000。

  = MaxSessionTimeOut。如果您想直接查看ZK服务器的一般配置,则可以使用两个间隔关系来通常了解有关会话时间配置的ZK,以了解客户端上的SessionTime Out配置可以使用多少效果。对于SessionTimeout而言,什么是无用的。

  客户端将计算每次执行PING请求的时间,并且服务器将清除在一段时间内每次无效的会话。接下来,让我们分析如何计算它。

  在此计算中,涉及三个属性:

  例子:

  假设TickTime = 10000(10s),然后Expiration Interval = TickTime = 10000,当创建SessionTracker实现类时,将直接计算NextExpiration Time的值。1611728113721/10000+1)10000* 10000 = 1611728120000。第一个间隔是1611728120000,因此后续间隔是下一个范围的下一个间隔。

  :可以从Just公式(TimessTamp / expiretation Interval + 1) * Expiretation Interval仅将当前时间戳的基本单元转换为ExpirationInterval(TickTime),从正义示例可以清楚地看到。

  当服务器处理客户端上的请求时,服务器将根据服务器的会话失败时间的特定客户端sessiontime进行更新,然后分析波浪。

  在此计算中,涉及三个属性:

  例子:

  + 1)10000 =(161172812+ 1)10000 = 16117281310000 = 1611728130000。

  :此过程与SessionTracker的过时会话相同。这只是时间戳和会话时间段,但最终结果仍将转换为Expiretation Interval的值。

  客户也有许多属性。尽管我们只能为会话的到期时间设置SessionTime Out时间,但此属性是确定与客户端会话时间相关的属性。

  在此计算中,涉及6个属性:

  例子:

  发送已完成,然后to = ReadTimeOut = 6666,timetOnextping = ReadTimeOut/2 -idlesend = 3333。

  摘要:从上面的示例中,我们可以知道,获得最终注意值的选择()获得最终注意的值是ReadTimeout-idlerecv,即,最大值是ReadTimeout,并且下一个ping time timeTonextping值是两种类型。比1000,它是ReadTimeOut/2 -idlesend -1000,即,最大值是ReadTimeOut/2-2000。如果IDLESEND值小于1000,则是ReadTimeOut/2 -idlesend.negotiatedSactimeout 2/3,因此最终关系非常清楚。Select()最大阻止时间是协议的SessiveSessionTime Under 2/3,并且最大ping间隔为协商Sactimeout/3。

  源代码分析很长,如果您有兴趣,可以跳到心跳检测过程源代码分析

  Zookeeper 3.7版本GitHub源代码注释分析

  ## ZK源代码分析系列

  Zookeeper原理和源代码学习系列Zookeeper学习系列Zookeeper源代码系列

  原始:https://juejin.cn/post/7100148318600167437