Open4
お試しCloud Firestore data bundles
これを試す。
静的ファイルとしてビルドした Firestore の QuerySnapshot や DocumentSnapshot をクライアントサイドで読み込み利用するための仕組み。静的ファイルなのでCDNとかを利用できる。
メリットはFirestoreの料金の削減できること。
例えば、不特定多数のユーザーが同じドキュメント(例:ニュースサイトのトップ10の記事)へアクセスするような場合、各ユーザーがドキュメントを読み込むごとに課金される。これはユーザー数が増えれば増えるほど課金が増える。
同様の問題への対策として、Firestoreへのリクエストを Cloud Functions で行い、結果をキャッシュするという方法があったけど、FirestoreのクライアントSDKを経由してデータアクセスできるという点で嬉しい。
この記事もわかりやすい。
bundleファイルの生成とGCSへのアップロード
import * as fs from 'fs'
import * as admin from 'firebase-admin'
const serviceAccount = require('path/to/credential')
admin.initializeApp({
credential: admin.credential.cert(serviceAccount)
})
const BUCKET_NAME = 'xxxx.appspot.com'
const timestamp = new Date().valueOf()
const db = admin.firestore()
const storage = admin.storage
const bundleId = `bundle-${timestamp}`
const snapshot = await db
.collection('User')
.limit(10)
.get()
const buffer = db
.bundle(bundleId)
.add('bundle-users', snapshot)
.build()
const bundledFilePath = `./${timestamp}.txt`
fs.writeFileSync(bundledFilePath, buffer)
const destination = `firestore-data-bundles/${bundleId}.txt`
await storage()
.bucket(BUCKET_NAME)
.upload(bundledFilePath, {
destination,
public: true,
metadata: { cacheControl: `public, max-age=3600` }
})
console.log(
`uploaded to https://storage.googleapis.com/${BUCKET_NAME}/${destination}`
)
https://zenn.dev/moga/articles/firestore-data-bundles をかなり参考にしてる。
TODO
- 出力されるファイルを見てみる
-
admin sdk に存在する
select()
を使った場合 -
add('query', QuerySnapshot).add(DocumentSnapshot)
というようにチェインした場合