উন্নত ব্যবহার

এই নির্দেশিকাটিতে জাভা ক্লায়েন্ট লাইব্রেরির কয়েকটি উন্নততর দিক কীভাবে কাস্টমাইজ করতে হয় তার রূপরেখা দেওয়া হয়েছে। একটি সাধারণ বিষয় হলো, এই বৈশিষ্ট্যগুলির বেশিরভাগই সাধারণ সুবিধাজনক মেথডগুলির পরিবর্তে অন্তর্নিহিত Callable উপর নির্ভর করে। এখানে নথিভুক্ত নয় এমন অন্যান্য প্রতি-RPC বৈশিষ্ট্যগুলির সন্ধান করার জন্য Callable সাধারণত একটি ভালো জায়গা।

টাইমআউট

জাভা লাইব্রেরিটি প্রতি-কল স্তরে টাইমআউট সেট করার জন্য একটি মাধ্যম প্রদান করে। ডিফল্ট মানটি googleads_grpc_service_config.json ফাইলের method_config/timeout সেটিং অনুসারে সেট করা হয়। যদি কোনো এপিআই কলের জন্য সর্বোচ্চ সময়ের একটি সংক্ষিপ্ত সীমা প্রয়োগ করার প্রয়োজন হয়, তবে একটি কম মান সেট করুন।

এই বৈশিষ্ট্যটি ব্যবহার করতে, সরাসরি Callable অবজেক্টটি কল করুন। উদাহরণস্বরূপ, GoogleAdsService.searchStream() কল করার সময়, টাইমআউটটি নিম্নরূপভাবে সেট করুন:

try (GoogleAdsServiceClient googleAdsServiceClient =
    googleAdsClient.getLatestVersion().createGoogleAdsServiceClient()) {
  // Constructs the SearchGoogleAdsStreamRequest.
  SearchGoogleAdsStreamRequest request =
      SearchGoogleAdsStreamRequest.newBuilder()
          .setCustomerId(Long.toString(customerId))
          .setQuery("SELECT campaign.id, campaign.name FROM campaign")
          .build();

  // Executes the API call with a timeout of 5 minutes.
  ServerStream<SearchGoogleAdsStreamResponse> stream =
      googleAdsServiceClient
          .searchStreamCallable()
          .call(
              request,
              GrpcCallContext.createDefault()
                  .withTimeout(Duration.of(5, ChronoUnit.MINUTES)));
  for (SearchGoogleAdsStreamResponse response : stream) {
    // Processes the response rows.
  }
}

আপনি টাইমআউট ২ ঘন্টা বা তার বেশি সেট করতে পারেন, কিন্তু তারপরেও এপিআই অত্যন্ত দীর্ঘ সময় ধরে চলা অনুরোধগুলির জন্য টাইমআউট হয়ে যেতে পারে এবং একটি DEADLINE_EXCEEDED ত্রুটি ফেরত দিতে পারে। যদি এটি একটি সমস্যা হয়ে দাঁড়ায়, তবে সাধারণত কোয়েরিটিকে ভাগ করে খণ্ডগুলি সমান্তরালভাবে চালানোই সবচেয়ে ভালো; এটি এমন পরিস্থিতি এড়াতে সাহায্য করে যেখানে একটি দীর্ঘ সময় ধরে চলা অনুরোধ ব্যর্থ হয় এবং তা থেকে পুনরুদ্ধার করার একমাত্র উপায় হলো অনুরোধটি আবার শুরু থেকে চালানো।

পুনরায় চেষ্টা করার সেটিংস

জাভা লাইব্রেরিটি প্রতি-কল স্তরে রিট্রাই সেটিংস কনফিগার করার একটি মাধ্যমও প্রদান করে। এই বৈশিষ্ট্যটি ব্যবহার করতে, সরাসরি Callable অবজেক্টটি কল করুন। উদাহরণস্বরূপ, GoogleAdsService.searchStream() কল করার সময়, রিট্রাই সেটিংস নিম্নরূপভাবে কনফিগার করুন:

try (GoogleAdsServiceClient googleAdsServiceClient =
    googleAdsClient.getLatestVersion().createGoogleAdsServiceClient()) {
  SearchGoogleAdsStreamRequest request =
      SearchGoogleAdsStreamRequest.newBuilder()
          .setCustomerId(Long.toString(customerId))
          .setQuery("SELECT campaign.id, campaign.name FROM campaign")
          .build();

  // 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());

  // Issues the streaming search request.
  ServerStream<SearchGoogleAdsStreamResponse> stream =
      googleAdsServiceClient.searchStreamCallable().call(request, context);
  for (SearchGoogleAdsStreamResponse response : stream) {
    // Processes the response rows.
  }
}

স্টার্টআপ সময়ের কর্মক্ষমতা অপ্টিমাইজেশন

