Пакеты данных Firestore

Новая реализация для кэшированных документов Firestore

Пожарный магазин стал лучше

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. На данный момент они могут не охватывать ваши варианты использования, но могут стать очень полезными, когда ваш сервис начнет расти.