คู่มือนี้สรุปวิธีปรับแต่งมุมมองขั้นสูงขึ้นหลายๆ ด้านของไลบรารีไคลเอ็นต์ Java รูปแบบที่พบบ่อยคือฟีเจอร์เหล่านี้จํานวนมากอาศัย Callable
ที่มีอยู่มากกว่าเมธอดมาตรฐาน โดยทั่วไปแล้ว ชื่อเรียกได้เป็นที่ที่ควรมองหาฟีเจอร์ต่อ RRPC อื่นๆ ซึ่งไม่ได้ระบุไว้ ณ ที่นี้
หมดเวลา
ไลบรารี Java มีพื้นที่สำหรับการตั้งค่าระยะหมดเวลาในระดับการโทรต่อครั้ง
ค่าเริ่มต้นจะกำหนดตามการตั้งค่า method_config/timeout
ใน googleads_grpc_service_config.json
ตั้งค่าที่ต่ำลงหากคุณต้องการบังคับใช้ขีดจำกัดเวลาที่สั้นลงสำหรับเวลาสูงสุดสำหรับการเรียก API
หากต้องการใช้ฟีเจอร์นี้ คุณควรใช้ออบเจ็กต์ที่เรียกได้ได้โดยตรง ตัวอย่างเช่น หากเรียกใช้ GoogleAdsService.searchStream()
ระบบจะตั้งค่าระยะหมดเวลาเป็น
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)));
}
คุณกำหนดระยะหมดเวลาเป็น 2 ชั่วโมงขึ้นไปได้ แต่ API อาจยังคงหมดเวลาคำขอที่ใช้เวลานานมากและแสดงผลข้อผิดพลาด DEADLINE_EXCEEDED
หากปัญหาเกิดขึ้น โดยปกติแล้ว คุณควรแยกการค้นหาออกเป็นส่วนๆ และดำเนินการไปพร้อมกัน เพื่อไม่ให้เกิดกรณีที่คำขอที่ใช้เวลานานไม่สำเร็จ และวิธีเดียวที่จะกู้คืนได้คือการเรียกคำขออีกครั้งตั้งแต่ต้น
การตั้งค่าการลองซ้ำ
ไลบรารีของ Java ยังมีแพลตฟอร์มสำหรับกำหนดการตั้งค่าการลองอีกครั้งในระดับการโทรแต่ละครั้งด้วย หากต้องการใช้ฟีเจอร์นี้ คุณควรใช้ออบเจ็กต์ที่เรียกได้ได้โดยตรง
ตัวอย่างเช่น หากเรียกใช้ GoogleAdsService.searchStream()
การตั้งค่าการลองซ้ำจะมีการกำหนดค่าดังนี้
// 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);
การเพิ่มประสิทธิภาพเวลาที่ใช้ในการเริ่มต้น
คุณอาจสังเกตเห็นความล่าช้าเล็กน้อยเมื่อสร้างอินสแตนซ์ GoogleAdsClient
เป็นครั้งแรก นั่นเป็นเพราะอินเทอร์เฟซที่มีประสิทธิภาพสำหรับบริการ (GoogleAdsClient.getVersionXX()
) ซึ่งโหลดคลาส API ทั้งหมดพร้อมกัน เพื่อให้กลไกการสร้างคลาสบริการสะดวกขึ้น
หากประสิทธิภาพของคำขอแรกอยู่ในเส้นทางสำคัญสำหรับแอปพลิเคชันของคุณ คุณควรทำตามขั้นตอนต่อไปนี้
สร้าง
GoogleAdsClient
เมื่อเริ่มต้นใช้งานก่อนแสดงคำขอของผู้ใช้ส่งคำขออุ่นเครื่อง 2-3 รายการไปยัง Google Ads API เมื่อกระบวนการเริ่มต้นขึ้นเป็นครั้งแรก เช่น
// 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. } } }
คำขออุ่นเครื่องจะต้องทำงานเพียงครั้งเดียวต่อกระบวนการ การสร้างไคลเอ็นต์บริการครั้งต่อๆ ไปจะนำคลาสที่โหลดไว้ล่วงหน้ามาใช้ซ้ำโดยอัตโนมัติ
การใช้ซ้ำของไคลเอ็นต์บริการ
คุณควรนำอินสแตนซ์ของไคลเอ็นต์บริการมาใช้ซ้ำหากทำได้จริง เนื่องจากการเรียกใช้ GoogleAdsClient.getVersionXXX().createYYYServiceClient()
แต่ละครั้งจะสร้างการเชื่อมต่อ TCP ใหม่
คุณต้องตรวจสอบว่าได้ปิดไคลเอ็นต์เมื่อไม่จำเป็นต้องใช้อีกต่อไป ซึ่งทำได้ในบล็อก try-with-resources หรือเรียกใช้ close()
ในไคลเอ็นต์บริการ
หากคุณพยายามใช้ไคลเอ็นต์บริการแบบปิดเพื่อส่งคำขอ API เมธอดของไคลเอ็นต์บริการจะส่ง java.util.concurrent.RejectedExecutionException
App Engine จะไม่ทำงานหากมี JAR มากกว่า 32 MB
App Engine มีโควต้า 32 MB สำหรับไฟล์ที่อัปโหลดแต่ละไฟล์ JAR สำหรับ google-ads
จะใหญ่กว่านี้มาก โดยใช้การทำให้ใช้งานไม่ได้กับ Shadow Jar ด้วยซ้ำ หากทำให้ Jars ใช้งานได้ด้วยตนเอง คุณอาจพบข้อผิดพลาด เช่น
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])
แต่ให้ติดตั้งใช้งานโดยใช้ปลั๊กอิน Gradle
หรือปลั๊กอิน Maven แทน
แต่ละรายการจะมีตัวเลือกสำหรับ enableJarSplitting
ซึ่งจะแบ่งโหลแต่ละโอ่งเป็น 10 MB และอัปโหลดแทน
ทรัพยากร Dependency ของแสงเงา
หากโปรเจ็กต์มีทรัพยากร Dependency ที่ขัดแย้งกับไลบรารีของทรัพยากร คุณควรตรวจสอบทรัพยากร Dependency ของโปรเจ็กต์โดยใช้คำสั่งใดคำสั่งหนึ่งต่อไปนี้ แล้วแก้ไขทรัพยากร Dependency ของโปรเจ็กต์ตามที่จำเป็น
Maven
mvn dependency:tree
Gradle
./gradlew dependencies
หากแก้ไขความขัดแย้งของทรัพยากรไม่ได้ คุณสามารถใช้ไลบรารีเวอร์ชันshadedแทน
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'