React、Apollo、GraphQLを使用してリアルタイムアプリケーションを構築しています。私の計画は、コンポーネントがクエリを発行し、その後サブスクリプションに依存して、クライアントキャッシュをバックエンドデータとリアルタイムで一貫性を保つことです。しかし、コンポーネントがアンマウントされたときにサブスクリプションの登録を解除する必要があるため、これが機能するとは思われません。コンポーネントが再度マウントされると、結果はクエリキャッシュからフェッチされるため、サブスクリプションがオフになってから間に発生したすべての変更が失われるため、実際には古くなってしまいます。さらにサブスクリプションをオンにすると、変更が間に合わなかったために結果が乱れることになります。例えばについてReactとApolloでgraphqlサブスクリプションを使用してリアルタイムアプリケーションを作成する
Iは、クエリがある場合、成分Aは、 -
query {
customers {
id
name
phoneNo
}
}
とサブスクリプション: -
subscription customersUpdated {
customersUpdated {
id
name
phoneNo
}
}
をAが最初に取り付けられますときcustomers
クエリが実行されます。結果はキャッシュされます。顧客データへの変更はすべて、サブスクリプションcustomersUpdated
の助けを借りて記録されます。サブスクリプションはすべての顧客を返すのではなく、クエリキャッシュにマージする必要のある変更だけを返すことに注意してください。 Aがアンマウントされると、私はサブスクリプションから退会します。 Aが現在のユーザーに対してアンマウントされている間に、別のユーザーが顧客データを5回変更したとします。 Aが再びマウントされると、これらの5つの変更が失われ、クエリはキャッシュから結果をフェッチします。サブスクリプションは再び開始されますが、データが悪い状態にあるのは、これらの5つの変更が欠落しており、これを取得できないためです。
ここでサブスクリプションを使用するための正しいパターンは何ですか?私はアプリケーションをリアルタイムで動作させたいので、クエリを使った時間ベースの再フェッチを避けようとしています。またリアルタイムでは、すべてのデータを不必要に引き上げるのではなく、変更を取り入れるだけです。
私はfirebaseのようなものをしたかったのですが、すべてがリアルタイムであり、すべてのデータがソケットを介して送信されました。私は今どのようなアプローチをとるべきかを理解しなければならないでしょう。オプションありがとう! サブスクリプションへのさらなる懸念は、各サブスクリプションがサーバーとの新しい接続を開くように見えるということです。つまり、サーバーはあまりにも多くの負荷を処理する必要があります。 1つのソケット接続ですべてを行うことはできませんでしたか? –
サブスクリプションはすべて1つの接続で実行されますが、それぞれに新しい接続があるように見えますか?そして、Firebaseのようなものが欲しいのなら、Firebaseが最善の選択です - GraphQLには同じ機能がありません。すべてがリアルタイムであるオープンソースのソリューションが必要な場合は、Meteorを試すこともできます。 – stubailo
graphqlでgun jsを使用して、リアルタイムのオフラインの最初のアプリケーションを構築する方法はありますか? 接続の問題を再度確認します。私は複数の接続を示すように見えるエラーが発生しました。 –