Эффективно управляйте данными

Основная функция многих приложений Google Рекламы — получение данных аккаунта для таких сценариев использования, как анализ данных, запросы клиентов и проверки соблюдения политик. При получении данных вам следует оптимизировать использование, чтобы не перегружать серверы Google и не рисковать ограничением скорости. Дополнительные сведения см. в руководствах по ограничению скорости и поддержанию актуального контактного адреса электронной почты .

Кэшируйте свои данные

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

Оптимизируйте частоту запуска отчетов

Google Реклама опубликовала рекомендации относительно актуальности данных и частоты их обновления. Используйте это руководство, чтобы определить, как часто следует получать отчеты.

Если вам необходимо регулярно обновлять аккаунты, мы рекомендуем ограничить количество таких аккаунтов небольшим набором, например, только двадцаткой лучших аккаунтов Google Ads. Остальные можно обновлять с меньшей частотой, например, один-два раза в день.

Оптимизируйте размер ваших отчетов

Ваше приложение должно получать большие объемы данных, а не создавать большое количество небольших отчетов. Фактором, влияющим на этот выбор, являются ограничения счета .

Например, рассмотрим следующий код, который извлекает статистику для определенных групп объявлений и обновляет таблицу базы данных статистики:

  List<long> adGroupIds = FetchAdGroupIdsFromLocalDatabase();

  foreach (long adGroupId in adGroupIds)
  {
    string query = "SELECT ad_group.id, ad_group.name, metrics.clicks, " +
        "metrics.cost_micros, metrics.impressions, segments.date FROM " +
        "ad_group WHERE segments.date DURING LAST_7_DAYS AND " +
        "ad_group.id = ${adGroupId}";
    List<GoogleAdsRow> rows = RunGoogleAdsReport(customerId, query);
    InsertRowsIntoStatsTable(adGroupId, rows);
  }

Этот код хорошо работает на небольшом тестовом аккаунте. Однако Google Ads поддерживает до 20 000 групп объявлений на кампанию и 10 000 кампаний на аккаунт. Поэтому, если этот код выполняется для крупной учетной записи Google Рекламы, он может перегрузить серверы API Google Рекламы, что приведет к ограничению и регулированию скорости.

Лучшим подходом было бы запустить один отчет и обработать его локально. Показан один из таких подходов с использованием карты в памяти.

  Hashset<long> adGroupIds = FetchAdGroupIdsFromLocalDatabase();

  string query = "SELECT ad_group.id, ad_group.name, metrics.clicks, " +
      "metrics.cost_micros, metrics.impressions, segments.date FROM " +
      "ad_group WHERE segments.date DURING LAST_7_DAYS";
  List<GoogleAdsRow> rows = RunGoogleAdsReport(customer_id, query);

  var memoryMap = new Dictionary<long, List<GoogleAdsRow>>();
  for each (GoogleAdsRow row in rows)
  {
    var adGroupId = row.AdGroup.Id;

    if (adGroupIds.Contains(adGroupId))
    {
      CheckAndAddRowIntoMemoryMap(row, adGroupId, memoryMap);
    }
  }
  foreach (long adGroupId in memoryMap.Keys())
  {
    InsertRowsIntoStatsTable(adGroupId, rows);
  }

Это снижает нагрузку на серверы Google Ads API за счет меньшего количества запускаемых отчетов.

Если вы обнаружите, что отчет слишком велик для хранения в памяти, вы также можете разбить запрос на более мелкие группы, добавив предложение LIMIT , например:

SELECT
  ad_group.id,
  ad_group.name,
  metrics.clicks,
  metrics.cost_micros,
  metrics.impressions,
  segments.date
FROM ad_group
WHERE segments.date DURING LAST_7_DAYS
  AND ad_group.id IN (id1, id2, ...)
LIMIT 100000

Метки — это еще один способ группировать сущности и сократить количество запросов к отчетам. Дополнительную информацию см. в руководстве по этикеткам .

Оптимизируйте то, что вы получаете

При создании отчетов вам следует помнить о столбцах, которые вы включаете в свои запросы. Рассмотрим следующий пример, запуск которого запланирован каждый час:

SELECT
  customer.id,
  customer.currency_code,
  campaign.id,
  campaign.name,
  ad_group.id,
  ad_group.name,
  ad_group_criterion.keyword.match_type,
  ad_group_criterion.keyword.text,
  ad_group_criterion.criterion_id,
  ad_group_criterion.quality_info.creative_quality_score,
  ad_group_criterion.system_serving_status,
  ad_group_criterion.negative,
  ad_group_criterion.quality_info.quality_score,
  ad_group_criterion.quality_info.search_predicted_ctr,
  ad_group_criterion.quality_info.post_click_quality_score,
  metrics.historical_landing_page_quality_score,
  metrics.search_click_share,
  metrics.historical_creative_quality_score,
  metrics.clicks,
  metrics.impressions
FROM keyword_view
WHERE segments.date DURING LAST_7_DAYS

Единственные столбцы, которые могут меняться каждый час, — это metrics.clicks и metrics.impressions . Все остальные столбцы обновляются нечасто или вообще не обновляются, поэтому получать их ежечасно крайне неэффективно. Вы можете сохранить эти значения в локальной базе данных и запускать отчет о событиях или статусе изменений , чтобы загружать изменения один или два раза в день.

В некоторых случаях вы можете уменьшить количество загружаемых строк, применив соответствующие фильтры.

Очистите неиспользуемые аккаунты

Если ваше приложение управляет учетными записями сторонних рекламодателей, вам необходимо разрабатывать приложение с учетом оттока клиентов. Вам следует периодически очищать свои процессы и хранилища данных, чтобы удалять учетные записи клиентов, которые больше не используют ваше приложение. При очистке неиспользуемых аккаунтов Google Рекламы учитывайте следующие рекомендации:

  • Отмените разрешение, которое ваш клиент предоставил вашему приложению для управления своей учетной записью.
  • Прекратите вызовы API к аккаунтам Google Рекламы клиента. Это особенно относится к автономным заданиям, таким как задания cron и конвейеры данных, которые предназначены для запуска без вмешательства пользователя.
  • Если клиент отозвал свою авторизацию, ваше приложение должно корректно справиться с ситуацией и избегать отправки недействительных вызовов API на серверы API Google.
  • Если клиент закрыл свой аккаунт Google Рекламы, вам следует обнаружить это и избегать отправки недействительных вызовов API на серверы API Google.
  • Удалите данные, которые вы скачали из аккаунтов Google Рекламы клиента, из своей локальной базы данных по истечении соответствующего периода времени.