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

В этом руководстве описывается, как настроить некоторые более сложные аспекты клиентской библиотеки Java. Распространенной закономерностью является то, что многие из этих функций полагаются на базовый 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. Отправьте несколько предварительных запросов к Google Ads API при первом запуске процесса. Например:

    // 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 будет значительно больше, чем этот, тем более при использовании развертываний теневых/теневых jar-файлов. Если вы развертываете jar-файлы вручную, вы можете получить такие ошибки, как:

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

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

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

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

Мавен

mvn dependency:tree

Градл

./gradlew dependencies

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

Мавен

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

Градл

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