GraphQLとScala

はじめに

この記事は、Scala Advent Calendar 2017の18日目の記事です。

前日は、esploさんによるslick-codegenの利用例と中身の説明でした。

自分たちのプロジェクトでもGraphQLをCQRS(Command Query Responsibility Segregation)のQuery側として利用できないかを確認してみたかったので、 Advent Calendar駆動で調べてみました。

その中で2つ、ScalaとGraphQLに関することを知ることが出来たので紹介します。

Sangriaについて

GraphQL Advent Calendar 2017Introduction to Sangriaにて紹介しています。

自分たちのプロジェクトではAkka HTTPを利用しているため、そっちのエンドポイントでやっている記事を探していました。

SangriaAkka HTTP

Using Akka HTTP with Sangria as GraphQL backendに詳細な記事がありますので、 そちらを参照してください。 ソースコードは、marioosh/graphql-akka-httpにあります。 Sangria, Akka HTTP, Slick, H2という最小構成で出来ていますので、記事を読みながら試すことが出来ます。

もう少し、複雑なStreamベースなサンプルですと、sangria-graphql/sangria-subscriptions-exampleがあります。 しかし、deprecatedになっている akka.stream.actor.ActorPublisherakka.stream.actor.ActorSubscriberを使って書かれているため、 今後のActorを使わないAkka Streamsベースのパターンについては、自分たちで考える必要があります。

上記のAkka HTTPの考えと組み合わせることで上手く行きそうですが、検証の時間が足りませんでしたので、今後の課題として引き続きやっていければと思います。

Graphcoolについて

Graphcoolは、GraphQLのバックエンドを構築できるサービスです。

Introducing the Graphcool Frameworkの記事でもあるように、 GitHubにOSSとして公開されました。

2017年12月18日時点での最新バージョンは、v0.10.1です。

Graphcool Server にあるように、docker-composeを使ってローカルでも試せるようになっています。

dependencies.scalaを みると、様々なミドルウェアを駆使していることが分かります。

自前でミドルウェアへのアクセスライブラリを作成していたり、ScalaでのGraphQL Clientを作成していたりと、いろいろ勉強になります。

その他のGraphQLのバックエンドのサービスというと、先日発表されたAWS AppSyncの他にも、 Scaphold.ioがあったりします。

バックエンドサービスが何をやっているのか知ることで、自分たちで運用するには何が必要なのか、ツラミ等を知ることが出来るので、 OSSで公開してくれたGraphcoolには感謝しています。

おわりに

出来れば何かしら検証したコードを踏まえつつ説明が出来れば良かったのですが、 知れば知るほど、グラフ構造を持ったオブジェクトとRDBMSの関係、NoSQLの選択、Query側のスケーリング等考えなければいけないことが増えていき、 検証が進まなくなってしまったので、参照記事の紹介ばかりになってしまいました。

割りとフロントエンドの界隈からGraphQLの話題が上がったりしますが、バックエンドからあまり上がらない理由の一つを知れたような気がします。

とは言え、ScalaとAkkaを使った実際にサービスが運用されているプロダクションのコードを見るのは、とても楽しかったです。