Расширенное использование

В этом руководстве описывается, как настроить некоторые из наиболее продвинутых аспектов клиентской библиотеки Java. Как правило, многие из этих функций опираются на базовый объект Callable , а не на стандартные методы. Объект Callable, как правило, является хорошим местом для поиска других функций RPC, которые здесь не описаны.

Тайм-аут

Библиотека Java предоставляет инструмент для настройки тайм-аутов на уровне отдельных вызовов. Значение по умолчанию устанавливается на основе параметра method_config/timeout в файле googleads_grpc_service_config.json . Если вам нужно ограничить максимальное время вызова API, задайте меньшее значение.

Чтобы использовать эту функцию, необходимо напрямую использовать вызываемый объект. Например, при вызове GoogleAdsService.searchStream() время ожидания будет установлено следующим образом:

try (GoogleAdsServiceClient googleAdsServiceClient =
    googleAdsClient.getLatestVersion().createGoogleAdsServiceClient()) {
  // Constructs the SearchGoogleAdsStreamRequest.
  SearchGoogleAdsStreamRequest request = ...

  // Executes the API call, with a timeout of 5 minutes.
  ServerStream<SearchGoogleAdsStreamResponse> result = googleAdsServiceClient
      .searchStreamCallable()
      .call(request,
          GrpcCallContext.createDefault().withTimeout(Duration.of(5, ChronoUnit.MINUTES)));
}

Вы можете установить тайм-аут на 2 часа или более, но API всё равно может блокировать очень длительные запросы и возвращать ошибку DEADLINE_EXCEEDED . Если это становится проблемой, обычно лучше разбить запрос на части и выполнять их параллельно. Это позволяет избежать ситуации, когда длительный запрос завершается сбоем, и единственный способ восстановиться — запустить его заново с самого начала.

Повторить настройки

Библиотека Java также предоставляет инструмент для настройки параметров повторных попыток на уровне отдельных вызовов. Для использования этой функции необходимо напрямую использовать вызываемый объект. Например, при вызове GoogleAdsService.searchStream() параметры повторных попыток будут настроены следующим образом:

// Creates a context object with the custom retry settings.
GrpcCallContext context = GrpcCallContext.createDefault()
    .withRetrySettings(RetrySettings.newBuilder()
    .setInitialRetryDelay(Duration.ofMillis(10L))
    .setMaxRetryDelay(Duration.ofSeconds(10L))
    .setRetryDelayMultiplier(1.4)
    .setMaxAttempts(10)
    .setLogicalTimeout(Duration.ofSeconds(30L))
    .build());

// Creates and issues a search Google Ads stream request.
ServerStream<SearchGoogleAdsStreamResponse> stream =
    googleAdsServiceClient.searchStreamCallable().call(request, context);

Оптимизация производительности времени запуска

При первом создании экземпляра GoogleAdsClient может возникнуть небольшая задержка. Это связано с текущим интерфейсом для сервисов ( GoogleAdsClient.getVersionXX() ), который загружает все классы API одновременно, обеспечивая более удобный механизм конструирования классов сервисов.

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

  1. Создайте GoogleAdsClient при запуске, перед обслуживанием пользовательских запросов.

  2. Отправьте несколько проверочных запросов к API Google Ads при первом запуске процесса. Например:

    // Runs some warm-up requests.
    try (GoogleAdsServiceClient googleAdsServiceClient =
        googleAdsClient.getLatestVersion().createGoogleAdsServiceClient()) {
      // Runs 5 warm-up requests. In our profiling we see that 90% of performance
      // loss is only experienced on the first API call. After 3 subsequent calls we
      // saw a negligible improvement in performance.
      for (int i = 0; i < 5; ++i) {
        // Warm-up queries are run with a nonexistent CID so the calls will fail. If
        // you have a CID that you know will be accessible with the OAuth
        // credentials provided you may want to provide that instead and avoid the
        // try-catch.
        try {
          googleAdsServiceClient.search("-1", "Warm-up query");
        } catch (GoogleAdsException ex) {
          // Do nothing, we're expecting this to fail.
        }
      }
    }
    

Прогревочные запросы достаточно выполнить только один раз для каждого процесса. Каждое последующее создание клиента сервиса будет автоматически использовать предустановленные классы.

Повторное использование клиента службы

По возможности следует повторно использовать экземпляры клиента службы, поскольку каждый вызов GoogleAdsClient.getVersionXXX().createYYYServiceClient() будет создавать новое TCP-соединение.

Необходимо убедиться, что клиент закрыт, когда он больше не нужен. Это можно сделать в блоке try-with-resources или вызвав close() в клиенте сервиса.

Если вы попытаетесь использовать закрытый клиент службы для выполнения запросов API, метод клиента службы выдаст исключение java.util.concurrent.RejectedExecutionException .

Невозможно развернуть движок приложения, если JAR-файл > 32 МБ

В App Engine квота на каждый загружаемый файл составляет 32 МБ. JAR-файл для google-ads будет значительно больше, особенно при использовании развёртываний с использованием Shade/Shadow JAR. При развёртывании JAR-файлов вручную могут возникнуть следующие ошибки:

ERROR: (gcloud.app.deploy) Cannot upload file [<your-app>/WEB-INF/lib/google-ads-39.0.0.jar],
which has size [66095767] (greater than maximum allowed size of [33554432])

Вместо этого используйте плагин AppEngine Gradle или плагин Maven . У каждого из них есть опция enableJarSplitting , которая разделит каждый JAR-файл на фрагменты по 10 МБ и загрузит их.

Теневые зависимости

Если в вашем проекте есть зависимости, конфликтующие с библиотекой, вам следует проверить зависимости вашего проекта с помощью одной из следующих команд, а затем при необходимости изменить зависимости вашего проекта.

Maven

mvn dependency:tree

Грейдл

./gradlew dependencies

Если разрешение конфликтов зависимостей невозможно, вы можете вместо этого положиться на затененную версию библиотеки.

Maven

<dependency>
  <groupId>com.google.api-ads</groupId>
  <artifactId>google-ads-shadowjar</artifactId>
  <version>39.0.0</version>
</dependency>

Грейдл

implementation 'com.google.api-ads:google-ads-shadowjar:39.0.0'