ZooKeeper会话机制!

会话创建

在一个请求的发送过程中,首先,客户端要与服务端进行连接,而一个连接就是一个会话。

一个会话可以看作是一个用于表示客户端与服务器端连接的数据结构 Session。

这个数据结构由三个部分组成:

  • 会话 ID(sessionID)、会话超时时间(TimeOut)、会话关闭状态(isClosing)

会话 ID:

  • 会话 ID 作为一个会话的标识符,当我们创建一次会话的时候,ZooKeeper 会自动为其分配一个唯一的 ID 编码。

会话超时时间:

  • 一个会话的超时时间就是指一次会话从发起后到被服务器关闭的时长。
  • 设置会话超时时间后,服务器会参考设置的超时时间,最终计算一个服务端自己的超时时间。
  • 这个超时时间则是最终真正用于 ZooKeeper 中服务端用户会话管理的超时时间。

会话关闭状态:

  • 会话关闭 isClosing 状态属性字段表示一个会话是否已经关闭。
    • 如果服务器检查到一个会话已经因为超时等原因失效时。
      • ZooKeeper 会在该会话的 isClosing 属性值标记为关闭,再之后就不对该会话进行操作了。

ZooKeeper实际起作用的超时时间是通过客户端和服务端协商决定的:

客户端在和服务端建立连接的时候,会提交一个客户端设置的会话超时时间。

而该超时时间会和服务端设置的最大超时时间和最小超时时间进行比对。

  • 如果正好在其允许的范围内,则采用客户端的超时时间管理会话。

如果大于或者小于服务端设置的超时时间,则采用服务端设置的值管理会话。

会话状态

在 ZooKeeper 服务的运行过程中,会话会经历不同的状态变化。

这些状态包括:正在连接(CONNECTING)、已经连接(CONNECTIED)。

正在重新连接(RECONNECTING)、已经重新连接(RECONNECTED)、会话关闭(CLOSE)等。

分桶策略

在 ZooKeeper 的会话管理中,最主要的工作就是管理会话的过期时间。

在 ZooKeeper 中,会话将按照不同的时间间隔进行划分,超时时间相近的会话将被放在同一个间隔区间中。

这种方式避免了 ZooKeeper 对每一个会话进行检查,而是采用分批次的方式管理会话。