Utilisation avancée

Ce guide explique comment personnaliser plusieurs des aspects les plus avancés de la bibliothèque cliente Java. En règle générale, nombre de ces fonctionnalités reposent sur le Callable sous-jacent plutôt que sur les méthodes standards. L'appelable est généralement un bon endroit pour rechercher d'autres fonctionnalités par RPC qui ne sont pas documentées ici.

Délai avant expiration

La bibliothèque Java fournit une surface pour définir des délais avant expiration au niveau de chaque appel. La valeur par défaut est définie en fonction du paramètre method_config/timeout de googleads_grpc_service_config.json. Définissez une valeur inférieure si vous devez imposer une limite plus courte sur la durée maximale d'un appel d'API.

Pour utiliser cette fonctionnalité, vous devez utiliser directement l'objet appelable. Par exemple, si vous appelez GoogleAdsService.searchStream(), le délai avant expiration est défini comme suit:

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)));
}

Vous pouvez définir le délai avant expiration sur deux heures ou plus, mais l'API peut toujours dépasser le délai des requêtes extrêmement longues et renvoyer une erreur DEADLINE_EXCEEDED. En cas de problème, il est généralement préférable de diviser la requête et d'exécuter les fragments en parallèle. Cela permet d'éviter l'échec d'une requête de longue durée et le seul moyen de récupérer la requête est de la déclencher à nouveau dès le début.

Paramètres des nouvelles tentatives

La bibliothèque Java permet également de configurer des paramètres de nouvelle tentative au niveau de chaque appel. Pour utiliser cette fonctionnalité, vous devez utiliser directement l'objet appelable. Par exemple, si vous appelez GoogleAdsService.searchStream(), les paramètres de nouvelle tentative seront configurés comme suit:

// 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);

Optimisation des performances au démarrage

Vous remarquerez peut-être un léger retard la première fois qu'une instance GoogleAdsClient est créée. Cela est dû à l'interface fluent pour les services (GoogleAdsClient.getVersionXX()), qui charge toutes les classes d'API en même temps afin de fournir un mécanisme plus pratique pour la création de classes de service.

Si les performances de la première requête se trouvent dans le chemin critique de votre application, procédez comme suit:

  1. Créez le GoogleAdsClient au démarrage, avant de diffuser les requêtes des utilisateurs.

  2. Envoyez quelques requêtes de préparation à l'API Google Ads au début du processus. Exemple :

    // 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.
        }
      }
    }
    

Les requêtes de préchauffage ne doivent être exécutées qu'une seule fois par processus. Chaque création ultérieure de client de service réutilisera automatiquement les classes préchargées.

Réutilisation du client de service

Vous devez réutiliser les instances de client de service dans la mesure du possible, car chaque appel à GoogleAdsClient.getVersionXXX().createYYYServiceClient() crée une nouvelle connexion TCP.

Veillez à fermer le client lorsqu'il n'est plus nécessaire. Pour ce faire, vous pouvez utiliser un bloc try-with-resources ou appeler close() sur le client de service.

Si vous tentez d'utiliser un client de service fermé pour effectuer des requêtes API, la méthode du client de service génère une erreur java.util.concurrent.RejectedExecutionException.

Échec du déploiement d'App Engine si le fichier JAR dépasse 32 Mo

App Engine dispose d'un quota de 32 Mo pour chaque fichier importé. Le fichier JAR de google-ads sera considérablement plus volumineux que cela, d'autant plus avec les déploiements de Shadow/JAR. Si vous déployez des fichiers JAR manuellement, vous pouvez obtenir des erreurs telles que:

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])

Effectuez plutôt le déploiement à l'aide du plug-in Gradle ou du plug-in Maven App Engine. Chacun dispose d'une option pour enableJarSplitting, qui divisera chaque fichier JAR en fragments de 10 Mo et les importera à la place.

Dépendances Shadow

Si votre projet comporte des dépendances en conflit avec celles de la bibliothèque, vous devez les inspecter à l'aide de l'une des commandes suivantes, puis les modifier si nécessaire.

Maven

mvn dependency:tree

Gradle

./gradlew dependencies

S'il est impossible de résoudre les conflits de dépendances, vous pouvez plutôt dépendre de la version shaded de la bibliothèque.

Maven

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

Gradle

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