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ơ sở thay vì các phương thức chuẩn. Có thể gọi thường là nơi phù hợp để tìm các tính năng khác cho mỗi RPC chưa được ghi nhận ở đây.

Lần bị tạm ngừng

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 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 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 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ờ cho các yêu cầu chạy quá lâu và trả về lỗi DEADLINE_EXCEEDED. Nếu điều này trở thành vấn đề, thông thường, tốt nhất bạn nên chia tách truy vấn và thực thi song song các phần đó. Điều này sẽ giúp tránh trường hợp 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.

Chế độ 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 các 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 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 tiên tạo thực thể GoogleAdsClient. Đ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ả các lớp API cùng một lúc nhằm 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 trong đường dẫn 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 quy trình này bắt đầu lần đầu tiên. 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 các yêu cầu khởi động một lần cho mỗi quy trình. Mọi quá trình 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ụ nếu thiết thực vì mỗi lệnh gọi đến GoogleAdsClient.getVersionXXX().createYYYServiceClient() sẽ tạo ra 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 dùng 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 dịch vụ.

Nếu bạn cố gắng sử dụng một ứng dụng dịch vụ đã đóng để đưa ra yêu cầu API, thì phương thức ứng dụng của 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 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 hoạt động triển khai jar bóng/đá. Nếu 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-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 trình bổ trợ Gradle của AppEngine hoặc trình bổ trợ Maven. Mỗi tệp có một tuỳ chọn cho enableJarSplitting. Tuỳ chọn này sẽ chia mỗi tệp thành các phần 10 MB rồi tải các phần đó lên.

Phần phụ thuộc của 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 những 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 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 shaded của thư viện.

Maven

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

Gradle

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