การใช้งานขั้นสูง

คู่มือนี้จะอธิบายวิธีปรับแต่งแง่มุมขั้นสูงหลายประการของไลบรารีไคลเอ็นต์ Java รูปแบบที่พบบ่อยคือฟีเจอร์เหล่านี้จำนวนมากใช้ Callable พื้นฐานแทนวิธีการมาตรฐาน โดยทั่วไปแล้ว callable เป็นตําแหน่งที่ดีในการค้นหาฟีเจอร์อื่นๆ ต่อ RPC ที่ไม่ได้ระบุไว้ในเอกสารที่นี่

หมดเวลา

ไลบรารี 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 เป็นครั้งแรก สาเหตุคืออินเทอร์เฟซแบบฟลuent สำหรับบริการ (GoogleAdsClient.getVersionXX()) ซึ่งจะโหลดคลาส API ทั้งหมดพร้อมกันเพื่อให้มีกลไกที่สะดวกยิ่งขึ้นในการสร้างคลาสบริการ

หากประสิทธิภาพคำขอแรกอยู่ในเส้นทางที่สำคัญสำหรับแอปพลิเคชัน คุณควรทำตามขั้นตอนต่อไปนี้

  1. สร้าง GoogleAdsClient เมื่อเริ่มต้นระบบก่อนที่จะให้บริการตามคําขอของผู้ใช้

  2. ส่งคําขออุ่นเครื่อง 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 จะใหญ่กว่านี้มาก โดยเฉพาะเมื่อใช้การนําร่อง JAR ของ Shade/Shadow หากติดตั้งใช้งาน Jar ด้วยตนเอง คุณอาจได้รับข้อผิดพลาด เช่น

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])

ให้ใช้ AppEngineปลั๊กอิน Gradle หรือปลั๊กอิน Maven แทน แต่ละรายการมีตัวเลือกสำหรับ enableJarSplitting ซึ่งจะแบ่งไฟล์ jar แต่ละไฟล์ออกเป็นกลุ่มขนาด 10 MB และอัปโหลดไฟล์เหล่านั้นแทน

Dependency ของ Shadow

หากโปรเจ็กต์ของคุณมีทรัพยากร Dependencies ที่ขัดแย้งกับของไลบรารี คุณควรตรวจสอบทรัพยากร Dependencies ของโปรเจ็กต์โดยใช้คำสั่งใดคำสั่งหนึ่งต่อไปนี้ จากนั้นแก้ไขทรัพยากร Dependencies ของโปรเจ็กต์ตามต้องการ

MavenGradle
mvn dependency:tree
./gradlew dependencies

หากแก้ไขความขัดแย้งของข้อกําหนดเบื้องต้นไม่ได้ คุณจะใช้ไลบรารีเวอร์ชันที่แรเงาแทนได้

MavenGradle
<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'