3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

gRPCとGraphQLのマイクロサービスでの使われ方とBFFの技術選定について

Last updated at Posted at 2022-06-18

gRPCとGraphQL

gRPCという言葉は以前から知っていたのですが、Rest APIの新しい物という認識ぐらいで
あまり良く分かっておりませんでした。

エンジニアたる物
一度使われ所といったことを調べておかないと思い、
メリカリさんの記事を見て、少し理解したので記事にさせて頂きます。

結構ざっくりな説明になりますが、よろしくお願いします。

まず、gRPCはどういう時に使われるのかというと、マイクロサービス間の通信に使われる事が多く、
GraphQLは、フロントエンドとバックエンド間の通信の際に良く使われます。

※ GraphQLとは簡単にいうと、FaceBookが作った新しいAPI通信規格なのですが
クエリーを投げ、必要なデータのみ取得することにより、通信自体が軽くなるようです。

でマイクロサービスでのgRPCとGraphQLの使われ方についてなのですが、

BFF(Backend For Frontend)

という設計で作られることが多くなっているようです。

BFF採用企業

メリカリさんやzozoさん、andpadといった企業さんが利用されています。


BFFはフロントとバックエンド(各マイクロサービス)間に入る

ルーティングみたいなのものです。

その際に、遅いとされるマイクロサービスの速度を改善する為に、

フロントとBFFの通信はGraphQLで、BFFとバックエンド(マイクロサービスで作られた)間の
通信はgRPCで通信することにより、速度が遅くならないでしょという感じです。

スクリーンショット 2022-06-18 16.14.57.png

BFFの技術選定について

ただ、BFFはフロントとはGraphQLで通信し、バックエンドではgRPCとやりとりする必要がある為、
BFFは、GraphQLとgRPCを両方使える必要があるようです。

その為、BFFはnode.jsのフレームワークのNestJSがよく使われているみたいです。

スクリーンショット 2022-06-18 15.01.02.png

記事一部抜粋

──効率性と将来性を考えてGraphQLを採用されたのですね。

末田:ライブラリについても言及すると、BFFの実装にはNestJSのGraphQLのモジュールを使用しています。
コードを書いてデコレーターでスキーマ情報を定義し、自動的にスキーマを書き出すコードベースの方式を採用しています。

全体としては、BFFサーバーの中でgRPCクライアントを生成し、そこから各マイクロサービスにリクエストして、各フィールドに必要な情報を取得しています。

──なるほど。技術選定の際、NestJS以外の候補はありましたか?

名村:マイクロサービスに対するアクセスとGraphQLのインターフェースを両方カバーしているフレームワークは、NestJS以外にあまりないんですよ。

また、NestJSはJavaのようなDependency Injection(DI)の考えがあるので、DIの仕組みに乗っかっていれば、
マイクロサービスが肥大化してもコード量をたくさん増やさなくてもいい。必要なサービスをGraphQLのリゾルバーで呼び出すことができると思ったので、NestJSを採用しました。

使用する上での制約もありますが、DIのレイヤーで依存関係を構築できたので、NestJSを採用して良かったと思っています。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?