Mímisbrunnr知恵の泉

← 分散システム 一覧

🎓 レベル:標準 | 重要度:A(必須)

📎 前提:透過性とスケーラビリティ | 関連:配送保証(at-most-once・at-least-once・exactly-once)メッセージングと非同期通信

要点(BLUF)

問題設定 ── 通信を関数呼び出しに見せたい

ソケットでバイト列を送受信するのは煩雑。result = service.method(args) と書けたら楽です。RPCはこの「遠隔を手続き呼び出しに見せる」透過性(透過性とスケーラビリティ)を提供します。

仕組み ── スタブとマーシャリング

sequenceDiagram
    participant C as クライアント
    participant CS as クライアントスタブ
    participant SS as サーバスタブ
    participant S as サーバ実装
    C->>CS: method(args) 呼び出し
    Note over CS: 引数をマーシャリング(直列化)
    CS->>SS: リクエスト(バイト列)
    Note over SS: アンマーシャリング(復元)
    SS->>S: method(args) 実行
    S->>SS: 戻り値
    Note over SS: 結果をマーシャリング
    SS->>CS: レスポンス
    Note over CS: 復元して返す
    CS->>C: result

要するに何か:RPCは「直列化+送受信+復元」を機械生成のスタブに隠蔽したもの。中身は結局メッセージのやり取りです。

正しさの観点 ── 透過性が隠せないもの

ローカル呼び出しと違い、RPCには部分故障があります。応答が来ないとき 分散システムとは・なぜ難しいか の4通り(未達・実行後喪失・処理中・遅延)が区別できない。だから呼び出し意味論を選ばねばなりません。

障害時の意味論再送方針結果
at-most-once再送しない実行0〜1回(失敗は呼び出し側へ)
at-least-onceack来るまで再送1回以上(冪等でないと壊れる

この選択は 配送保証(at-most-once・at-least-once・exactly-once) で詳説します。安全性(二重実行しない)は冪等性で、活性(いつか返る)はタイムアウト+再送で担保します。

他手法との比較 ── RPC vs メッセージング vs REST

様式結合度同期/非同期向く用途
RPC(gRPC)密(IF共有)主に同期・低遅延内部サービス間・高頻度呼び出し
メッセージング(メッセージングと非同期通信非同期バースト吸収・疎結合・イベント駆動
REST/HTTP同期公開API・キャッシュ容易

なぜ分散だと難しいか(直観)

ローカル呼び出しは「呼べば必ず1回実行され、必ず返る」。RPCはこの2つの保証をどちらも失います。透過性が高いほどこの差が見えにくく、「なぜか二重課金」「なぜか固まる」が起きる。遠隔は遠隔と意識するのが安全側の設計です。

⚠️ よくある誤解・落とし穴

対応ラボ

なし(概念回)。再送と冪等性の効果は 配送保証(at-most-once・at-least-once・exactly-once) のラボで実証します。

関連

第3章 通信とRPC 目次