Кэш с Firebase

Looker Studio имеет собственную систему кэширования отчётов. При создании коннектора вы можете реализовать собственное кэширование, чтобы ускорить создание отчётов и избежать ограничений по скорости APR.

Например, вы создаёте коннектор, предоставляющий исторические данные о погоде за последние 7 дней для определённого почтового индекса. Ваш коннектор становится всё более популярным, но внешний API, из которого вы извлекаете данные, имеет строгие ограничения по частоте обновления. API обновляет данные только ежедневно, поэтому для определённого почтового индекса нет необходимости извлекать одни и те же данные несколько раз в день. Используя это руководство по решению, вы можете реализовать ежедневное кэширование для каждого почтового индекса.

Требования

  • База данных Firebase Realtime . Если у вас нет доступа к ней, создайте проект Google Cloud Platform (GCP) и следуйте руководству по началу работы , чтобы создать собственный экземпляр базы данных Firebase Realtime.
  • Учетная запись службы GCP для чтения и записи данных из базы данных Firebase Realtime.
  • Соединитель сообщества, который извлекает данные из источника.

Ограничения

  • Это решение несовместимо с Looker Studio Advanced Services . При использовании Looker Studio Advanced Services код коннектора в Apps Script не имеет доступа к данным. Поэтому кэширование данных с помощью Apps Script невозможно.
  • Редакторы и читатели отчетов не могут сбросить этот конкретный кэш.

Решение

Реализовать учетную запись службы

  1. Создайте учетную запись службы в вашем проекте Google Cloud.
  2. Убедитесь, что у этой учетной записи службы есть доступ к BigQuery в облачном проекте.
    • Требуемые роли управления идентификацией и доступом (IAM): Firebase Admin
  3. Загрузите JSON-файл, чтобы получить ключи учётных записей служб . Сохраните содержимое файла в свойствах скрипта вашего проекта коннектора. После добавления ключей интерфейс Apps Script должен выглядеть примерно так:
    Сохранение ключей учетной записи службы в свойствах скрипта
  4. Включите библиотеку OAuth2 for Apps Script в свой проект Apps Script.
  5. Реализуйте требуемый код OAuth2 для учетной записи службы:
firestore-cache/src/firebase.js
var SERVICE_ACCOUNT_CREDS = 'SERVICE_ACCOUNT_CREDS';
var SERVICE_ACCOUNT_KEY = 'private_key';
var SERVICE_ACCOUNT_EMAIL = 'client_email';
var BILLING_PROJECT_ID = 'project_id';

var scriptProperties = PropertiesService.getScriptProperties();

/**
 * Copy the entire credentials JSON file from creating a service account in GCP.
 * Service account should have `Firebase Admin` IAM role.
 */
function getServiceAccountCreds() {
  return JSON.parse(scriptProperties.getProperty(SERVICE_ACCOUNT_CREDS));
}

function getOauthService() {
  var serviceAccountCreds = getServiceAccountCreds();
  var serviceAccountKey = serviceAccountCreds[SERVICE_ACCOUNT_KEY];
  var serviceAccountEmail = serviceAccountCreds[SERVICE_ACCOUNT_EMAIL];

  return OAuth2.createService('FirebaseCache')
    .setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth')
    .setTokenUrl('https://accounts.google.com/o/oauth2/token')
    .setPrivateKey(serviceAccountKey)
    .setIssuer(serviceAccountEmail)
    .setPropertyStore(scriptProperties)
    .setCache(CacheService.getScriptCache())
    .setScope([
      'https://www.googleapis.com/auth/userinfo.email',
      'https://www.googleapis.com/auth/firebase.database'
    ]);
}

Реализуйте код для чтения и записи из Firebase

Вы будете использовать REST API Firebase Database для чтения и записи данных в базу данных Firebase Realtime. Следующий код реализует методы, необходимые для доступа к этому API.

Реализовать getData()

Структура существующего кода getData() без кэширования должна выглядеть следующим образом:

firestore-cache/src/without-caching.js
/*
 * This file is only to demonstrate how the `getData()` fucntion would look
 * like without the Firebase Realtime Database caching. It is not a part of
 * the connector code and should not be included in Apps Script / Clasp.
 */

function getData(request) {
  var requestedFields = getFields().forIds(
    request.fields.map(function(field) {
      return field.name;
    })
  );

  var fetchedData = fetchAndParseData(request);
  var data = getFormattedData(fetchedData, requestedFields);

  return {
    schema: requestedFields.build(),
    rows: data
  };
}

Чтобы использовать кэширование в коде getData() , выполните следующие действия:

  1. Определите «фрагмент» или «единицу» данных, которые следует кэшировать.
  2. Создайте уникальный ключ для хранения минимальной единицы данных в кэше.
    Для примера реализации в качестве ключа используется zipcode из configparams .
    Необязательно : для кэширования каждого пользователя создайте составной ключ с базовым ключом и идентификатором пользователя . Пример реализации:
    js var baseKey = getBaseKey(request); var userEmail = Session.getEffectiveUser().getEmail(); var hasheduserEmail = getHashedValue(userEmail); var compositeKey = baseKey + hasheduserEmail;

  3. Если существуют кэшированные данные, проверьте актуальность кэша.
    В этом примере кэшированные данные для конкретного почтового индекса сохраняются с текущей датой. При извлечении данных из кэша дата в кэше сверяется с текущей датой.

    var cacheForZipcode = {
      data: <data being cached>,
      ymd: <current date in YYYYMMDD format>
    }
    
  4. Если кэшированные данные отсутствуют или неактуальны, извлеките данные из источника и сохраните их в кэше.

В следующем примере main.js включает код getData() с реализованным кэшированием.

Пример кода

Дополнительные ресурсы

Коннектор Chrome UX Connector предоставляет доступ к панели управления на основе таблицы BigQuery объёмом около 20 ГБ тысячам пользователей. Этот коннектор использует базу данных Firebase Realtime и службу кэширования скриптов приложений Apps Script Cache Service для двухуровневого кэширования. Подробности реализации см. в коде .