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êu chuẩn. Phương thức có thể gọi thường là nơi phù hợp để tìm các tính năng khác trên mỗi RPC không được ghi lại tại đây.

Hết giờ

Thư viện Java cung cấp một 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. Đặ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 một lệnh gọi API.

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

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ờ đối với các yêu cầu chạy trong thời gian cực dài và trả về lỗi DEADLINE_EXCEEDED. Nếu đây trở thành vấn đề, tốt nhất bạn nên tách truy vấn và thực thi các phần song song; điều này giúp tránh tình huống yêu cầu chạy trong thời gian dài 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 nền tảng để đị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, bạn nên sử dụng trực tiếp đố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 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.getVersionXX()) tải tất cả các lớp API cùng một lúc để cung cấp cơ chế thuận tiện hơn cho việc tạo các lớp dịch vụ.

Nếu hiệu suất yêu cầu đầu tiên nằm trong đường dẫn quan trọng cho ứ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 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 cho API Google Ads khi quy trình bắt đầu lần đầ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 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 trước.

Sử dụng lại ứ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.getVersionXXX().createYYYServiceClient() sẽ tạo một kết nối TCP mới.

Bạn phải đảm bảo rằng bạn đóng ứng dụng khi không cần thiết nữa. Bạn có thể thực hiện việc này trong khối try-with-resources hoặc bằng cách gọi close() trên ứng dụng khách dịch vụ.

Nếu bạn cố gắng sử dụng ứng dụng dịch vụ đã đóng để đưa ra yêu cầu API, thì 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. Tệp JAR cho google-ads sẽ lớn hơn đáng kể, thậm chí còn lớn hơn khi sử dụng các bản triển khai jar bóng/bóng đổ. 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-36.0.0.jar],
which has size [66095767] (greater than maximum allowed size of [33554432])

Thay vào đó, hãy triển khai bằng trình bổ trợ Gradle hoặc trình bổ trợ Maven của AppEngine. Mỗi tệp có một tuỳ chọn cho enableJarSplitting. Tuỳ chọn này sẽ chia mỗi tệp jar thành các phân đoạn 10 MB và tải các phân đoạ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 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.

mvn dependency:tree
./gradlew dependencies

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

<dependency>
  <groupId>com.google.api-ads</groupId>
  <artifactId>google-ads-shadowjar</artifactId>
  <version>36.0.0</version>
</dependency>
implementation 'com.google.api-ads:google-ads-shadowjar:36.0.0'