最近Apollo GraphQL serverを使っているのでApollo社のメールで知った、GraphQL SummitのOpening Keynoteを観てみました(英語は得意ではないのでYouTubeの自動生成字幕をオンにして、時々巻き戻しながら観ました)。
Keynoteは色々なトピックがありましたが実は初めてApollo Federation(GraphQL Federation)は知りました、しかもApollo FederationはApollo社にとって重要なプロダクトと感じました。またThe Future of Apollo FederationではスピカーにNetflixのエンジニアが出ていたりして、将来につながる重要な技術なのでは?と思いGraphQL Federation(Apollo Federation)で調べてみました。
ちなみに、GraphQL FederationはGraphQLのFederation(連合?)は一般的な概念で、Apollo Federationはその実装の1つです。
Netflixバックエンドの変遷
さて、GraphQL Federationを説明するのにとても参考になる図がNextflixのTechBlog、How Netflix Scales its API with GraphQL Federation (Part 1)にあったので引用させて頂きました。
タイトルにあるように、Netflix社のバックエンド・アーキテクチャの変化の歴史です。
https://netflixtechblog.com/how-netflix-scales-its-api-with-graphql-federation-part-1-ae3557c187e2 より
Monolith
スタートアップ企業なら最初のシステムは、全ての機能が密に結合したモノリシックなシステムから始まると思います。少数の優秀なエンジニアが開発する密に結合したシステムは、非常に高い生産性で開発が進みます。
Direct Acess (Microservices)
しかし企業が成長しサービスも大きくなり、開発者も増えるとモノリシックなシステムはではいろいろな問題が発生し開発スピードも落ちてきます。良く言われる問題点は、①密結合なので一部の変更の影響が他の部分に出やすい、②開発者が増え組織が分割されると組織間の政治的な力関係で開発が歪む、などです。
これらを解決する方法としてマイクロサービスが提唱されています。Netflixもバックエンドをマイクロサービス化しました。
Gateway Aggregation Layer
バックエンドをマイクロサービスに分割した事でバックエンドの開発の生産性は上がりました。しかしフロントエンドは複数のマイクロサービス(API)から情報を取得・更新する必要がりフロントエンドの開発効率は下がってしまいました。
フロントエンドはiOS、Android、Webの3種類のコードがあるので大きな問題です。
そこで、クライアントが使いやすいAPIを提供するゲートウェイ集約レイヤーを追加しました。これはBFF(Backends For Frontends)と呼ばれるものでしょうか(BFFという言葉も最近知りました)。
Federated Gateway
Gateway Aggregation Layerを作ったおかげでクライアント側の開発生産性も上がりました。しかしこのGateway Aggregation Layerが全てのバックエンド・マイクロサービスをクライアントが要求するAPI(GraphQL)へのマッピングを一手に引き受けているので、バックエンドとフロントエンドの要望の板挟みになりコードも膨大になり開発が困難になって行きました(モノリス化)。
ここで、GraphQL Federationを導入しGateway Aggregation Layerを適度なグループに分割し、開発を正常化できました。
めでたしめでたし、めでたしめでたし😁
Apollo Federation
上の説明で、GraphQL Federationの役割はわかったと思います。Apollo FederationはこのGraphQL FederationをApollo GraphQLサーバー上で簡単に実現できる仕掛けです。公式な導入ドキュメントはIntroduction to Apollo Federationに書かれています。またネットを検索すると日本語の記事も少数ですがあるので読んでから公式ドキュメントを読むと良いかも知れません。
紹介動画もあります、説明は早口ですが5分半くらいから始まるデモは、GraphQLを使った事があるプログラマーには理解しやすいと思います。
Apollo Federationは、複数のGraphQLサーバー(マイクロサービス)を組み合わせたGraphQL(API)を作るだけではなく、新たな情報を加えたり、情報を変更したりも出来ます。
まとめ
このように、GraphQLには企業の発展にともなうバックエンドの発展には欠かせないものに成ってきていると思います。以前はGraphQL vs. REST などが話題になっていましたが、現在では新規でバックエンドを作る場合はGraphQLを選択するのが当たり前になってきてると思います。
また、レガシーなシステムを抱えながら進化する必要があるエンタープライズシステムのリニューアルにもGraphQLは役にたつのではないでしょうか。