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. Đối tượng có thể gọi thường là nơi phù hợp để tìm các tính năng khác theo RPC không được ghi lại ở đây.
Hết giờ
Thư viện Java cung cấp một nền tảng để đặt thời gian chờ cho 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, hãy gọi trực tiếp đối tượng Callable. Ví dụ: khi gọi GoogleAdsService.searchStream(), hãy đặt 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ờ 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 cực kỳ lâu và trả về lỗi DEADLINE_EXCEEDED.
Nếu điều này trở thành vấn đề, thì tốt nhất bạn nên chia nhỏ 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.
Thử lại chế độ cài đặt
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, 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 độ 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 thạo cho các dịch vụ (GoogleAdsClient.getLatestVersion()), tải các lớp dịch vụ API cùng một lúc để cung cấp cơ chế thuận tiện cho việc xây dựng ứ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:
Tạo
GoogleAdsClientkhi khởi động, trước khi phân phát yêu cầu của người dùng.Gửi một vài yêu cầu khởi động đến Google Ads API khi quy trình mới 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 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ụ nếu có thể, vì mỗi lệnh gọi đến GoogleAdsClient.getLatestVersion().createYYYServiceClient() (hoặc một phương thức truy cập theo phiên bản cụ thể như getVersion26()) sẽ tạo một kết nối cơ bản mới và các tài nguyên liên quan.
Hãy nhớ đóng ứng dụng dịch vụ 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 dịch vụ sẽ gửi một java.util.concurrent.RejectedExecutionException.
App Engine không triển khai được nếu tệp 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 mức này, đặc biệt là khi sử dụng các bản triển khai JAR bóng hoặc bóng mờ. Nếu triển khai 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-48.1.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 App Engine. Mỗi trình bổ trợ đều cung cấp một tuỳ chọn enableJarSplitting để chia mỗi tệp 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 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 phần phụ thuộc của dự án nếu cần (hoặc sử dụng Bảng kê khai thành phần):
Maven
mvn dependency:treeGradle
./gradlew dependenciesNế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>48.1.0</version> </dependency>
Gradle
implementation 'com.google.api-ads:google-ads-shadowjar:48.1.0'