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

คู่มือนี้สรุปวิธีปรับแต่งองค์ประกอบขั้นสูงหลายอย่างของ ไลบรารีของไคลเอ็นต์ 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 เป็นครั้งแรก สร้าง แล้ว เนื่องจากอินเทอร์เฟซสำหรับบริการได้อย่างคล่องแคล่ว (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

คุณต้องตรวจสอบว่าได้ปิดไคลเอ็นต์เมื่อไม่จำเป็นต้องใช้อีกแล้ว ช่วงเวลานี้ สามารถทำได้ใน ลองใช้ทรัพยากร บล็อกหรือเรียกใช้ close() ในไคลเอ็นต์ของบริการ

หากคุณพยายามใช้ไคลเอ็นต์บริการแบบปิดเพื่อสร้างคำขอ API บริการ เมธอดของไคลเอนต์จะแสดง java.util.concurrent.RejectedExecutionException

App Engine ไม่สามารถทำให้ใช้งานได้หาก JAR > 32 MB

App Engine มีโควต้า 32 MB สำหรับไฟล์ที่อัปโหลดแต่ละไฟล์ JAR สำหรับ google-ads จะใหญ่กว่านี้อย่างมาก แม้กระทั่งใช้โหลเฉดสี/เงา การใช้งานจริง หากคุณใช้ Jar ด้วยตนเอง คุณอาจพบข้อผิดพลาด เช่น

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

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

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

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

Maven

mvn dependency:tree

Gradle

./gradlew dependencies

หากแก้ไขความขัดแย้งของทรัพยากร Dependency ไม่ได้ คุณสามารถใช้ แรเงา ของไลบรารีเวอร์ชันแทน

Maven

<dependency>
  <groupId>com.google.api-ads</groupId>
  <artifactId>google-ads-shadowjar</artifactId>
  <version>33.0.0</version>
</dependency>

Gradle

implementation 'com.google.api-ads:google-ads-shadowjar:33.0.0'