クライアントとサーバー間の接続は 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 リクエストを送信します。通称ハートビート検出セッションアクティベーションを完了し、セッションの有効性を維持します。

セッションアクティベーションのフロー:

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