フレーム構造
RaftのRPCを運ぶ長さプレフィックス付きバイナリフレーミングです。 クライアントプロトコルの\n終端フレームとは異なり、まず長さが送られ、その分のバイト数だけ 読み取られます。1つの接続上ではリクエスト・レスポンスのペアが順番にやり取りされ、 発信側は常にリクエスト側です。
リクエスト(発信側 → 受信側)
構造refresh
レスポンス(受信側 → 発信側)
構造refresh
| フィールド | サイズ | 内容 |
|---|---|---|
tag | u8 | RPCの種類 — RPCの種類を参照(リクエストのみ) |
len | u32、ビッグエンディアン | 続くペイロードのバイト長 |
payload | lenバイト | postcard形式でシリアライズされたopenraft型 |
接続管理のルール
lenは64MiBが上限です(受信時にチェック)。上限を超えるフレーム、不正な形式の フレーム、未知のtag、Raft処理エラーはすべて接続を閉じることで処理されます — 発信側(openraft)が再接続して再試行します。- 発信側は対象ノードごとに1つの接続を使い回します。I/Oエラーが起きた場合や、往復の 途中でキャンセルされた場合は、その接続を破棄し、次の呼び出しで新しい接続を張ります — 半端に読み取られたストリームがずれた状態のまま再利用されることはありません。
用語
- 長さプレフィックス — 本文の長さを先に送り、その分だけ正確に読み取るフレーミング方式。
\nのような区切り文字が不要なため、任意のバイナリデータをそのまま運べます。 - シリアライズ — メモリ上の構造体を、転送に適したバイト列に変換すること。
- RPC(リモートプロシージャコール) — ネットワーク越しに、あたかもローカルで呼び出すかの ように他サーバーの関数を呼び出す、リクエスト・レスポンスのペア。