बेहतर इस्तेमाल के लिए

इस गाइड में, Java क्लाइंट लाइब्रेरी के कई बेहतर पहलुओं को पसंद के मुताबिक बनाने का तरीका बताया गया है. आम तौर पर, इनमें से कई सुविधाएं स्टैंडर्ड तरीकों के बजाय, Callable पर आधारित होती हैं. आम तौर पर, callable में आरपीसी के हिसाब से ऐसी अन्य सुविधाएं देखी जा सकती हैं जिनका दस्तावेज़ यहां नहीं दिया गया है.

टाइम आउट की संख्या

Java लाइब्रेरी, हर कॉल के लेवल पर टाइम आउट सेट करने के लिए एक प्लैटफ़ॉर्म उपलब्ध कराती है. डिफ़ॉल्ट वैल्यू, googleads_grpc_service_config.json में मौजूद method_config/timeout सेटिंग के आधार पर सेट होती है. अगर आपको एपीआई कॉल के लिए, ज़्यादा से ज़्यादा समय की सीमा कम करनी है, तो कम वैल्यू सेट करें.

इस सुविधा का इस्तेमाल करने के लिए, आपको सीधे तौर पर कॉल किए जा सकने वाले ऑब्जेक्ट का इस्तेमाल करना चाहिए. उदाहरण के लिए, 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)));
}

टाइम आउट को दो घंटे या उससे ज़्यादा पर सेट किया जा सकता है. हालांकि, एपीआई बहुत लंबे समय तक चलने वाले अनुरोधों के लिए टाइम आउट कर सकता है और 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()) की वजह से होता है. यह सभी एपीआई क्लास को एक साथ लोड करता है, ताकि सेवा क्लास बनाने के लिए ज़्यादा सुविधाजनक तरीका उपलब्ध कराया जा सके.

अगर आपके ऐप्लिकेशन के लिए, पहले अनुरोध की परफ़ॉर्मेंस क्रिटिकल पाथ में है, तो आपको यह तरीका अपनाना चाहिए:

  1. उपयोगकर्ता के अनुरोधों को पूरा करने से पहले, स्टार्टअप के समय GoogleAdsClient बनाएं.

  2. प्रोसेस शुरू होने पर, 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() को हर कॉल करने पर एक नया टीसीपी कनेक्शन बनेगा.

आपको यह पक्का करना होगा कि जब क्लाइंट की ज़रूरत न हो, तब उसे बंद कर दिया जाए. इसे try-with-resources ब्लॉक में या सेवा क्लाइंट पर close() को कॉल करके किया जा सकता है.

अगर एपीआई अनुरोध करने के लिए, क्लोज़्ड सेवा क्लाइंट का इस्तेमाल किया जाता है, तो सेवा क्लाइंट का तरीका java.util.concurrent.RejectedExecutionException दिखाएगा.

अगर JAR फ़ाइल का साइज़ 32 एमबी से ज़्यादा है, तो App Engine उसे डिप्लॉय नहीं कर पाता

App Engine में, अपलोड की गई हर फ़ाइल के लिए 32 एमबी का कोटा होता है. google-ads के लिए JAR, इससे काफ़ी बड़ा होगा. शेड/शैडो JAR डिप्लॉयमेंट का इस्तेमाल करने पर, यह और भी बड़ा हो जाएगा. अगर आपने मैन्युअल तरीके से jar डिप्लॉय किए हैं, तो आपको इस तरह की गड़बड़ियां मिल सकती हैं:

ERROR: (gcloud.app.deploy) Cannot upload file [<your-app>/WEB-INF/lib/google-ads-34.0.0.jar],
which has size [66095767] (greater than maximum allowed size of [33554432])

इसके बजाय, AppEngine के Gradle प्लग इन या Maven प्लग इन का इस्तेमाल करके डिप्लॉय करें. हर एक में enableJarSplitting का विकल्प होता है. इससे हर एक jar को 10 एमबी के हिस्सों में बांटा जाएगा और उन्हें अपलोड किया जाएगा.

शैडो डिपेंडेंसी

अगर आपके प्रोजेक्ट में ऐसी डिपेंडेंसी हैं जो लाइब्रेरी से मेल नहीं खाती हैं, तो आपको इनमें से किसी एक निर्देश का इस्तेमाल करके, अपने प्रोजेक्ट की डिपेंडेंसी की जांच करनी चाहिए. इसके बाद, ज़रूरत के हिसाब से अपने प्रोजेक्ट की डिपेंडेंसी में बदलाव करना चाहिए.

Maven

mvn dependency:tree

ग्रेडल

./gradlew dependencies

अगर डिपेंडेंसी से जुड़ी समस्याओं को हल करना मुमकिन नहीं है, तो लाइब्रेरी के धूसर किए गए वर्शन का इस्तेमाल किया जा सकता है.

Maven

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

ग्रेडल

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