クライアントとサーバー間の接続は TCP 長接続に基づいており、クライアント側はサーバー側のデフォルトポート 2181 に接続します。つまりセッションです。
最初の接続確立から、クライアントはセッションのライフサイクルを開始します。クライアントはサーバーに ping パケットリクエストを送信し、各セッションにはタイムアウト時間を設定できます。
Session の作成
sessionID: セッションID。セッションを一意に識別するために使用されます。クライアントがセッションを作成するたびに、zookeeper はそのためにグローバルに一意の sessionID を割り当てます。zookeeper は sessionID を SessionTrackerImpl クラスのソースコード内で作成します。

Timeout:セッションタイムアウト時間。クライアントは Zookeeper インスタンスを構築する際に、設定したタイムアウト時間をサーバーに送信します。サーバー側は自身のタイムアウト時間制限に基づいて、最終的にセッションのタイムアウト時間を確認します。
TickTime:次回のセッションタイムアウト時点。デフォルトは 2000 ミリ秒です。zoo.cfg 設定ファイルで設定でき、サーバー側がセッションに対してバケット戦略管理。
isClosing:この属性は、セッションがすでにクローズされているかを示します。サーバー側がセッションのタイムアウト失効を検出すると、そのセッションは「クローズ済み」とマークされ、そのセッションの新しいリクエストは処理されません。
Session の状態
以下にいくつかの重要な状態を紹介します:
-
connecting:接続中。セッションが確立されると、状態は connecting 状態になります。時間は非常に短いです。
-
connected:接続済み。接続成功後の状態です。
-
closed:クローズ済み。セッションの有効期限切れで発生します。通常はネットワーク障害によるクライアントの再接続失敗、サーバーダウン、またはクライアントの自発的な切断が原因です。
セッションタイムアウト管理(バケット戦略+セッションアクティベーション)
zookeeper の leader サーバーは実行中に定期的にセッションタイムアウトチェックを行います。時間間隔は ExpirationInterval で、単位はミリ秒、デフォルト値は tickTime です。tickTime ごとにセッションタイムアウトチェックが1回実行されます。

ExpirationTime の計算方法:
ExpirationTime = CurrentTime + SessionTimeout; ExpirationTime = (ExpirationTime / ExpirationInterval + 1) * ExpirationInterval;
zookeeper の実行中、クライアントはセッションタイムアウト期限内にサーバーへリクエスト(読み取りと書き込みを含む)または ping リクエストを送信します。通称ハートビート検出セッションアクティベーションを完了し、セッションの有効性を維持します。
セッションアクティベーションのフロー:

アクティベーション後、セッションを移行するプロセスを実行し、その後新しいラウンドを開始します:
