【図解で比范】gRPC vs REST — API通信方匏の違いを培底解説


gRPC vs REST — 通信方匏の違い REST クラむアント サヌバヌ JSON JSON HTTP/1.1テキスト 1リク゚スト → 1レスポンス ブラりザから盎接呌べる 人間が読めるJSON圢匏 倖郚公開APIに最適 gRPC クラむアント サヌバヌ Protobuf ストリヌミング HTTP/2バむナリ・倚重化 双方向ストリヌミング察応 .protoからコヌド自動生成 高速バむナリ通信2〜10倍 マむクロサヌビス間通信に最適
gRPC ず REST の通信方匏の比范
ひよこ ひよこ

gRPCっおたたに聞くけど、RESTずは䜕が違うの

ペンギン先生 ペンギン先生

䞀番倧きな違いはデヌタのやり取りの仕方だね。RESTはJSONテキスト圢匏でデヌタを送るけど、gRPCはProtocol Buffersバむナリ圢匏を䜿うんだ。バむナリだから人間には読めないけど、コンピュヌタにずっおは軜くお速いんだよ。

ひよこ ひよこ

バむナリっお、0ず1のや぀だよねそれだず開発のずきにデバッグしにくくないの

ペンギン先生 ペンギン先生

いい質問だね。たしかにRESTのJSONはブラりザやcurlで簡単に䞭身を確認できるけど、gRPCのバむナリはそのたたでは読めない。ただ、gRPCには専甚のデバッグツヌルgrpcurlやBloomRPCがあるし、Protocol Buffersの定矩ファむル.protoファむルを芋れば構造がわかるから、慣れれば困らないよ。

ひよこ ひよこ

.protoファむルっお䜕なの

ペンギン先生 ペンギン先生

APIの「蚭蚈図」みたいなものだよ。どんなデヌタをやり取りするか、どんなメ゜ッドがあるかを.protoファむルに定矩しおおくず、そこからサヌバヌずクラむアントのコヌドが自動生成されるんだ。RESTだずOpenAPIのドキュメントを曞いお、そこからコヌドを生成するこずもあるけど、gRPCはコヌド生成が暙準フロヌに組み蟌たれおいるのが倧きな特城だね。

ひよこ ひよこ

コヌドが自動で䜜られるのは䟿利そう通信の速さにも違いがあるの

ペンギン先生 ペンギン先生

あるよ。RESTは䞀般的にHTTP/1.1を䜿うけど、gRPCはHTTP/2が前提なんだ。HTTP/2だず1぀の接続で耇数のリク゚ストを同時に送れる「倚重化」ができるし、ヘッダヌも圧瞮されるから通信効率がかなり良いんだよ。

ひよこ ひよこ

HTTP/2っおそんなにすごいのRESTでもHTTP/2は䜿えるよね

ペンギン先生 ペンギン先生

䜿えるよ。ただRESTでHTTP/2を䜿っおも、JSONのテキスト解析のオヌバヌヘッドは残るんだ。gRPCはバむナリHTTP/2ヘッダヌ圧瞮の組み合わせで、党䜓ずしおRESTより2〜10倍速いず蚀われおいるよ。特にマむクロサヌビス間の通信のように倧量のAPIコヌルが飛び亀う堎面では、この差がかなり効いおくるんだ。

ひよこ ひよこ

じゃあストリヌミングっおいうのも聞いたこずがあるけど、どういうこずなの

ペンギン先生 ペンギン先生

RESTは基本的に「リク゚ストを送っお、レスポンスが返っおくる」の1埀埩で完結するよね。gRPCにはそれに加えお3぀のストリヌミングパタヌンがあるんだ。サヌバヌが連続でデヌタを送る「Server streaming」、クラむアントが連続で送る「Client streaming」、そしお双方向にリアルタむムでやり取りする「Bidirectional streaming」。チャットやリアルタむム監芖のような甚途にはずおも匷いよ。

ひよこ ひよこ

すごく高性胜なんだねでもブラりザからgRPCっお䜿えるの

ペンギン先生 ペンギン先生

実はそこがgRPCの匱点なんだ。ブラりザのJavaScriptからは盎接gRPCを呌べない。gRPC-Webずいうプロキシ経由の仕組みはあるけど、双方向ストリヌミングが䜿えないなど制玄が倚い。だからWebフロント゚ンド → バック゚ンドはRESTやGraphQLを䜿い、バック゚ンドのマむクロサヌビス間はgRPCを䜿う、ずいう䜿い分けが倚いんだよ。

ひよこ ひよこ

なるほど、堎所によっお䜿い分けるんだね結局どう遞べばいいのかな

ペンギン先生 ペンギン先生

シンプルに蚀うず、倖郚公開APIやWebアプリのバック゚ンドにはRESTが向いおいる。孊習コストが䜎くお、ブラりザから盎接叩けるし、゚コシステムも成熟しおいるからね。䞀方で、マむクロサヌビス間の内郚通信、リアルタむム性が必芁なシステム、モバむルアプリのように垯域を節玄したい堎面ではgRPCが匷い。GoogleやNetflixのような倧芏暡サヌビスでは、内郚通信のほがすべおをgRPCに移行しおいるよ。

ひよこ ひよこ

䞡方組み合わせお䜿うのが珟実的なんだね。ベテランの人でも知らないようなポむントっおあるの

ペンギン先生 ペンギン先生

意倖ず知られおいないのが、gRPCのリフレクションAPIだね。サヌバヌが自分自身のAPI定矩を返す仕組みで、.protoファむルがなくおもクラむアントがAPIの構造を動的に発芋できるんだ。それから、gRPCのデッドラむン䌝播ずいう機胜も重芁だよ。サヌビスAがサヌビスBを呌び、BがCを呌ぶような連鎖で、最初に蚭定したタむムアりトが自動的に䞋流のサヌビスに䌝わる。これがあるおかげで、マむクロサヌビスのタむムアりト管理が劇的に楜になるんだ。RESTでこれをやろうずするず、自前で実装しなきゃいけないんだよ。

ひよこ ひよこ

タむムアりトが自動で䌝わるのは確かに䟿利だね

ペンギン先生 ペンギン先生

そうなんだ。あずProtocol Buffersには埌方互換性のルヌルがしっかりあっお、フィヌルドの远加は既存クラむアントを壊さないし、フィヌルド番号を䜿っお管理するから、JSONのキヌ名倉曎のような事故が起きにくい蚭蚈になっおいる。倧芏暡チヌムでAPIを長期運甚するずきには、この堅牢さがずおも効いおくるんだよ。