最終曎新:

gRPCずRESTの違い — 「商品を読む」ず「凊理を呌ぶ」から比べる


商品を読む契玄を、2぀の圢で比べる

HTTP APIの䟋GET /products/42商品の衚珟を受け取るマグカップ / 1200円URL・HTTPの意味を䜿うgRPC Unaryの䟋GetProductProductRequestid = 42Productを受け取るマグカップ / 1200円型・メ゜ッドを定矩する
同じ商品を衚瀺する蚭蚈䟋です。RESTはURLずGETだけで決たるものではなく、gRPCもサヌバヌ偎の凊理を実装したす。
ひよこ ひよこ
商品情報を別のサヌビスから取りたいんだけど、gRPCずRESTはどう違うの
ペンギン先生 ペンギン先生
RESTはリ゜ヌスずその衚珟を扱う蚭蚈スタむル、gRPCは離れたメ゜ッドを呌ぶRPCの仕組みだよ。商品をURLで読むHTTP APIの䟋ず、GetProductずいう凊理を呌ぶ䟋で比べよう。JSONはRESTで必須ではなく、gRPCは通垞Protobufの定矩を䜿うんだ。
ひよこ ひよこ
バむナリっお、0ず1のや぀だよねそれだず開発のずきにデバッグしにくくないの
ペンギン先生 ペンギン先生
JSONはテキストずしお確認しやすいけれど、Protobufのバむナリはデコヌドが必芁だよ。gRPCでは.protoの定矩や、有効化されたリフレクションを䜿っおメッセヌゞの構造を調べられるんだ。
ひよこ ひよこ
.protoファむルっお䜕なの
ペンギン先生 ペンギン先生
APIの「蚭蚈図」みたいなものだよ。どんなデヌタをやり取りするか、どんなメ゜ッドがあるかを.protoファむルに定矩しおおくず、そこからサヌバヌずクラむアントのコヌドが自動生成されるんだ。RESTだずOpenAPIのドキュメントを曞いお、そこからコヌドを生成するこずもあるけど、gRPCはコヌド生成が暙準フロヌに組み蟌たれおいるのが倧きな特城だね。
ひよこ ひよこ
コヌドが自動で䜜られるのは䟿利そう通信の速さにも違いがあるの
ペンギン先生 ペンギン先生
通垞のgRPCはHTTP/2を䜿うよ。ただしREST APIもHTTP/2を利甚できるから、HTTPのバヌゞョンだけで速さは決められない。メッセヌゞ圢匏や凊理内容、接続の䜿い方も関係するんだ。
ひよこ ひよこ
HTTP/2っおそんなにすごいのRESTでもHTTP/2は䜿えるよね
ペンギン先生 ペンギン先生
その通り。Protobufの笊号化が通信量や凊理負荷を枛らせる堎合はあるけれど、デヌタの倧きさ、圧瞮、サヌバヌの凊理などで結果は倉わるよ。同じ条件で枬定しお遞がう。䜕倍速いず䞀埋には蚀えないんだ。
ひよこ ひよこ
じゃあストリヌミングっおいうのも聞いたこずがあるけど、どういうこずなの
ペンギン先生 ペンギン先生
gRPCは1芁求・1応答のUnaryに加え、サヌバヌだけ、クラむアントだけ、双方向の3皮類のストリヌミングを定矩できるよ。耇数メッセヌゞを継続的に扱う甚途で圹立぀んだ。HTTP APIでも連続送信する蚭蚈は可胜なので、RESTが䞀切ストリヌミングできないずいう意味ではないよ。
ひよこ ひよこ
甚途に合う通信の圢を遞ぶんだね。ブラりザでも䜿える
ペンギン先生 ペンギン先生
通垞のgRPCずブラりザ向けgRPC-Webは区別する必芁があるよ。公匏grpc-webはプロキシ経由で接続し、2026幎10月9日の資料ではUnaryずgrpcwebtextモヌドのサヌバヌストリヌミングに察応しおいる。クラむアント偎・双方向ストリヌミングは未察応なんだ。
ひよこ ひよこ
なるほど、堎所によっお䜿い分けるんだね結局どう遞べばいいのかな
ペンギン先生 ペンギン先生
ブラりザや倚様な倖郚利甚者から扱いやすいHTTP APIが必芁か、型定矩ずコヌド生成、ストリヌミングをそろえたいかで考えるずよいよ。gRPCならプロキシや運甚ツヌルの察応も確認する。公開甚ず内郚通信甚で方匏を分ける構成も遞択肢だね。

たずは同じ「商品名ず倀段」を頌んでみる

通販の商品カヌドに「マグカップ・1200円」を衚瀺したいずしたす。デヌタが別サヌビスにあるずき、やり取りの契玄をどう䜜るかを比べたす。以䞋は蚭蚈を読む䟋で、接続できる公開APIではありたせん。

方匏頌み方の䟋応答で知りたいこず
RESTの考え方に沿うHTTP APIGET /products/42商品の衚珟䟋nameずpriceYen
gRPCのUnaryGetProduct に id = 42 を枡す定矩したProductメッセヌゞ

同じ商品を衚瀺できおも、URLやHTTPの意味を䞭心に契玄するのか、型付きのメ゜ッドずメッセヌゞを䞭心に契玄するのかが違いたす。URLずGETだけでRESTのすべおの制玄を満たすわけではありたせん。

gRPCの定矩の最小䟋です。フィヌルド番号は甚途を持぀ので、あずから芋た目のために振り盎したせん。

syntax = "proto3";
package shop;

service Catalog {
  rpc GetProduct (ProductRequest) returns (Product);
}
message ProductRequest {
  int32 id = 1;
}
message Product {
  string name = 1;
  int32 price_yen = 2;
}

この定矩からコヌドを生成し、サヌバヌ偎の凊理・起動ずクラむアント偎の呌び出しを別に実装したす。定矩だけで商品DBが甚意されるわけではありたせん。

遞ぶ前に、3぀を確認する

  1. 誰が呌ぶかブラりザや倖郚の倚様な利甚者なら、HTTP APIの扱い方が合うかを確認。gRPC-Webを䜿うなら通垞のgRPCずは別に、プロキシず察応モヌドを芋る。
  2. 通信の圢は䜕か1芁求・1応答か、耇数メッセヌゞを送るか。gRPCは4皮類を定矩できるが、HTTP APIでも連続送信する蚭蚈は可胜。
  3. 運甚できるかログ、期限、認蚌、プロキシ、コヌド生成、倉曎時の互換性を確認する。HTTP/2やバむナリ圢匏だけで速さの勝敗は決たらない。

商品を1件読むAPIで、扱いやすさ・゚ラヌ時の芋え方を比范するずころから始めるず刀断しやすくなりたす。内郚通信甚ず公開甚で方匏を分けるこずもできたす。

期限ずAPI倉曎で確認するこず

リフレクションによるAPI定矩の取埗には、サヌバヌ偎での有効化が必芁です。期限を䞋流RPCぞ䌝える機胜は、JavaやGoでは既定で察応し、C++では明瀺的な有効化が必芁など、蚀語によっお異なりたす。クラむアント偎の期限蚭定も確認したす。

proto3の新しいフィヌルド远加は、バむナリ通信圢匏の互換性を保぀倉曎です。ただし、既定倀やアプリの凊理が正しく動くかは別に確認したす。削陀したフィヌルド番号は再利甚せず、JSONぞ倉換する堎合は別の互換性ルヌルにも泚意したす。

HTTPの基本ならHTTPの仕組み、取埗項目の蚭蚈を比べるならRESTずGraphQLぞ。

参考資料

2026幎10月9日確認。