Cách sử dụng nâng cao

Hướng dẫn này trình bày cách tuỳ chỉnh một số khía cạnh nâng cao hơn của Thư viện ứng dụng Java. Một mô hình phổ biến là nhiều tính năng trong số này dựa vào Callable thay vì các phương thức chuẩn. Có thể gọi là thường là nơi phù hợp để tìm các tính năng khác cho mỗi bên bị hạn chế nhưng chưa được ghi nhận vào đây.

Hết giờ

Thư viện Java cung cấp nền tảng để đặt thời gian chờ ở cấp độ mỗi lệnh gọi. Giá trị mặc định được đặt dựa trên chế độ cài đặt method_config/timeout trong googleads_grpc_service_config.json. Hãy đặt một giá trị thấp hơn nếu bạn cần thực thi giới hạn ngắn hơn về thời gian tối đa cho lệnh gọi API.

Để dùng tính năng này, bạn nên trực tiếp dùng đối tượng có thể gọi. Ví dụ: nếu đang gọi GoogleAdsService.searchStream(), thì thời gian chờ sẽ được đặt là:

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

Bạn có thể đặt thời gian chờ thành 2 giờ trở lên, nhưng API vẫn có thể hết thời gian chờ các yêu cầu cực kỳ chạy trong thời gian dài và trả về một Lỗi DEADLINE_EXCEEDED. Nếu đây là vấn đề, thông thường tốt nhất bạn nên chia nhỏ truy vấn và thực thi các đoạn song song; Điều này giúp tránh trường hợp khi yêu cầu đang chạy không thành công và cách duy nhất để khôi phục là kích hoạt yêu cầu lại từ đầu.

Thử cài đặt lại

Thư viện Java cũng cung cấp nền tảng để định cấu hình các chế độ cài đặt thử lại trên cho mỗi cuộc gọi. Để dùng tính năng này, bạn nên trực tiếp dùng đối tượng có thể gọi. Ví dụ: nếu gọi GoogleAdsService.searchStream(), chế độ cài đặt thử lại sẽ được định cấu hình như sau:

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

Tối ưu hoá hiệu suất thời gian khởi động

Bạn có thể nhận thấy độ trễ nhỏ trong lần đầu tiên thực thể GoogleAdsClient đã tạo. Điều này là do giao diện thông suốt của các dịch vụ (GoogleAdsClient.getVersionXX()), sẽ tải tất cả lớp API tại một lần để cung cấp cơ chế thuận tiện hơn cho việc xây dựng các lớp dịch vụ.

Nếu hiệu suất của yêu cầu đầu tiên nằm trên lộ trình quan trọng đối với ứng dụng, bạn nên làm theo các bước sau:

  1. Tạo GoogleAdsClient khi khởi động, trước khi phân phát yêu cầu của người dùng.

  2. Gửi một vài yêu cầu khởi động đến API Google Ads khi quá trình này diễn ra trước bắt đầu. Ví dụ:

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

Bạn chỉ cần chạy yêu cầu khởi động một lần cho mỗi quy trình. Mỗi việc tạo ứng dụng dịch vụ sẽ tự động sử dụng lại các lớp được tải trước.

Sử dụng lại ứng dụng dịch vụ

Bạn nên sử dụng lại các phiên bản ứng dụng khách của dịch vụ nếu có thể vì mỗi lệnh gọi đến GoogleAdsClient.getVersionXXX().createYYYServiceClient() sẽ tạo một giao diện người dùng mới kết nối TCP.

Bạn phải đảm bảo đóng ứng dụng khi không còn cần thiết. Chiến dịch này có thể được thực hiện trong một thử-có-tài-nguyên chặn hoặc bằng cách gọi close() trên ứng dụng dịch vụ.

Nếu bạn cố gắng sử dụng một ứng dụng dịch vụ khép kín để đưa ra yêu cầu API, thì dịch vụ đó sẽ gửi một java.util.concurrent.RejectedExecutionException.

Công cụ ứng dụng không triển khai được nếu tệp JAR > 32 MB

App Engine có hạn mức là 32 MB cho mỗi tệp được tải lên. Tệp JAR cho google-ads sẽ lớn hơn thế này, thậm chí còn hơn cả việc sử dụng lọ bóng/đèn triển khai. Nếu triển khai các tệp jar theo cách thủ công, bạn có thể gặp các lỗi như:

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

Thay vào đó, hãy triển khai bằng AppEngine Trình bổ trợ Gradle hoặc Trình bổ trợ Maven. Mỗi tệp có tuỳ chọn cho enableJarSplitting, sẽ chia mỗi tệp jar thành các phần 10 MB và hãy tải các video đó lên.

Phần phụ thuộc bóng

Nếu dự án của bạn có các phần phụ thuộc xung đột với các phần phụ thuộc của thư viện, bạn nên kiểm tra các phần phụ thuộc của dự án bằng một trong các lệnh sau, sau đó sửa đổi các phần phụ thuộc của dự án nếu cần.

Maven

mvn dependency:tree

Gradle

./gradlew dependencies

Nếu việc giải quyết xung đột phần phụ thuộc không khả thi, bạn có thể dựa vào được tô bóng phiên bản của thư viện.

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'