はじめに
先日に引き続きGraphQLを一から勉強し直していきます。
前回はこちら。
サブスクリプション
リアルタイムでデータの変更をクライアントに通知する。
クライアントはサーバーにサブスクリプションを登録し、データが変更されるとサーバーから自動的に更新情報が送られる。これにより、クライアントは最新のデータを常に受け取ることが可能となる。
サブスクリプションはpub/subシステムをサーバーに持ち、データの更新があるとメッセージが発行され、それをクライアントに通知する。
サーバー
type Subscription {
reviewCreated: Review
}
クライアント
subscription NewReviewCreated {
reviewCreated {
rating
commentary
}
}
サブスクリプションは1つの操作に対して1つのルートフィールドを持つことしかできない。それぞれの操作に名前をつける必要がある。
# NG
subscription {
reviewCreated {
rating
commentary
}
humanFriendsUpdated {
name
friends {
name
}
}
}
# OK
subscription NewReviewCreated {
reviewCreated {
rating
commentary
}
}
subscription FriendListUpdated($id: ID!) {
humanFriendsUpdated(id: $id) {
name
friends {
name
}
}
}
サブスクリプションはクエリやミューテーションよりも複雑で、特にサーバーを水平スケーリングする場合、各クライアントが特定のサーバーインスタンスにバインドされる必要がある。例えばWebSocketを使用する場合、接続が切れたときに再接続するロジックが必要となる。
更新頻度がそれほど高くないデータについては、定期的なポーリング(クライアントが一定の間隔でサーバーにリクエストを送信する)、モバイル・プッシュ通知、またはクエリの再取得が必要。
参考