Пожарный магазин стал лучше
Firebase Firestore недавно был улучшен, и теперь в нем реализована новая функция под названием «Пакеты данных Firestore». Основная концепция заключается в том, что запросы Firestore теперь могут быть упакованы в двоичный формат и обслуживаться через ваш CDN или другое решение для хостинга. Фактически это означает, что определенная группа ваших данных может хорошо подходить для получения не напрямую из серверной части Firestore, а скорее из CDN, и, таким образом, может сэкономить вам некоторые затраты.
Но почему? И что еще важнее, как ?!
«Пакеты данных Firestore» на самом деле разработаны очень просто:
- вы сначала создаете ссылку на «пакет данных» в серверной среде через Admin SDK.
- затем этот пакет загружается стандартными запросами Firestore
- то, что у вас есть, - это буфер этих данных, который может быть сохранен, например, в виде файла или в вашем CDN.
- переключившись на клиентскую сторону, теперь осталось использовать новый Firestore API для фактической загрузки пакета из вашего CDN.
// On your server ....
/**
* Generate a buffered bundle for user tempaltes.
*/
async function getUserTemplatesBundle(){
// Create a bundle with ID 'user-templates'.
const bundle = firestore.bundle("user-templates");
// A plain Firestore-query.
const snap = await firestore.collection('user-templates').get();
return bundle
.add('user-templates-query', snap)
.build();
}
// ... then store the buffer, e.g. in your CDN ...
// On your client
import firebase from "firebase/app";
import "firebase/firestore";
import "firebase/firestore/bundle";
// ... init 'firestore' ...
async function loadFirestoreBundle() {
// Just a simplified call to our demo CDN
// to fetch the bundle in binary form.
const rawBundle = await fetchBundleFromCDN();
// Now tell Firestore to load the bundle
await firestore.loadBundle(rawBundle);
// Now get a reference to the bundled query, in
// our case it's only one query that got bundled.
const query = await db.namedQuery('user-templates-query');
// Use 'cache' as source so that the data gets
// cached locally - no Firestore queries will
// be executed.
const snap = await query.get({ source: 'cache' });
// Finally, you can handle the snap like every other
// Firestore snap in your app.
}
Преимущество такого пакета данных становится яснее, если посмотреть на пример. Представьте, что вы часто используете набор значений по умолчанию для нового документа в Firestore, например, при создании нового пользователя. Вместо прямого извлечения из базы данных теперь вы можете использовать «Пакеты данных Firestore» для загрузки этих значений в виде кэшированного документа из вашего CDN, избегая любых затрат, связанных с запросом Firestore.
Таким образом, эта новая функция лучше всего подходит для документов, которые соответствуют следующим требованиям: данные не часто меняются, количество документов не очень велико, и для этого набора данных будет часто выполняться много выборок.
Другой пример из реального мира
В качестве идеального варианта использования вы также можете взять это прогрессивное веб-приложение в качестве примера. Все переведенные тексты хранятся в экземпляре Firestore, как и URL-ссылки на все аудиофайлы. Поскольку эти данные не сильно меняются, если вообще меняются, они очень хорошо подходят для кеширования в Firebase Storage или в моем CDN. Это потенциально может значительно снизить мои расходы на Firestore.
«Пакеты данных Firestore» - очень хорошее дополнение к Firebase. На данный момент они могут не охватывать ваши варианты использования, но могут стать очень полезными, когда ваш сервис начнет расти.