Persistence

技術メモなど

GraphQL Subscription の調査

GraphQLでSubscriptionを実装する場合、どういう構成になるのかなと思い調べてみました。

GraphQL Subscription Spec

SubscriptionはGraphQL specのJune2018で仕様が策定されています。

https://graphql.github.io/graphql-spec/June2018/#sec-Subscription

仕様で言及されていることはインターフェイスのみで、ネットワークレイヤーの仕様は言及されていません。 GraphQLはあくまでインターフェイスの仕様ということですね。

Implementation

How To GraphQL の Tutorial

https://www.howtographql.com/graphql-js/7-subscriptions/

WebSocketを使っていることが伺えますが、実装はprismaのライブラリにラップされています。 今回はpureなライブラリで実装する方法を知りたかったので深入りはしません。

Tutorial: GraphQL Subscriptions on the Server

Apolloの記事です。

https://blog.apollographql.com/tutorial-graphql-subscriptions-server-side-e51c32dc2951

graphql-subscriptionssubscriptions-transport-ws を使って実装していることがわかります。

こちらもやはりWebSocketです。

他にも色々調べてみましたが、javascriptではこの2つのライブラリがスタンダードと言って良さそうです。

ちなみにこの2つのライブラリはapolloがオーナーですが、apollo専用ではありません。

実装してみる

GraphQLの基本的な部分はサラッと作りたかったので、Apollo Serverを使うことにします。

https://www.apollographql.com/docs/apollo-server/getting-started/

ここまでできたら、 graphql-subscriptions のREADMEを読みながらSubscriptionを組み込みます。

できました。あれ?WebScoketについて何も設定していないのにWebSocketになっている。あとから気づきましたが、 apollo-server を使う場合は、 apollo-server-codegraphql-subscriptionsubscriptions-transport-ws が含まれているので、importは不要なのでした。

まとめ

GraphQL で Subscription を実装する場合、現状ではWebSocketがデファクトスタンダードと言えそうです。

実際にProduction環境で利用するには、以下も必要と思いますのでサンプルを実装してみようと思います。

  • PubSubをスケールさせる方法
  • GraphQLサーバ(WebSocketサーバ)をスケールさせる方法