Zaawansowane użycie

W tym przewodniku opisujemy, jak dostosować niektóre zaawansowane aspekty biblioteki klienta Java. Wspólnym wzorcem jest to, że wiele z tych funkcji opiera się na Callable, a nie na standardowych metodach. Funkcja callable jest zazwyczaj dobrym miejscem do szukania innych funkcji RPC, które nie są opisane tutaj.

Czas oczekiwania

Biblioteka Java umożliwia ustawienie limitów czasu na poziomie wywołania. Wartość domyślna jest ustawiana na podstawie ustawienia method_config/timeout w pliku googleads_grpc_service_config.json. Jeśli chcesz narzucić krótszy limit czasu na wywołanie interfejsu API, ustaw niższą wartość.

Aby korzystać z tej funkcji, należy użyć bezpośrednio obiektu wywoływalnego. Jeśli na przykład wywołujesz funkcję GoogleAdsService.searchStream(), czas oczekiwania jest ustawiany w ten sposób:

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

Czas oczekiwania możesz ustawić na co najmniej 2 godziny, ale interfejs API może nadal przerywać bardzo długie żądania i zwracać błąd DEADLINE_EXCEEDED. Jeśli to staje się problemem, najlepiej jest podzielić zapytanie i wykonywać fragmenty równolegle. Dzięki temu unikniesz sytuacji, w której długotrwałe żądanie się nie powiedzie i jedynym sposobem na przywrócenie go będzie ponowne wywołanie żądania od początku.

Ustawienia ponownego próby

Biblioteka Java udostępnia też interfejs do konfigurowania ustawień ponownych prób na poziomie wywołania. Aby korzystać z tej funkcji, należy użyć bezpośrednio obiektu wywoływalnego. Jeśli na przykład wywołujesz funkcję GoogleAdsService.searchStream(), ustawienia ponownego próbowania będą wyglądać tak:

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

Optymalizacja czasu uruchamiania

Możesz zauważyć niewielkie opóźnienie podczas tworzenia instancji GoogleAdsClient. Wynika to z płynnego interfejsu usług (GoogleAdsClient.getVersionXX()), który wczytuje wszystkie klasy interfejsu API naraz, aby zapewnić wygodniejszy mechanizm tworzenia klas usług.

Jeśli wydajność pierwszego żądania znajduje się na ścieżce krytycznej aplikacji, wykonaj te czynności:

  1. Utwórz GoogleAdsClient podczas uruchamiania, zanim obsłużysz żądania użytkowników.

  2. Wysyłaj kilka żądań rozgrzewających do interfejsu Google Ads API, gdy proces się rozpocznie. Na przykład:

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

Żądania rozgrzewki trzeba wykonać tylko raz na proces. Każde kolejne utworzenie klienta usługi będzie automatycznie korzystać z wstępnie załadowanych zajęć.

Ponowne użycie klienta usługi

W praktyce należy używać tych samych instancji klienta usługi, ponieważ każde wywołanie funkcji GoogleAdsClient.getVersionXXX().createYYYServiceClient() tworzy nowe połączenie TCP.

Pamiętaj, aby zamknąć klienta, gdy nie jest już potrzebny. Można to zrobić w bloku try-with-resources lub wywołując funkcję close() w kliencie usługi.

Jeśli spróbujesz użyć klienta zamkniętej usługi do wysyłania żądań do interfejsu API, metoda klienta usługi java.util.concurrent.RejectedExecutionException zostanie odrzucona.

Platforma App Engine nie może wdrożyć pliku JAR o rozmaju większym niż 32 MB.

App Engine ma limit 32 MB na każdy przesłany plik. Plik JAR dla google-ads będzie znacznie większy, a jeszcze większy w przypadku wdrożeń z użyciem pliku JAR z cieniowaniem. Jeśli wdrażasz pliki JAR ręcznie, mogą wystąpić takie błędy:

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

Zamiast tego wdróż aplikację za pomocą wtyczki Gradle lub wtyczki Maven. Każdy z nich ma opcję enableJarSplitting, która podzieli każdy plik JAR na fragmenty o długości 10 MB i prześle je zamiast całego pliku.

Zależności cienia

Jeśli Twój projekt ma zależności, które są w sprzeczności z biblioteką, sprawdź zależności projektu za pomocą jednego z tych poleceń, a potem zmień je w razie potrzeby.

Maven

mvn dependency:tree

Gradle

./gradlew dependencies

Jeśli nie można rozwiązać konfliktów zależności, możesz zamiast tego użyć zacieniowanej wersji biblioteki.

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'