Кэш с Firebase

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

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