Panduan ini menguraikan cara menyesuaikan beberapa aspek yang lebih canggih dari
library klien Java. Pola umum adalah banyak fitur ini mengandalkan Callable
yang mendasarinya, bukan metode standar. Callable biasanya merupakan tempat yang tepat untuk mencari fitur per-RPC lainnya yang tidak didokumentasikan di sini.
Waktu habis
Library Java menyediakan platform untuk menyetel waktu tunggu di tingkat per panggilan.
Nilai default ditetapkan berdasarkan setelan method_config/timeout
di
googleads_grpc_service_config.json.
Tetapkan nilai yang lebih rendah jika Anda perlu menerapkan batas yang lebih pendek pada waktu maksimum untuk
panggilan API.
Untuk menggunakan fitur ini, Anda harus menggunakan objek yang dapat dipanggil secara langsung. Misalnya, jika
memanggil GoogleAdsService.searchStream()
, waktu tunggu akan ditetapkan sebagai:
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)));
}
Anda dapat menyetel waktu tunggu hingga 2 jam atau lebih, tetapi API mungkin masih mengalami waktu tunggu untuk permintaan yang berjalan sangat lama dan menampilkan error DEADLINE_EXCEEDED
.
Jika hal ini menjadi masalah, sebaiknya pisahkan kueri dan
jalankan potongan secara paralel; hal ini menghindari situasi saat permintaan yang berjalan lama gagal dan satu-satunya cara untuk memulihkan adalah memicu permintaan
lagi dari awal.
Setelan coba lagi
Library Java juga menyediakan platform untuk mengonfigurasi setelan percobaan ulang di tingkat per panggilan. Untuk menggunakan fitur ini, Anda harus menggunakan objek yang dapat dipanggil secara langsung.
Misalnya, jika memanggil GoogleAdsService.searchStream()
, setelan coba lagi
akan dikonfigurasi sebagai berikut:
// 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);
Pengoptimalan performa waktu mulai
Anda mungkin melihat sedikit penundaan saat instance GoogleAdsClient
dibuat untuk pertama kalinya. Hal ini disebabkan oleh antarmuka yang lancar untuk layanan (GoogleAdsClient.getVersionXX()
), yang memuat semua class API sekaligus untuk menyediakan mekanisme yang lebih mudah dalam membuat class layanan.
Jika performa permintaan pertama berada di jalur penting untuk aplikasi Anda, Anda harus mengikuti langkah-langkah berikut:
Buat
GoogleAdsClient
saat startup, sebelum melayani permintaan pengguna.Kirim beberapa permintaan pemanasan ke Google Ads API saat proses pertama kali dimulai. Contoh:
// 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. } } }
Permintaan pemanasan hanya perlu dijalankan sekali per proses. Setiap pembuatan klien layanan berikutnya akan otomatis menggunakan kembali class yang telah dimuat sebelumnya.
Penggunaan ulang klien layanan
Anda harus menggunakan kembali instance klien layanan jika memungkinkan karena setiap panggilan ke
GoogleAdsClient.getVersionXXX().createYYYServiceClient()
akan membuat koneksi
TCP baru.
Anda harus memastikan bahwa Anda menutup klien jika tidak diperlukan lagi. Hal ini
dapat dilakukan dalam
blok try-with-resources
atau dengan memanggil close()
di klien layanan.
Jika Anda mencoba menggunakan klien layanan yang ditutup untuk membuat permintaan API, metode klien layanan akan memunculkan java.util.concurrent.RejectedExecutionException
.
App Engine gagal di-deploy jika JAR > 32 MB
App Engine memiliki kuota 32 MB untuk setiap file yang diupload. JAR untuk google-ads
akan jauh lebih besar dari ini, bahkan lebih besar lagi jika menggunakan deployment
shade/shadow jar. Jika Anda men-deploy JAR secara manual, Anda mungkin mendapatkan error seperti:
ERROR: (gcloud.app.deploy) Cannot upload file [<your-app>/WEB-INF/lib/google-ads-39.0.0.jar],
which has size [66095767] (greater than maximum allowed size of [33554432])
Sebagai gantinya, deploy menggunakan
plugin Gradle
atau
plugin Maven App Engine.
Setiap opsi memiliki opsi untuk enableJarSplitting
yang akan membagi setiap JAR menjadi potongan 10 MB
dan menguploadnya.
Dependensi bayangan
Jika project Anda memiliki dependensi yang berkonflik dengan library, Anda harus memeriksa dependensi project menggunakan salah satu perintah berikut, lalu mengubah dependensi project sesuai kebutuhan.
Maven
mvn dependency:tree
Gradle
./gradlew dependencies
Jika penyelesaian konflik dependensi tidak memungkinkan, Anda dapat bergantung pada versi library shaded.
Maven
<dependency> <groupId>com.google.api-ads</groupId> <artifactId>google-ads-shadowjar</artifactId> <version>39.0.0</version> </dependency>
Gradle
implementation 'com.google.api-ads:google-ads-shadowjar:39.0.0'