0

私はNode.jsとFirebaseのクラウドファンクションが新しく、私は自分の質問に特化しようとします。クラウドファンクションHttpリクエストキャッシュされたFirebaseデータベースを返す

私は「スコア」フィールドを含むオブジェクトを持つfirebaseデータベースを持っています。私はそれに基づいてデータを取得したい、それは簡単にクライアント側で行うことができます。

問題は、データベースが大きくなると、返すには時間がかかりすぎるか、多くのリソースを消費するかが心配です。だから私はクラウド機能を使ってhttpサービスを考えていたので、オブジェクトのスコアがリスナーによって変わったときに更新される上位N個のオブジェクトを持つキャッシュを保存します。

次に、クライアント側は、上位NレベルのJsonを受け取るために、https://myexampleprojectroute/givemethetoplevelsのようなものを呼び出すだけです。

これは妥当ですか?もしそうなら、私はそれにどのようにアプローチできますか?このキャッシュを使用するにはどの構造体が必要ですか?また、httpでjson形式で返す方法は?

私はそれをクライアント側でやっていきますが、私はパフォーマンスと学習目的の両方でそれを本当にしたいと思います。

ありがとうございます。

EDIT:

最後に私は最適化を実装していませんでした。その理由は、最初に、firebaseデータベースに "子カウント"が含まれていないため、私は初心者のjavascript知識を使ってその方法を見つけられませんでした。 2番目に、そして最も重要なのは、私はそれが最大10Kのエントリを持ち、数百万にスケールアップされないと確信しています。そして、firebaseはソートされた読み込み最適化のルールを持っています。詳細については、またthis link.

をチェックしてみてください、私は誰かがそれを探している場合にはクラウドの機能を使用してHTTP要求を介してデータベースからデータを取得するための簡単なコードスニペットを投稿します。お役に立てれば!

// Simple Test function to retrieve a json object from the DB 
// Warning: No security methods are being used such authentication, request methods, etc 
exports.request_all_levels = functions.https.onRequest((req, res) => { 
    const ref = admin.database().ref('CustomLevels'); 
    ref.once('value').then(function(snapshot) { 
    res.status(200).send(JSON.stringify(snapshot.val())); 
    }); 
}); 

答えて

2

データの書き込み時にデータを複製することで、読み取りパフォーマンスが向上しています。それは完全に合理的なアプローチです。実際、NoSQLデータベースでは、そのような派生したデータ構造を維持することが非常に一般的です。名前構造も非正規化です。

心に留めておくべきいくつかのこと:

  • クラウド機能は、平均的なクライアントよりもより予測可能な環境で実行しながら、資源はまだ限られています。最新の10項目を決定するために膨大な数の項目を読むことは、依然として最適ではありません。簡単な操作のためには、すべての書き込み操作で派生したデータ構造を最新の状態に保つ必要があります。
  • "最新の10"があり、新しいアイテムが入っている場合は、最も古いアイテムを削除して新しいアイテムを追加します。この方法では、クラウド機能がすべての書き込み時に最新の10件のアイテムのリストを照会するのと比べて、考慮すべき最大11のアイテムがあります。これはO(何かを含む)操作です。
  • 平均化操作と同じです:moving averageは、これまでのデータを一切必要としないため、最もパフォーマンスの高いものです。
+0

ありがとうございました!だから代わりのjs構造を使用する代わりに、私はちょうどデータベースの別のパスでトップXを複製します。私はこれを試してみよう!私はそれが完了したら投稿を更新します! – Carles

関連する問題