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

คู่มือนี้อธิบายวิธีปรับแต่งลักษณะขั้นสูงบางอย่างของ Java Client Library รูปแบบที่พบบ่อยคือฟีเจอร์เหล่านี้หลายอย่างอาศัย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 เนื่องจากอินเทอร์เฟซที่ลื่นไหลสำหรับบริการ (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 แบบเชด/ชาโดว์ ก็ตาม หากคุณติดตั้งใช้งาน JAR ด้วยตนเอง คุณอาจได้รับข้อผิดพลาด เช่น

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

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

ทรัพยากร Dependency ของ Shadow

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

Maven

mvn dependency:tree

Gradle

./gradlew dependencies

หากแก้ไขความขัดแย้งของ Dependency ไม่ได้ คุณสามารถใช้ไลบรารีเวอร์ชัน 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'