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

এই নির্দেশিকায় Java ক্লায়েন্ট লাইব্রেরির আরও উন্নত কিছু দিক কীভাবে কাস্টমাইজ করতে হয় তা উল্লেখ করা হয়েছে। একটি সাধারণ প্যাটার্ন হল যে এই ফিচারগুলির মধ্যে অনেকগুলি স্ট্যান্ডার্ড সুবিধা পদ্ধতির পরিবর্তে অন্তর্নিহিত Callable-এর উপর নির্ভর করে। কল করা যায় এমন ফাংশন সাধারণত অন্যান্য প্রতি-RPC ফিচার খোঁজার জন্য একটি ভালো জায়গা যা এখানে ডকুমেন্ট করা নেই।

সময় সমাপ্ত

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

এই ফিচার ব্যবহার করতে, সরাসরি 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.
  }
}

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

সেটিংস আবার চেষ্টা করুন

এছাড়াও, Java লাইব্রেরি প্রতি-কল লেভেলে আবার চেষ্টা করার সেটিংস কনফিগার করার জন্য একটি সারফেস প্রদান করে। এই ফিচার ব্যবহার করতে, সরাসরি 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. প্রসেস প্রথমবার শুরু করার সময় 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 (ApiException ex) {
          // Do nothing, we're expecting this to fail.
        }
      }
    }
    

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

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

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

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

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

JAR > ৩২ এমবি হলে App Engine ডিপ্লয় করতে পারে না

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

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

পরিবর্তে, App Engine Gradle প্লাগ-ইন বা Maven প্লাগ-ইন ব্যবহার করে ডিপ্লয় করুন। প্রতিটি প্লাগ-ইন একটি enableJarSplitting বিকল্প প্রদান করে যা প্রতিটি JAR-কে ১০ এমবি চাঙ্কে বিভক্ত করে এবং পরিবর্তে সেগুলি আপলোড করে।

শ্যাডো ডিপেন্ডেন্সি

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

Maven

mvn dependency:tree

Gradle

./gradlew dependencies

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

Maven

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

Gradle

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