L · リーダー通知
構造refresh
リクエストへの応答ではなく、サーバーが自ら送る通知です(クラスタ専用)。Raftのリーダーが 変わったことを検知すると、そのノードに接続しているすべてのクライアントへ、新しいリーダーの クライアントアドレスを1回ずつ送ります。
Mとの違い
M · 移動 | L · リーダー通知 | |
|---|---|---|
| 性質 | リクエストへの応答 | サーバー発の通知(リクエストと無関係) |
| 意味 | 「このリクエストはここでは処理できない」 | 「リーダーが変わった」(情報) |
| 接続 | 閉じて新リーダーへ再接続 | 維持 — ヒントのみ更新 |
| このノード | リーダーでないことが確実 | このノード自身が新リーダーの可能性もある |
Lを受け取って接続を閉じてはいけません。通知を送ったノードがまさにその新リーダーである ことが多く、その接続でやり取りするリクエストもまだ残っています。
なぜ必要か
この通知がないと、クライアントはリーダーが変わった事実をリクエストを1回投げてMで 弾かれてはじめて知ることになります。Lはその往復をなくし、フェイルオーバー直後の最初の リクエストから直接新しいリーダーへ向かわせます。
このopを知らない旧バージョンのクライアントは無視しても動作に問題ありません — 性能が通知以前の水準(リクエスト → M → 再試行)に戻るだけです。
バイト表記:
opはASCII文字、addrはUTF-8テキスト(可変長、構造上はNと表記)です。 末尾の\nは0Aです。
フロー
クライアント
接続中のノード
新しいリーダー
選出によりリーダーが変わる
L · リーダー通知 (新リーダーのアドレス)
リーダーヒントのみ更新 — 接続は維持
次のリクエストから直接新リーダーへ
A · 獲得済み (token)
リクエストレスポンス
シングルサーバーモードではリーダーという概念がないため、この通知は送られません。クラスタの 動作全般はプロトコル (クラスタ)を参照してください。