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

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

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

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() को किए जाने वाले हर कॉल से नया टीसीपी कनेक्शन बन जाए.

जब क्लाइंट की ज़रूरत न हो, तब आपको उसे बंद कर देना चाहिए. ऐसा संसाधनों के साथ करें ब्लॉक में किया जा सकता है या सर्विस क्लाइंट पर close() को कॉल किया जा सकता है.

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

जार 32 एमबी से ज़्यादा होने पर ऐप्लिकेशन इंजन डिप्लॉय नहीं हो सकता

App Engine के पास अपलोड की गई हर फ़ाइल के लिए 32 एमबी का कोटा होता है. 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])

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

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

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

Maven

mvn dependency:tree

ग्रेडल

./gradlew dependencies

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

Maven

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

ग्रेडल

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