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ẫu phổ biến là nhiều tính năng trong số này dựa vào Callable cơ bản thay vì các phương thức tiện lợi tiêu chuẩn. Thông thường, callable là nơi phù hợp để tìm các tính năng khác cho mỗi RPC không được ghi lại ở đây.

Hết giờ

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

Để sử dụng tính năng này, hãy gọi trực tiếp đối tượng Callable. Ví dụ: khi gọi GoogleAdsService.searchStream(), hãy thiết lập thời gian chờ như sau:

try (GoogleAdsServiceClient googleAdsServiceClient =
    googleAdsClient.getLatestVersion().createGoogleAdsServiceClient()) {
  // Constructs the SearchGoogleAdsStreamRequest.
  SearchGoogleAdsStreamRequest request =
      SearchGoogleAdsStreamRequest.newBuilder()
          .setCustomerId(Long.toString(customerId))
          .setQuery("SELECT campaign.id, campaign.name FROM campaign")
          .build();

  // Executes the API call with a timeout of 5 minutes.
  ServerStream<SearchGoogleAdsStreamResponse> stream =
      googleAdsServiceClient
          .searchStreamCallable()
          .call(
              request,
              GrpcCallContext.createDefault()
                  .withTimeout(Duration.of(5, ChronoUnit.MINUTES)));
  for (SearchGoogleAdsStreamResponse response : stream) {
    // Processes the response rows.
  }
}

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

Cài đặt thử lại

Thư viện Java cũng cung cấp một giao diện để định cấu hình chế độ cài đặt thử lại ở cấp độ mỗi lệnh gọi. Để sử dụng tính năng này, hãy gọi trực tiếp đối tượng Callable. Ví dụ: khi gọi GoogleAdsService.searchStream(), hãy định cấu hình chế độ cài đặt thử lại như sau:

try (GoogleAdsServiceClient googleAdsServiceClient =
    googleAdsClient.getLatestVersion().createGoogleAdsServiceClient()) {
  SearchGoogleAdsStreamRequest request =
      SearchGoogleAdsStreamRequest.newBuilder()
          .setCustomerId(Long.toString(customerId))
          .setQuery("SELECT campaign.id, campaign.name FROM campaign")
          .build();

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

  // Issues the streaming search request.
  ServerStream<SearchGoogleAdsStreamResponse> stream =
      googleAdsServiceClient.searchStreamCallable().call(request, context);
  for (SearchGoogleAdsStreamResponse response : stream) {
    // Processes the response rows.
  }
}

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

Bạn có thể nhận thấy một độ trễ nhỏ trong lần đầu tiên tạo thực thể GoogleAdsClient. Điều này là do giao diện trôi chảy cho các dịch vụ (GoogleAdsClient.getLatestVersion()), giao diện này tải các lớp dịch vụ API cùng một lúc để cung cấp một cơ chế thuận tiện cho việc tạo các ứng dụng dịch vụ.

Nếu hiệu suất của yêu cầu đầu tiên nằm trên đường dẫn quan trọng cho ứng dụng của bạn, hãy làm theo các bước sau:

  1. Tạo GoogleAdsClient khi khởi động, trước khi phân phát các 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 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 (ApiException ex) {
          // Do nothing, we're expecting this to fail.
        }
      }
    }
    

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

Tái sử dụng ứng dụng dịch vụ

Bạn nên sử dụng lại các thực thể ứng dụng dịch vụ khi có thể vì mỗi lệnh gọi đến GoogleAdsClient.getLatestVersion().createYYYServiceClient() (hoặc một trình truy cập dành riêng cho phiên bản như getVersion26()) sẽ tạo một kết nối cơ bản mới và các tài nguyên được liên kết.

Hãy nhớ đóng ứng dụng dịch vụ khi không còn cần nữa. Bạn có thể thực hiện việc này trong một khối try-with-resources 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ụ đã đóng để đưa ra các yêu cầu API, phương thức ứng dụng dịch vụ sẽ gửi một java.util.concurrent.RejectedExecutionException.

App Engine không triển khai được nếu JAR > 32 MB

App Engine có hạn mức 32 MB cho mỗi tệp được tải lên. JAR cho google-ads lớn hơn đáng kể so với hạn mức này, đặc biệt là khi sử dụng các lượt triển khai JAR bóng đổ hoặc bóng mờ. Nếu bạn triển khai JAR theo cách thủ công, bạn có thể gặp phải các lỗi như:

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

Thay vào đó, hãy triển khai bằng cách sử dụng trình bổ trợ App Engine Gradle hoặc trình bổ trợ Maven. Mỗi trình bổ trợ cung cấp một tuỳ chọn enableJarSplitting giúp chia mỗi JAR thành các phần 10 MB và tải các phần đó 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, hãy kiểm tra hệ phân cấp 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 theo nhu cầu (hoặc sử dụng Bảng kê khai thành phần):

Maven

mvn dependency:tree

Gradle

./gradlew dependencies

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

Maven

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

Gradle

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