Chapter 11

【備考】Subscriptionについて

Eringi_V3
Eringi_V3
2021.09.20に更新

今回作成したアプリケーションでは、QueryとMutationのAPIのみを取り扱い、Subscriptionは扱いませんでした。
Apollo Serverの3.x系ではデフォルトでSubscriptionの実装をサポートしていません。
ですが、追加のパッケージをインストールし、Subscription用の実装を行えば実現することは可能です。
https://www.apollographql.com/docs/apollo-server/data/subscription

可能ではあるのですが、いくつか注意点があります。

Apollo ServerのSubscriptionはインメモリのイベントシステムで実装されている

https://www.apollographql.com/docs/apollo-server/data/subscriptions/#the-pubsub-class
例えば、Cloud Runのように複数のコンテナインスタンスでアプリケーションが動いている場合、あるインスタンスAで発行されたイベントは、インスタンスBには通知されないということです。
そのため、コミュニティで作成されたライブラリを選択・導入し、Redisなどの外部のデータストアを通じてイベントのやりとりをするように実装しなければなりません。
これを知っておかないと、思わぬバグに繋がる恐れがありそうなので、十分に注意してください。

WebSocketをサポートしているインフラを選定する必要がある

GraphQLのSubscriptionはWebSocketを使って実現されています。
そのため、WebSocketが使用できる環境でApollo Serverを動かす必要があります。
例えば、Apollo ServerのドキュメントではLambdaでのデプロイ方法が解説されていますが、私が調べた範囲ではLambdaにApollo Serverをデプロイした場合、Subscriptionを使用することはできませんでした。
そのため、開発するアプリケーションでSubscriptionを使う必要がある場合、インフラの選定から注意が必要です。

本当にSubscriptionが必要が見極める

リアルタイム性が重要なチャットがメインのアプリケーションなどであればSubscriptionが必要かもしれません。
しかし、多くの場合Subscriptionは必要ないはずです。
Apolloのドキュメントでも、クライアントからのポーリングやユーザーの何かしらのアクション実行時にフェッチを実行することでカバーできるはずと書いてあります。
https://www.apollographql.com/docs/react/data/subscriptions/#when-to-use-subscriptions

また、Apollo ServerでSubscriptionを実装する場合、前述の通りRedisなどの外部のデータストアを通じてPubSubを実装する必要があり、実装の複雑度が若干増します。
実装をシンプルに保ちたい、難しいことをしたくない場合はもっと楽にSubscriptionが実装できるHasuraやAWS AppSyncの利用を考えてみるのもアリでしょう。