Utilizzo avanzato

Questa guida illustra come personalizzare diversi aspetti più avanzati della libreria client Java. Un pattern comune è che molte di queste funzionalità si basano sul Callable sottostante anziché sui metodi standard. In genere, la funzione callable è un buon punto di partenza per cercare altre funzionalità per RPC non documentate qui.

Timeout

La libreria Java fornisce un'interfaccia per impostare i timeout a livello di chiamata. Il valore predefinito viene impostato in base all'impostazione method_config/timeout in googleads_grpc_service_config.json. Imposta un valore inferiore se devi applicare un limite più breve al tempo massimo per una chiamata API.

Per utilizzare questa funzionalità, devi utilizzare direttamente l'oggetto chiamabile. Ad esempio, se viene chiamata GoogleAdsService.searchStream(), il timeout viene impostato come segue:

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

Puoi impostare il timeout su almeno 2 ore, ma l'API potrebbe comunque scadere per le richieste estremamente lunghe e restituire un errore DEADLINE_EXCEEDED. Se si verifica un problema, in genere è meglio suddividere la query ed eseguire i chunk in parallelo. In questo modo si evita la situazione in cui una richiesta in esecuzione prolungata non va a buon fine e l'unico modo per recuperare è attivare di nuovo la richiesta dall'inizio.

Impostazioni di nuovo tentativo

La libreria Java fornisce anche un'interfaccia per la configurazione delle impostazioni di ripetizione a livello di chiamata. Per utilizzare questa funzionalità, devi utilizzare direttamente l'oggetto chiamabile. Ad esempio, se chiami GoogleAdsService.searchStream(), le impostazioni di ripetizione verranno configurate come segue:

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

Ottimizzazione delle prestazioni in fase di avvio

Potresti notare un piccolo ritardo la prima volta che viene creata un'istanza GoogleAdsClient. Questo è dovuto all'interfaccia fluida per i servizi (GoogleAdsClient.getVersionXX()), che carica tutte le classi API contemporaneamente per fornire un meccanismo più pratico per la costruzione delle classi di servizio.

Se le prestazioni della prima richiesta si trovano nel percorso critico per la tua applicazione, devi seguire questi passaggi:

  1. Crea GoogleAdsClient all'avvio, prima di soddisfare le richieste degli utenti.

  2. Invia alcune richieste di riscaldamento all'API Google Ads all'inizio della procedura. Ad esempio:

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

Le richieste di riscaldamento devono essere eseguite una sola volta per processo. Ogni creazione successiva di un client di servizio riutilizzerà automaticamente i classi pre caricati.

Riutilizzo del client di servizio

Se possibile, dovresti riutilizzare le istanze del client di servizio, poiché ogni chiamata a GoogleAdsClient.getVersionXXX().createYYYServiceClient() creerà una nuova connessione TCP.

Devi assicurarti di chiudere il client quando non è più necessario. Questo puoi essere eseguito in un blocco try-with-resources o chiamando close() sul client di servizio.

Se provi a utilizzare un client di servizio chiuso per effettuare richieste API, il metodo del client di servizio restituirà un java.util.concurrent.RejectedExecutionException.

Il deployment di App Engine non riesce se il file JAR è superiore a 32 MB

App Engine ha una quota di 32 MB per ogni file caricato. Il file JAR per google-ads sarà notevolmente più grande, soprattutto se utilizzi i deployment di jar shade/shadow. Se esegui il deployment dei jar manualmente, potresti ricevere errori come:

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

Esegui invece il deployment utilizzando il plug-in Gradle o Maven per App Engine. Ognuno ha un'opzione per enableJarSplitting che suddivide ogni jar in chunk di 10 MB e li carica.

Dipendenze delle ombre

Se il progetto ha dipendenze in conflitto con quelle della libreria, devi esaminarle utilizzando uno dei seguenti comandi, quindi modificarle in base alle esigenze.

Maven

mvn dependency:tree

Gradle

./gradlew dependencies

Se la risoluzione dei conflitti di dipendenza non è fattibile, puoi fare affidamento sulla versione ombreggiata della libreria.

Maven

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

Gradle

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