🎓 レベル:標準 | 重要度:A(必須)
📎 前提:透過性とスケーラビリティ | 関連:配送保証(at-most-once・at-least-once・exactly-once)・メッセージングと非同期通信
要点(BLUF)
- RPC(Remote Procedure Call)は、遠隔マシンの手続きをローカル関数のように呼べる抽象。RMIはそのオブジェクト版(メソッド呼び出し)。gRPC/Thrift が現代の代表。
- 仕組みはスタブ+マーシャリング:クライアントスタブが引数を直列化して送り、サーバスタブが復元して実行、結果を逆経路で返す。
- ただし「ローカルのように」は嘘を含む:失敗(部分故障)・遅延・参照渡し・型/言語差は隠しきれない。これが 分散コンピューティングの誤謬(8つの誤謬) を誘発する。
問題設定 ── 通信を関数呼び出しに見せたい
ソケットでバイト列を送受信するのは煩雑。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
- スタブ(stub):呼び出し側の代理。引数の直列化と送信を担う。サーバ側はスケルトンとも呼ぶ。
- マーシャリング:言語の値(構造体・オブジェクト)をネットワーク表現(例:Protocol Buffers)へ変換。逆がアンマーシャリング。
- IDL(Interface Definition Language):
.proto等でインタフェースを定義し、両側のスタブを自動生成。
要するに何か:RPCは「直列化+送受信+復元」を機械生成のスタブに隠蔽したもの。中身は結局メッセージのやり取りです。
正しさの観点 ── 透過性が隠せないもの
ローカル呼び出しと違い、RPCには部分故障があります。応答が来ないとき 分散システムとは・なぜ難しいか の4通り(未達・実行後喪失・処理中・遅延)が区別できない。だから呼び出し意味論を選ばねばなりません。
| 障害時の意味論 | 再送方針 | 結果 |
|---|---|---|
| at-most-once | 再送しない | 実行0〜1回(失敗は呼び出し側へ) |
| at-least-once | ack来るまで再送 | 1回以上(冪等でないと壊れる) |
この選択は 配送保証(at-most-once・at-least-once・exactly-once) で詳説します。安全性(二重実行しない)は冪等性で、活性(いつか返る)はタイムアウト+再送で担保します。
他手法との比較 ── RPC vs メッセージング vs REST
| 様式 | 結合度 | 同期/非同期 | 向く用途 |
|---|---|---|---|
| RPC(gRPC) | 密(IF共有) | 主に同期・低遅延 | 内部サービス間・高頻度呼び出し |
| メッセージング(メッセージングと非同期通信) | 疎 | 非同期 | バースト吸収・疎結合・イベント駆動 |
| REST/HTTP | 中 | 同期 | 公開API・キャッシュ容易 |
なぜ分散だと難しいか(直観)
ローカル呼び出しは「呼べば必ず1回実行され、必ず返る」。RPCはこの2つの保証をどちらも失います。透過性が高いほどこの差が見えにくく、「なぜか二重課金」「なぜか固まる」が起きる。遠隔は遠隔と意識するのが安全側の設計です。
⚠️ よくある誤解・落とし穴
- 「RPCはローカル呼び出しと同じ」→ 失敗・遅延・直列化コストが本質的に違う。同じに見せる透過性が罠。
- 「参照を渡せる」→ ポインタ/参照は別アドレス空間で無意味。値渡し(コピー)が基本。可変状態の共有は別設計。
- 「at-least-onceで再送すれば安全」→ 冪等でないと二重実行で壊れる(配送保証(at-most-once・at-least-once・exactly-once) のラボで実証)。
- 「同期RPCで疎結合」→ 同期呼び出しは呼び先の障害が連鎖(カスケード障害)。疎結合はメッセージング。
対応ラボ
なし(概念回)。再送と冪等性の効果は 配送保証(at-most-once・at-least-once・exactly-once) のラボで実証します。
関連
- 疎結合な代替が メッセージングと非同期通信
- 再送の安全性は 配送保証(at-most-once・at-least-once・exactly-once)
- 透過性の設計目標は 透過性とスケーラビリティ