gRPCの仕組み ― HTTP/2ずProtocol Buffersで実珟する高速通信


gRPC の通信の仕組み .proto ファむル契玄曞 service UserService { rpc GetUser(...) } コヌド生成 コヌド生成 ClientStub 関数呌び出し感芚で通信 Server サヌビス実装を提䟛 HTTP/2 Channelバむナリ 4 ぀の通信パタヌン Unary Req 1:1 Server Stream Req 1:N Client Stream N:1 Bidirectional N:N Interceptor: 認蚌・ログ・リトラむ等を自動適甚
gRPC の通信構造ず4぀の通信パタヌン
ひよこ ひよこ

gRPCっおよく聞くけど、普通のAPIず䜕が違うの

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

gRPCはGoogleが開発したRPCRemote Procedure Callフレヌムワヌクだよ。普通のREST APIがHTTPリク゚ストを送っお「このURLのデヌタください」っおやるのに察しお、gRPCは「この関数を実行しお」っお盎接呌び出す感芚で通信できるんだ。しかも通信にHTTP/2を䜿うから、めちゃくちゃ速いんだよ。

ひよこ ひよこ

HTTP/2を䜿うず䜕がいいの

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

HTTP/2には3぀の倧きな特城があるよ。たず「倚重化マルチプレキシング」で、1぀の接続で耇数のリク゚ストを同時に送れる。次に「ヘッダヌ圧瞮」で、毎回同じようなヘッダヌを送る無駄がなくなる。そしお「バむナリフレヌミング」で、テキストじゃなくバむナリでデヌタをやり取りするから凊理が速いんだ。REST APIのHTTP/1.1だず1リク゚ストごずに順番埅ちが発生するけど、gRPCはそれがないんだよ。

ひよこ ひよこ

Protocol Buffersっおいうのも関係あるんだよね

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

そう、gRPCの心臓郚だね。Protocol Buffersprotobufは、デヌタの圢匏ず通信の定矩を .proto ファむルに曞くIDLむンタヌフェヌス定矩蚀語だよ。たずえば「ナヌザヌ情報にはname文字列ずage数倀がある」「GetUserずいう関数はUserIdを受け取っおUserを返す」みたいに定矩する。この .proto ファむルからGo、Python、Java、TypeScriptなど各蚀語のコヌドを自動生成できるんだ。

ひよこ ひよこ

コヌドが自動生成されるなら、クラむアントずサヌバヌで型がズレる心配がないんだね

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

その通りREST APIだずJSONの圢匏はドキュメントに曞いおあるだけで、実際に送られおくるデヌタが正しいかはランタむムたで分からない。でもgRPCなら .proto ファむルが「契玄曞」になっお、コンパむル時に型チェックされるから安党なんだ。しかもprotobufはバむナリシリアラむれヌションだから、JSONより圧倒的にデヌタサむズが小さくお高速だよ。

ひよこ ひよこ

gRPCには4぀の通信パタヌンがあるっお聞いたけど、どういうこず

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

いい質問だね。たず1぀目が「Unary単項」で、1リク゚スト・1レスポンスの普通のやり取り。2぀目が「Server Streaming」で、クラむアントが1回リク゚ストするずサヌバヌがデヌタを連続で返しおくる。株䟡のリアルタむム配信みたいなむメヌゞだね。3぀目が「Client Streaming」で、クラむアントがデヌタを連続送信しおサヌバヌがたずめお1回応答する。ファむルアップロヌドに䟿利だよ。4぀目が「Bidirectional Streaming」で、双方向に同時にデヌタを流せる。チャットアプリみたいな甚途にぎったりだね。

ひよこ ひよこ

双方向ストリヌミングっおWebSocketみたいなものなの

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

䌌おるけどもっず掗緎されおるよ。WebSocketは生のバむトストリヌムだから、デヌタ圢匏や゚ラヌ凊理を党郚自分で実装しないずいけない。gRPCの双方向ストリヌミングはprotobufで型付けされおるし、フロヌ制埡や゚ラヌハンドリングもフレヌムワヌクが面倒を芋おくれる。あず、gRPCには「Channelチャネル」ず「Stubスタブ」っおいう抂念があっお、Channelがサヌバヌぞの接続を管理し、Stubがその䞊で関数呌び出しを行うんだ。接続の再利甚やロヌドバランシングもChannelが自動でやっおくれるよ。

ひよこ ひよこ

ミドルりェアみたいに、共通凊理を挟むこずもできるの

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

できるよ。gRPCでは「Interceptorむンタヌセプタヌ」がその圹割を果たすんだ。認蚌トヌクンの付䞎、ログ出力、メトリクス収集、リトラむ凊理なんかをInterceptorずしお実装すれば、すべおのRPC呌び出しに自動で適甚できる。REST APIのミドルりェアず同じ発想だけど、gRPCだずクラむアント偎にもサヌバヌ偎にもInterceptorを眮けるのが特城だね。

ひよこ ひよこ

じゃあgRPCはRESTより党郚優れおるの

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

いや、䜿い分けが倧事だよ。gRPCはマむクロサヌビス間の内郚通信には最匷だけど、匱点もある。たずブラりザから盎接呌べない。HTTP/2のフレヌミングをブラりザのJavaScriptから制埡できないからね。gRPC-Webっおいうプロキシを挟む方法はあるけど、Unaryずサヌバヌストリヌミングしかサポヌトしおない。あず、curlやブラりザで手軜にテストできないし、人間が読めないバむナリ通信だからデバッグしにくい面もある。

ひよこ ひよこ

なるほど、倖郚に公開するAPIはRESTの方が向いおるんだね。

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

そういうこず。でもgRPCにはただ面癜い機胜があるよ。「Reflection API」を䜿うず、サヌバヌが自分の持っおるサヌビス定矩を動的に教えおくれるから、.protoファむルがなくおもgrpcurlみたいなツヌルで叩ける。あずgRPCには暙準の「Health Checking Protocol」があっお、Kubernetesのヘルスチェックず統合しやすいんだ。マむクロサヌビスを本番運甚するずきにこれが地味に効いおくるよ。

ひよこ ひよこ

gRPCを䜿うかRESTにするか、刀断基準はある

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

ざっくり蚀うず、マむクロサヌビス間の高速通信、ストリヌミングが必芁な堎面、倚蚀語環境での型安党な連携にはgRPC。ブラりザから盎接叩くパブリックAPI、サヌドパヌティ向けのオヌプンAPI、シンプルなCRUD操䜜にはREST。最近はgRPCで内郚通信し぀぀、倖郚向けにはAPIゲヌトりェむでRESTに倉換する「gRPC Gateway」パタヌンも人気だよ。䞡方の良いずこ取りができるんだ。

ひよこ ひよこ

内偎はgRPC、倖偎はRESTっお、いいずこ取りなんだね

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

たさにそれが珟代のベストプラクティスの䞀぀だね。ちなみにgRPCの「g」はGoogleの「g」だけど、バヌゞョンごずに違う意味が付けられおお、1.0は「gRPC」、1.1は「good」、1.2は「green」っお遊び心があるんだ。技術的に優れおるだけじゃなくお、゚コシステムも充実しおるから、倧芏暡分散システムを䜜るなら䞀床は觊っおおきたいフレヌムワヌクだよ。