প্রথমবার একটি GoogleAdsClient ইনস্ট্যান্স তৈরি হওয়ার সময় আপনি একটি সামান্য বিলম্ব লক্ষ্য করতে পারেন। এর কারণ হলো সার্ভিসগুলোর জন্য ফ্লুয়েন্ট ইন্টারফেস ( GoogleAdsClient.getLatestVersion() ), যা সার্ভিস ক্লায়েন্ট তৈরির জন্য একটি সুবিধাজনক ব্যবস্থা প্রদান করতে API সার্ভিস ক্লাসগুলোকে একবারে লোড করে।

যদি আপনার অ্যাপ্লিকেশনের জন্য প্রথম অনুরোধের পারফরম্যান্স ক্রিটিক্যাল পাথে থাকে, তাহলে এই ধাপগুলো অনুসরণ করুন:

  1. ব্যবহারকারীর অনুরোধগুলি পরিবেশন করার আগে, স্টার্টআপে GoogleAdsClient তৈরি করুন।

  2. প্রক্রিয়াটি প্রথমবার শুরু হলে গুগল অ্যাডস এপিআই-তে কয়েকটি প্রস্তুতিমূলক অনুরোধ পাঠান। উদাহরণস্বরূপ:

    // 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 (ApiException ex) {
          // Do nothing, we're expecting this to fail.
        }
      }
    }
    

ওয়ার্ম-আপ অনুরোধগুলো প্রতিটি প্রসেসের জন্য কেবল একবারই চালানোর প্রয়োজন হয়। পরবর্তী প্রতিটি সার্ভিস ক্লায়েন্ট তৈরির সময় আগে থেকে লোড করা ক্লাসগুলো স্বয়ংক্রিয়ভাবে পুনরায় ব্যবহৃত হয়।

পরিষেবা ক্লায়েন্ট পুনঃব্যবহার

যেখানে সম্ভব, আপনার সার্ভিস ক্লায়েন্ট ইনস্ট্যান্সগুলো পুনরায় ব্যবহার করা উচিত, কারণ GoogleAdsClient.getLatestVersion().createYYYServiceClient() (অথবা getVersion25() এর মতো কোনো ভার্সন-নির্দিষ্ট অ্যাক্সেসর)-এর প্রতিটি কল একটি নতুন অন্তর্নিহিত সংযোগ এবং সংশ্লিষ্ট রিসোর্স তৈরি করে।

সার্ভিস ক্লায়েন্টটির আর প্রয়োজন না থাকলে তা বন্ধ করে দিন। আপনি এটি একটি try-with-resources ব্লকের মধ্যে অথবা সার্ভিস ক্লায়েন্টটিতে close() কল করে করতে পারেন।

যদি আপনি এপিআই অনুরোধ করার জন্য একটি ক্লোজড সার্ভিস ক্লায়েন্ট ব্যবহার করার চেষ্টা করেন, তাহলে সার্ভিস ক্লায়েন্ট মেথডটি একটি java.util.concurrent.RejectedExecutionException থ্রো করে।

JAR ফাইলের আকার ৩২ মেগাবাইট হলে App Engine স্থাপন করতে ব্যর্থ হয়।

অ্যাপ ইঞ্জিনে আপলোড করা প্রতিটি ফাইলের জন্য ৩২ মেগাবাইটের একটি কোটা রয়েছে। google-ads JAR ফাইলটি এর চেয়ে যথেষ্ট বড় হয়, বিশেষ করে যখন শেড বা শ্যাডো JAR ডিপ্লয়মেন্ট ব্যবহার করা হয়। আপনি যদি ম্যানুয়ালি JAR ডিপ্লয় করেন, তাহলে আপনি এই ধরনের এরর পেতে পারেন:

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

এর পরিবর্তে, অ্যাপ ইঞ্জিন গ্রেডল প্লাগইন অথবা মেভেন প্লাগইন ব্যবহার করে ডিপ্লয় করুন। প্রতিটি প্লাগইনে একটি enableJarSplitting অপশন রয়েছে যা প্রতিটি JAR ফাইলকে ১০ মেগাবাইটের খণ্ডে বিভক্ত করে এবং সেগুলোর পরিবর্তে সেগুলো আপলোড করে।

ছায়া নির্ভরতা

যদি আপনার প্রোজেক্টের কোনো ডিপেন্ডেন্সি লাইব্রেরির ডিপেন্ডেন্সিগুলোর সাথে সাংঘর্ষিক হয়, তাহলে নিচের কমান্ডগুলোর যেকোনো একটি ব্যবহার করে আপনার প্রোজেক্টের ডিপেন্ডেন্সি হায়ারার্কি পরীক্ষা করুন এবং তারপর প্রয়োজন অনুযায়ী আপনার প্রোজেক্টের ডিপেন্ডেন্সিগুলো পরিবর্তন করুন (অথবা বিল অফ মেটেরিয়ালস ব্যবহার করুন):

ম্যাভেন

mvn dependency:tree

গ্রেডল

./gradlew dependencies

যদি নির্ভরতার দ্বন্দ্ব সমাধান করা সম্ভব না হয়, তাহলে আপনি এর পরিবর্তে লাইব্রেরিটির শেডেড সংস্করণটি ব্যবহার করতে পারেন:

ম্যাভেন

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

গ্রেডল

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