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-subscriptions と subscriptions-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-code
に graphql-subscriptions
と ubscriptions-transport-ws
が含まれているので、importは不要なのでした。
まとめ
GraphQL で Subscription を実装する場合、現状ではWebSocketがデファクトスタンダードと言えそうです。
実際にProduction環境で利用するには、以下も必要と思いますのでサンプルを実装してみようと思います。
- PubSubをスケールさせる方法
- GraphQLサーバ(WebSocketサーバ)をスケールさせる方法