Esta guía describe cómo personalizar varios de los aspectos más avanzados de la
biblioteca cliente de Java. Un patrón común es que muchas de estas funciones se basan en el
Callable
subyacentes en lugar de los métodos estándar. La función que admite llamadas es
por lo general, es un buen lugar para buscar otras funciones por RPC que no están documentadas
aquí.
Tiempo de espera
La biblioteca de Java proporciona una plataforma para configurar los tiempos de espera a nivel de cada llamada.
El valor predeterminado se establece según la configuración de method_config/timeout
en
googleads_grpc_service_config.json.
Establece un valor más bajo si necesitas aplicar un límite más corto en el tiempo máximo de
una llamada a la API.
Para usar esta función, debes usar directamente el objeto que admite llamadas. Por ejemplo,
Si llamas a GoogleAdsService.searchStream()
, el tiempo de espera se establecerá de la siguiente manera:
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)));
}
Puedes establecer el tiempo de espera en 2 horas o más, pero es posible que se agote el tiempo de espera de la API
solicitudes de larga duración y muestran
Error DEADLINE_EXCEEDED
.
Si esto se convierte en un problema, suele ser mejor dividir la consulta
ejecutar los fragmentos en paralelo; esto evita la situación en la que un largo
la solicitud en ejecución falla y la única forma de recuperarla es activar la solicitud
de nuevo desde el principio.
Configuración de reintentos
La biblioteca de Java también proporciona una plataforma para definir la configuración de reintentos en una
nivel por llamada. Para usar esta función, debes usar directamente el objeto que admite llamadas.
Por ejemplo, si llamas a GoogleAdsService.searchStream()
, la configuración de reintento
se configuraría de la siguiente manera:
// 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);
Optimización del rendimiento del tiempo de inicio
Es posible que notes una pequeña demora la primera vez que se ejecute una instancia de GoogleAdsClient
crear. Esto se debe a la fluidez de la interfaz para los servicios
(GoogleAdsClient.getVersionXX()
), que carga todas las clases de API en
una vez para brindar un mecanismo más conveniente para construir
las clases de servicio.
Si el rendimiento de la primera solicitud se encuentra en la ruta crítica de tu aplicación debes seguir estos pasos:
Crea el
GoogleAdsClient
en el inicio, antes de entregar las solicitudes de los usuarios.Enviar algunas solicitudes de preparación a la API de Google Ads cuando el proceso se complete por primera vez comienza el ciclo de vida. Por ejemplo:
// 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. } } }
Las solicitudes de preparación solo se deben ejecutar una vez por proceso. Cada uno la creación de clientes de servicio reutilizará automáticamente las clases precargadas.
Reutilización del cliente de servicios
Debes reutilizar las instancias de cliente de servicio cuando sea práctico, ya que cada llamada a
GoogleAdsClient.getVersionXXX().createYYYServiceClient()
creará un nuevo
conexión TCP.
Debes asegurarte de cerrar el cliente cuando ya no sea necesario. Esta
se puede hacer en una
prueba-con-recursos
o llamando a close()
en el cliente de servicio.
Si intentas usar un cliente de servicio cerrado para hacer solicitudes a la API, el servicio
del cliente arrojará una java.util.concurrent.RejectedExecutionException
.
App Engine no se puede implementar si JAR > 32 MB
App Engine tiene una cuota de 32 MB para cada archivo subido. El archivo JAR para google-ads
serán considerablemente más grandes que este, incluso más usando sombra/shadow jar
de Google Cloud. Si implementas los jars de forma manual, es posible que recibas errores como los siguientes:
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])
En su lugar, implementa con el comando
Complemento de Gradle
o
complemento de Maven.
Cada uno tiene una opción para enableJarSplitting
, que dividirá cada jar en fragmentos de 10 MB y
subirlos en su lugar.
Dependencias paralelas
Si tu proyecto tiene dependencias que entran en conflicto con las de la biblioteca, deberías inspeccionar las dependencias de tu proyecto con uno de los siguientes comandos, luego, y modificar las dependencias de tu proyecto según sea necesario.
Maven
mvn dependency:tree
Gradle
./gradlew dependencies
Si la resolución de conflictos de dependencias es inviable, puedes depender del sombreado de la biblioteca.
Maven
<dependency> <groupId>com.google.api-ads</groupId> <artifactId>google-ads-shadowjar</artifactId> <version>33.0.0</version> </dependency>
Gradle
implementation 'com.google.api-ads:google-ads-shadowjar:33.0.0'