gRPCとGraphQL
gRPCという言葉は以前から知っていたのですが、Rest APIの新しい物という認識ぐらいで
あまり良く分かっておりませんでした。
エンジニアたる物
一度使われ所といったことを調べておかないと思い、
メリカリさんの記事を見て、少し理解したので記事にさせて頂きます。
結構ざっくりな説明になりますが、よろしくお願いします。
まず、gRPCはどういう時に使われるのかというと、マイクロサービス間の通信に使われる事が多く、
GraphQLは、フロントエンドとバックエンド間の通信の際に良く使われます。
※ GraphQLとは簡単にいうと、FaceBookが作った新しいAPI通信規格なのですが
クエリーを投げ、必要なデータのみ取得することにより、通信自体が軽くなるようです。
でマイクロサービスでのgRPCとGraphQLの使われ方についてなのですが、
BFF(Backend For Frontend)
という設計で作られることが多くなっているようです。
BFF採用企業
メリカリさんやzozoさん、andpadといった企業さんが利用されています。
BFFはフロントとバックエンド(各マイクロサービス)間に入る
ルーティングみたいなのものです。
その際に、遅いとされるマイクロサービスの速度を改善する為に、
フロントとBFFの通信はGraphQLで、BFFとバックエンド(マイクロサービスで作られた)間の
通信はgRPCで通信することにより、速度が遅くならないでしょという感じです。
BFFの技術選定について
ただ、BFFはフロントとはGraphQLで通信し、バックエンドではgRPCとやりとりする必要がある為、
BFFは、GraphQLとgRPCを両方使える必要があるようです。
その為、BFFはnode.jsのフレームワークのNestJSがよく使われているみたいです。
記事一部抜粋
──効率性と将来性を考えてGraphQLを採用されたのですね。
末田:ライブラリについても言及すると、BFFの実装にはNestJSのGraphQLのモジュールを使用しています。
コードを書いてデコレーターでスキーマ情報を定義し、自動的にスキーマを書き出すコードベースの方式を採用しています。
全体としては、BFFサーバーの中でgRPCクライアントを生成し、そこから各マイクロサービスにリクエストして、各フィールドに必要な情報を取得しています。
──なるほど。技術選定の際、NestJS以外の候補はありましたか?
名村:マイクロサービスに対するアクセスとGraphQLのインターフェースを両方カバーしているフレームワークは、NestJS以外にあまりないんですよ。
また、NestJSはJavaのようなDependency Injection(DI)の考えがあるので、DIの仕組みに乗っかっていれば、
マイクロサービスが肥大化してもコード量をたくさん増やさなくてもいい。必要なサービスをGraphQLのリゾルバーで呼び出すことができると思ったので、NestJSを採用しました。
使用する上での制約もありますが、DIのレイヤーで依存関係を構築できたので、NestJSを採用して良かったと思っています。