RustとGraphQLの連携で高速/シンプルなプログラミングを実現するJuniperとは
これまでメモリーセーフなシステムプログラミング言語として紹介されることが多かった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
ちなみに「どうしてFacebookがGraphQLを作ったのか?」という問いについては、2019年にHalf Moon Bayで行われたOpen Source Leadership Summitで撮影された約10分の短い動画を参照されたい。FacebookがHTML 5に特化しようとしていた段階から、それを見直してネイティブアプリケーションにシフトする際にアプリケーションからWebを経由してデータにアクセスする際に発生する問題点を解決するための方法がGraphQLであったことが理解できる。こちらの動画のスピーカーであるLee Byron氏は、GraphQLをFacebookで立ち上げたエンジニアだ。
Legnitto氏のセッションの前半は、GraphQL Summitに参加したGraphQLに関心がある参加者にRustそのものの説明を行うことに費やされた。これはGraphQL自体は知っているが、Rustを知らないエンジニアにその良さを理解して欲しいということの現れだろう。
Webの開発で用いられるGraphQLにおいては、PHPやPython、そしてRubyによるプログラミングを経験しているという想定を元にして実行速度、そしてガベージコレクションがないこと、メモリー消費量が少ないというのは大きなアピールポイントだ。
Rustが強い型付けをデフォルトとするシステムであり、メモリーセーフ、スレッドセーフであることを次に説明。またエラーハンドリングがExplicitであり、プログラマーがエラーをちゃんと対処する必要があることはこの後の説明でも繰り返し解説された。
3つ目の特徴であるPractical(実用的)という部分に関しては、Rustの実行形式ファイルがシングルバイナリーであり、依存するライブラリーをパッケージングする必要がないこと、JVMのような仮想マシン型ランタイムが不要なことなどを挙げた。またWindows、Linux、iOSなどさまざまなプラットフォームで実行できること、ブラウザでさまざまなコードの実行を可能にするWebAssemblyなどにも言及して幅広い実行環境を強調した。特にこれからのサーバーレスの時代を見据えて、ファンクションとして実行されるコードが小さくできるというのは大きなアドバンテージだろう。
またさまざまな企業においてRustの利用が拡がっていることを説明したが、Rustの開発母体であるMozilla、AWSのサーバーレス実装、Lambdaの仮想マシン、Googleが開発を進めるLinuxカーネルを使わない新OSのFuchsia、Chrome OSなど、かなり具体的に例を挙げていることはポイントだろう。
そしてここからRustとGraphQLについての説明が始まった。
説明の例として挙げたのは、GraphQLのスキーマとRustのオブジェクトの類似点だ。この例ではGraphQLにおいてPersonというオブジェクトにemailとageという属性が定義されているのに対して、それをRustのオブジェクトとして定義する際に「email:String」「age:i32」と記述することを比較している。最初の「#[derive(GraphQLobject)]」という文によって、これがGraphQLのスキーマであるということを宣言している。これはLegnitto氏が開発をリードしているJuniperの機能であるが、GraphQLとRustを使うエンジニアのハードルを下げようとする努力の一つだろう。
そしてRustにおいてコメントが重要視されていることを示すために、CargoというRust公式のビルドツールを紹介した。
この例ではRustのコードに書かれたコメント、この場合はスラッシュ3つで始まるDoc Commentによって、Cargoがドキュメントを生成していることを解説した。
このコメントがCargoによってドキュメントとして生成された例が次のスライドだ。ドキュメントのためのコメントにはmarkdownが利用できることもエンジニアにとっては使いやすいポイントだろう。
さらにドキュメントがオマケとして扱われていない例として、「#![deny(missing_docs)]」という属性を定義することによって、ドキュメントがないコードにおいてコンパイルが失敗するという仕様になっていることを解説した。
またエラーメッセージが「どこにコメントがないのか?」を明示してくれることを解説し、Rustのコンパイラーが非常にユーザーフレンドリーであることを強調した。
さらにコメントの中にテストコードを記述することも可能であり、「cargo test」というコマンドでテストが実行できるという機能も紹介。
またコードがアップデートされるなかで「この変数は今後使われなくなるので、他の変数を利用しろ」といった互換性を維持しながら新しいコードに移行する際に便利な機能も紹介された。これは「#[deprecated」という属性を設定することで、「何を代わりに使えば良いのか?」をそのコードを利用する別のプログラマーに明示できる機能だ。さらにGraphQLにも同等の機能が存在することを紹介し、RustとGraphQLが同じように使えることを説明した。
他にもローレベルのシステムプログラミング言語でありながら、アプリケーション開発者にとっても便利な機能も解説され、RustとGraphQLの相性の良さを強調した形になった。
またREST APIによるSQLアクセスで問題になるN+1問題についても、予めデータを読み込むためのライブラリーが紹介され、GraphQLがREST APIの問題点を解決しながら、着実にエコシステムを拡げていることを説明した。
Rustはメモリーセーフなシステムプログラミング言語として注目されているが、GraphQLと組み合わせることで、高速な実行とシンプルな記述というプログラマーにとっては得難い2つの特徴を同時に獲得していることはもっと注目されるべきだろう。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- 高速でメモリーセーフなプログラミング言語、Rustの特徴を紹介
- RustConfで見えてきたRustプロジェクトが最も大事にする価値とは?
- GoogleがAndroidの開発にRustを使った事例を解説するRust Dayを開催
- Microsoftの年次イベントBuild 2020でメモリーセーフなプログラミング言語Rustを紹介
- データ処理ライブラリーの並列化/高速化をRustによって実装したWeld
- DropboxがコアサービスをRustで書き換えた背景とは
- Rustと非同期ライブラリーTokioで作成した簡易版Redisを紹介
- Open Source Leadership Summit開催 FoundationモデルはOSSのインキュベーションのコアとなる
- IBMがRustを使ってNode.jsのプロジェクトを書き換え。その背景とは?
- 「TAURI」をはじめる前に -「Rust」の基礎と開発環境の構築