PR

RustとGraphQLの連携で高速/シンプルなプログラミングを実現するJuniperとは

2020年7月8日(水)
松下 康之 - Yasuyuki Matsushita
Facebookが開発したGraphQLが実はRustと相性が良いことを解説した発表を紹介する。

これまでメモリーセーフなシステムプログラミング言語として紹介されることが多かったRustだが、このメモリーに関連する脆弱性に対して安全であるという特徴に加え、高速に実行できることやガベージコレクションが発生しないといった特徴も備えている。これらの特徴から、RustはWebのシステムにも十分に応用できると言える。

そしてWebでのアプリケーション開発にはサーバー側との通信はもちろんだが、それに加えてWebのフレームワークやデータアクセスライブラリーとのインテグレーションが必須となる。

一方Webアプリケーションにおいてデータのやり取りにはREST APIが使われてきたが、それをより効率的にしようとしてFacebookが開発したのがGraphQLだ。REST APIはWebがダイナミックに進化するにつれてさまざまなサイズのデバイスをサポートするためにも利用されるようになった。その半面、巨大なサイトにおけるエンドポイントの肥大などの問題点を抱えるようにもなった。

GraphQLは、REST APIが抱えるこのような問題を解決するためのスキーマ言語だ。Facebookによって2018年にオープンソースソフトウェアとして公開されたGraphQLは、クライアントからのリクエストをシンプルに記述できるのが最大の利点だろう。

そのGraphQLをRustから利用するためのライブラリーがJuniperであり、API ServerとしてWebサーバーの後ろで稼働する。またGraphiQLというグラフィカルなIDEもバンドルされているために、開発はスムーズに行える。

これから紹介するセッションは2019年のGraphQL Summitで行われたもので、スピーカーはChristian Legnitto氏だ。Legnitto氏はRobinhoodという金融サービスを提供するベンチャーのエンジニリング部門のトップだが、過去にはApple、Mozilla、Facebookで働いた経験を持つエンジニアだ。

動画:Rust and GraphQL: A match made in heaven

GraphQLとRustを紹介するLegnitto氏

GraphQLとRustを紹介するLegnitto氏

ちなみに「どうしてFacebookがGraphQLを作ったのか?」という問いについては、2019年にHalf Moon Bayで行われたOpen Source Leadership Summitで撮影された約10分の短い動画を参照されたい。FacebookがHTML 5に特化しようとしていた段階から、それを見直してネイティブアプリケーションにシフトする際にアプリケーションからWebを経由してデータにアクセスする際に発生する問題点を解決するための方法がGraphQLであったことが理解できる。こちらの動画のスピーカーであるLee Byron氏は、GraphQLをFacebookで立ち上げたエンジニアだ。

動画:Brief History of GraphQL

Lee Byron氏を紹介するLegnitto氏

Lee Byron氏を紹介するLegnitto氏

Legnitto氏のセッションの前半は、GraphQL Summitに参加したGraphQLに関心がある参加者にRustそのものの説明を行うことに費やされた。これはGraphQL自体は知っているが、Rustを知らないエンジニアにその良さを理解して欲しいということの現れだろう。

最初に挙げたRustの特徴は高性能であること

最初に挙げたRustの特徴は高性能であること

Webの開発で用いられるGraphQLにおいては、PHPやPython、そしてRubyによるプログラミングを経験しているという想定を元にして実行速度、そしてガベージコレクションがないこと、メモリー消費量が少ないというのは大きなアピールポイントだ。

信頼性を次の特徴に挙げて説明

信頼性を次の特徴に挙げて説明

Rustが強い型付けをデフォルトとするシステムであり、メモリーセーフ、スレッドセーフであることを次に説明。またエラーハンドリングがExplicitであり、プログラマーがエラーをちゃんと対処する必要があることはこの後の説明でも繰り返し解説された。

3つ目の特徴は実用的であること

3つ目の特徴は実用的であること

3つ目の特徴であるPractical(実用的)という部分に関しては、Rustの実行形式ファイルがシングルバイナリーであり、依存するライブラリーをパッケージングする必要がないこと、JVMのような仮想マシン型ランタイムが不要なことなどを挙げた。またWindows、Linux、iOSなどさまざまなプラットフォームで実行できること、ブラウザでさまざまなコードの実行を可能にするWebAssemblyなどにも言及して幅広い実行環境を強調した。特にこれからのサーバーレスの時代を見据えて、ファンクションとして実行されるコードが小さくできるというのは大きなアドバンテージだろう。

