2021-04-08
BFFが何でなぜ使うのか、メリットとデメリットを知ってる限り書いてみる。
BFF(Backends For Frontends). 名前の通り、フロントエンドのためのバックエンド。 デスクトップやモバイルなどの クライアントごとに実装されたAPI Gateway のこと。
ほんで、 API Gateway はまたなに?
API Gateway はクライアント(フロントエンド)とバックエンドのレイヤーに存在して、以下のような機能を持っている。
上記の全てを実装してからこそAPI Gatewayになるわけではない。 認証や認可はSSOなどを実現するために共通して切り出すこともあったり、ルーティングはロードバランサを使って実現したりすることもよくある。
BFF はこの API Gateway
の役割の中で、 APIを複数呼び出して、結果をまとめる 、つまり APIコンポジション をメインとしていると思う。
なぜなら、BFFは クライアントによってBFFのレスポンスが大きく変わる 。
同じマイクロサービスのAPIを使うとしても、クライアントごとに欲しがるレスポンスの形が違うから。
BFF を置くことによって得られるメリットを一つは パフォーマンスの改善 にある。 BFFだけでなく、APIコンポジションを行う API Gateway なら共通して得られるメリット。
BFFを置かなく、クライアントでAPIコンポジションを行うことを想定してみよう。 その場合、クライアントは複数のAPIを叩くことになり、大量のリクエストをすることになる。 BFFでAPIコンポジションを行うのであれば、クライアントからのリクエストは 1回 になるので簡単。 それにクライアントで欲しがる形でデータを返してくれるのでクライアント側でデータの操作がなくなるので、コードがシンプルになる。
また、 BFF を置くと、クライアントからAPIを隠せる ようになる。 複数のAPIが存在する際に、それらのAPIを直接叩いたり、データをまとめるのはBFFで行われるのでクライアントではBFFの位置だけ知っていればデータがもらえる。
クラインととAPIをもっと厳密に切り離すことができるので、メンテナンスはより簡単になる。
BFFも一つのマイクロサービスなので、 BFF自体の開発コスト もやはりかかってしまう。 基本的にBFFにはビジネスロジックはなく、簡単な操作しかないが、マイクロサービスである以上は当然テストも必要になってくる。
しかし、個人的に会社で開発する際に BFF自体の開発コスト はそこまで気になりはしなかった。 上にも書いたが、BFFにはビジネスロジックはない ので、テストやE2Eも簡単で、実装自体も結構簡単に済むことが多いイメージ。
BFFはクライアントと近いので下手するとクライアントに大きい影響が出てしまう。 基本的に全てのサービスがそうだが、BFFは特に実装の漏れや不具合が ユーザに直接的な影響をもたらしてしまう ので注意が必要。
また、BFFは複数のAPIを叩くので、一部のデータが欠落しているケースは考慮して設計しないといけない あるAPIのレスポンスがあまりにも帰ってこない場合は、その他のデータだけを返すとか、そもそも早めにエラーを返すかなどは考えるべき。これもBFFに限っての話してはないが、常に意識はする必要がある。