В этом руководстве описано, как настроить некоторые из более сложных аспектов клиентской библиотеки Java. Распространенная схема заключается в том, что многие из этих функций зависят от базового объекта Callable , а не от стандартных вспомогательных методов. Объект Callable, как правило, является хорошим местом для поиска других функций RPC, не описанных здесь.
Тайм-аут
Библиотека Java предоставляет возможность устанавливать тайм-ауты для каждого вызова отдельно. Значение по умолчанию устанавливается на основе параметра method_config/timeout в файле googleads_grpc_service_config.json . Установите меньшее значение, если вам необходимо установить более короткий лимит на максимальное время для вызова API.
Для использования этой функции вызовите объект Callable напрямую. Например, при вызове GoogleAdsService.searchStream() установите таймаут следующим образом:
try (GoogleAdsServiceClient googleAdsServiceClient =
googleAdsClient.getLatestVersion().createGoogleAdsServiceClient()) {
// Constructs the SearchGoogleAdsStreamRequest.
SearchGoogleAdsStreamRequest request =
SearchGoogleAdsStreamRequest.newBuilder()
.setCustomerId(Long.toString(customerId))
.setQuery("SELECT campaign.id, campaign.name FROM campaign")
.build();
// Executes the API call with a timeout of 5 minutes.
ServerStream<SearchGoogleAdsStreamResponse> stream =
googleAdsServiceClient
.searchStreamCallable()
.call(
request,
GrpcCallContext.createDefault()
.withTimeout(Duration.of(5, ChronoUnit.MINUTES)));
for (SearchGoogleAdsStreamResponse response : stream) {
// Processes the response rows.
}
}
Вы можете установить тайм-аут на 2 часа или более, но API все равно может прервать выполнение очень длительных запросов и вернуть ошибку DEADLINE_EXCEEDED . Если это станет проблемой, обычно лучше разбить запрос на части и выполнять их параллельно; это позволяет избежать ситуации, когда длительный запрос завершается с ошибкой, и единственный способ восстановить его — это запустить запрос заново с самого начала.
Повторить настройки
Библиотека Java также предоставляет возможность настройки параметров повторных попыток на уровне каждого вызова. Для использования этой функции вызовите объект Callable напрямую. Например, при вызове GoogleAdsService.searchStream() настройте параметры повторных попыток следующим образом:
try (GoogleAdsServiceClient googleAdsServiceClient =
googleAdsClient.getLatestVersion().createGoogleAdsServiceClient()) {
SearchGoogleAdsStreamRequest request =
SearchGoogleAdsStreamRequest.newBuilder()
.setCustomerId(Long.toString(customerId))
.setQuery("SELECT campaign.id, campaign.name FROM campaign")
.build();
// 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());
// Issues the streaming search request.
ServerStream<SearchGoogleAdsStreamResponse> stream =
googleAdsServiceClient.searchStreamCallable().call(request, context);
for (SearchGoogleAdsStreamResponse response : stream) {
// Processes the response rows.
}
}
Оптимизация производительности во время запуска
При первом создании экземпляра GoogleAdsClient вы можете заметить небольшую задержку. Это связано с использованием гибкого интерфейса для сервисов ( GoogleAdsClient.getLatestVersion() ), который загружает классы API-сервисов одновременно, обеспечивая удобный механизм для создания клиентов сервисов.
Если производительность первого запроса имеет критическое значение для вашего приложения, выполните следующие действия:
Создайте объект
GoogleAdsClientпри запуске системы, до обработки запросов пользователей.Отправьте несколько предварительных запросов к 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 (ApiException ex) { // Do nothing, we're expecting this to fail. } } }
Запросы на предварительную загрузку необходимо выполнить только один раз для каждого процесса. При каждом последующем создании клиента службы предварительно загруженные классы используются повторно.
Повторное использование клиентских приложений сервиса
По возможности следует повторно использовать экземпляры клиентских служб, поскольку каждый вызов метода GoogleAdsClient.getLatestVersion().createYYYServiceClient() (или метода доступа, специфичного для версии, например, getVersion25() ) создает новое базовое соединение и связанные с ним ресурсы.
Убедитесь, что вы закрываете клиентскую службу, когда она больше не нужна. Это можно сделать в блоке try-with-resources или вызвав метод close() для клиентской службы.
Если вы попытаетесь использовать закрытый клиент сервиса для выполнения запросов к API, метод клиента сервиса выбросит исключение java.util.concurrent.RejectedExecutionException .
Развертывание приложения в App Engine завершается с ошибкой, если размер JAR-файла превышает 32 МБ.
App Engine устанавливает квоту в 32 МБ на каждый загружаемый файл. JAR-файл для google-ads значительно больше, особенно при использовании развертывания теневых JAR-файлов. При ручном развертывании JAR-файлов могут возникать ошибки, например:
ERROR: (gcloud.app.deploy) Cannot upload file [<your-app>/WEB-INF/lib/google-ads-47.0.0.jar],
which has size [66095767] (greater than maximum allowed size of [33554432])
Вместо этого используйте плагин App Engine Gradle или плагин Maven для развертывания. Каждый из этих плагинов предоставляет опцию enableJarSplitting , которая разбивает каждый JAR-файл на фрагменты размером 10 МБ и загружает их.
Теневые зависимости
Если ваш проект имеет зависимости, конфликтующие с зависимостями библиотеки, проверьте иерархию зависимостей вашего проекта с помощью одной из следующих команд, а затем при необходимости измените зависимости вашего проекта (или используйте спецификацию компонентов ):
Мэйвен
mvn dependency:treeГрэдл
./gradlew dependenciesЕсли разрешение конфликтов зависимостей невозможно, вы можете использовать вместо этого версию библиотеки с расширенными зависимостями :
Мэйвен
<dependency> <groupId>com.google.api-ads</groupId> <artifactId>google-ads-shadowjar</artifactId> <version>47.0.0</version> </dependency>
Грэдл
implementation 'com.google.api-ads:google-ads-shadowjar:47.0.0'