Rustを利用している企業の例

Rustを利用している企業の例

またさまざまな企業においてRustの利用が拡がっていることを説明したが、Rustの開発母体であるMozilla、AWSのサーバーレス実装、Lambdaの仮想マシン、Googleが開発を進めるLinuxカーネルを使わない新OSのFuchsia、Chrome OSなど、かなり具体的に例を挙げていることはポイントだろう。

そしてここからRustとGraphQLについての説明が始まった。

RustとGraphQLの類似点を最初に説明

RustとGraphQLの類似点を最初に説明

説明の例として挙げたのは、GraphQLのスキーマとRustのオブジェクトの類似点だ。この例ではGraphQLにおいてPersonというオブジェクトにemailとageという属性が定義されているのに対して、それをRustのオブジェクトとして定義する際に「email:String」「age:i32」と記述することを比較している。最初の「#[derive(GraphQLobject)]」という文によって、これがGraphQLのスキーマであるということを宣言している。これはLegnitto氏が開発をリードしているJuniperの機能であるが、GraphQLとRustを使うエンジニアのハードルを下げようとする努力の一つだろう。

そしてRustにおいてコメントが重要視されていることを示すために、CargoというRust公式のビルドツールを紹介した。

RustのビルドツールでありパッケージマネージャーでもあるCargo

RustのビルドツールでありパッケージマネージャーでもあるCargo

この例ではRustのコードに書かれたコメント、この場合はスラッシュ3つで始まるDoc Commentによって、Cargoがドキュメントを生成していることを解説した。

Rustに書かれたDoc Comment

Rustに書かれたDoc Comment

このコメントがCargoによってドキュメントとして生成された例が次のスライドだ。ドキュメントのためのコメントにはmarkdownが利用できることもエンジニアにとっては使いやすいポイントだろう。

Cargoによって生成されたドキュメントの例

Cargoによって生成されたドキュメントの例

さらにドキュメントがオマケとして扱われていない例として、「#![deny(missing_docs)]」という属性を定義することによって、ドキュメントがないコードにおいてコンパイルが失敗するという仕様になっていることを解説した。

ドキュメントコメントがないとコンパイルできない設定

ドキュメントコメントがないとコンパイルできない設定

またエラーメッセージが「どこにコメントがないのか?」を明示してくれることを解説し、Rustのコンパイラーが非常にユーザーフレンドリーであることを強調した。

エラーメッセージの例

エラーメッセージの例

さらにコメントの中にテストコードを記述することも可能であり、「cargo test」というコマンドでテストが実行できるという機能も紹介。

使い方をテストコードと一緒にコメントとして書ける

使い方をテストコードと一緒にコメントとして書ける

またコードがアップデートされるなかで「この変数は今後使われなくなるので、他の変数を利用しろ」といった互換性を維持しながら新しいコードに移行する際に便利な機能も紹介された。これは「#[deprecated」という属性を設定することで、「何を代わりに使えば良いのか?」をそのコードを利用する別のプログラマーに明示できる機能だ。さらにGraphQLにも同等の機能が存在することを紹介し、RustとGraphQLが同じように使えることを説明した。

他にもローレベルのシステムプログラミング言語でありながら、アプリケーション開発者にとっても便利な機能も解説され、RustとGraphQLの相性の良さを強調した形になった。

またREST APIによるSQLアクセスで問題になるN+1問題についても、予めデータを読み込むためのライブラリーが紹介され、GraphQLがREST APIの問題点を解決しながら、着実にエコシステムを拡げていることを説明した。

Rustはメモリーセーフなシステムプログラミング言語として注目されているが、GraphQLと組み合わせることで、高速な実行とシンプルな記述というプログラマーにとっては得難い2つの特徴を同時に獲得していることはもっと注目されるべきだろう。

著者
松下 康之 - Yasuyuki Matsushita
フリーランスライター&マーケティングスペシャリスト。DEC、マイクロソフト、アドビ、レノボなどでのマーケティング、ビジネス誌の編集委員などを経てICT関連のトピックを追うライターに。オープンソースとセキュリティが最近の興味の中心。

連載バックナンバー

Think IT会員サービス無料登録受付中

Think ITでは、より付加価値の高いコンテンツを会員サービスとして提供しています。会員登録を済ませてThink ITのWebサイトにログインすることでさまざまな限定特典を入手できるようになります。

Think IT会員サービスの概要とメリットをチェック

他にもこの記事が読まれています