🌐
RPCとは?
RPCとはRemote Procedure Callの略である。
これは、ネットワークで繋がっている別のコンピュータのプログラムを実行できるということ。呼び出す側が呼ばれる側を実行するときに、具体的な通信手段やプロトコルについて自分で実装する必要がないという点が特徴がある。
対義語として、LPC(Local Procedure Call)がある。
具体的な通信手段やプロトコルについて自分で実装する必要がないという点が特徴がある。
上記は具体的にどういうことだろうか?
つまり、「低レベルの通信処理をRPCフレームワークが抽象化してくれる」ということ。
詳細を以下に書く。
通常、ネットワークを介して別のPCのプログラムを実行するには、以下のような処理を考える必要がある。
- データを送受信する方法の選択
- TCP, UDP, HTTPなどのプロトコル
- C++では、socket()で第一引数でトランスポート層(IPv4など)、第二引数でネットワーク層(TCP, UDPなど)を設定してソケットを作成できる(ref: man socket() )
- ソケット通信を直接使うのか?
- WebSocketを使うのか?
- メッセージのフォーマット
- 送るデータをどの形式でやり取りするのか?(JSON, XML, Protocol Buffers, MsgPackなど)
- リクエストとレスポンスの管理
- 相手のサーバーが処理を終えたら、どのようにレスポンスを受け取るのか?
- 非同期処理にするのか?同期処理にするのか?
- エラーハンドリング
- ネットワークエラーが発生した場合、どうリカバリーするか?
- タイムアウトをどう処理するか?どうリカバリーするか?
• タイムアウトをどう処理するか?
上記を全て実装するのは大変ですが、RPCフレームワークを使うと、これらの処理を隠蔽してくれる。
例えば、gRPCやThriftでは、開発者は単に「関数を呼び出す」感覚でネットワークを介して別のPCのプログラムを実行することができる。
REST APIとRPCの違い
項目 | REST API | RPC(Remote Procedure Call) |
---|---|---|
通信手段 | HTTPをベースにしている | gRPC, SOAP, JSON-RPC など色々 |
データの単位 | リソース(データ)にフォーカス | 関数(メソッド)を呼び出す |
使い方 | GET /users/1(データ取得) | getUser(1)(関数を呼ぶ) |
データフォーマット | JSON, XML | Protocol Buffers, JSON |
適した用途 | Web API, モバイルアプリのバックエンド | 高速な通信が必要なシステム間通信 |
まとめ
- REST APIはHTTPを使ってリソース(データ)をやり取りするWebAPIの仕組み
- URL + HTTPメソッド(GET, POST, PUT, DELETEなど)を組み合わせて操作
- JSONなどのフォーマットでデータをやり取りする
- シンプルで広く使われている
Discussion