গুগল অ্যাডস .NET ক্লায়েন্ট লাইব্রেরি আপনার পক্ষ থেকে ন্যূনতম কনফিগারেশনের মাধ্যমে গুগল অ্যাডস এপিআই-এর সাথে আপনার অ্যাপের মিথস্ক্রিয়াকে সহজ করে তোলে। তবে, এর সামগ্রিক পারফরম্যান্স অনেকাংশে নির্ভর করে লাইব্রেরিটি আপনার অ্যাপের সাথে কীভাবে ব্যবহার ও ইন্টিগ্রেট করা হচ্ছে তার উপর।
এই নির্দেশিকাটি .NET অ্যাপের জন্য নির্দিষ্ট পারফরম্যান্স অপ্টিমাইজেশন নিয়ে আলোচনা করে এবং Google Ads API-এর ক্ষেত্রে সাধারণভাবে প্রযোজ্য সেরা অনুশীলনগুলোর পরিপূরক হিসেবে কাজ করে।
যখনই সম্ভব GoogleAdsClient পুনরায় ব্যবহার করুন।
এপিআই কল করার সময় GoogleAdsClient একজন ব্যবহারকারীর সেশনের প্রতিনিধিত্ব করে। এটি নিম্নলিখিত অপ্টিমাইজেশনগুলো প্রদান করে:
- এপিআই পরিষেবাগুলিতে ব্যবহৃত gRPC চ্যানেলগুলি ক্যাশ করা হয়। এর ফলে প্রাথমিক এপিআই কল করার সময় সেটআপের সময় কমে যায়।
- সম্ভব হলে অ্যাক্সেস টোকেন পুনরায় ব্যবহার করা। এর ফলে অ্যাক্সেস টোকেন রিফ্রেশ করার জন্য গুগল অ্যাডস .NET ক্লায়েন্ট লাইব্রেরিকে কমবার ডেটা আদান-প্রদান করতে হয়।
সম্ভব হলে ম্যানেজার লেভেল অ্যাকাউন্টের অ্যাক্সেস টোকেন ব্যবহার করুন।
- আপনার কাছে যদি ম্যানেজার অ্যাকাউন্ট লেভেলে ইস্যু করা একটি অ্যাক্সেস টোকেন থাকে, তবে আপনি সেটি ব্যবহার করে সেই অ্যাকাউন্ট হায়ারার্কির অধীনে থাকা সমস্ত গুগল অ্যাডস ক্লায়েন্ট অ্যাকাউন্টে এপিআই কল করতে পারবেন।
GoogleAdsClientইনস্ট্যান্স পুনঃব্যবহারের সাথে মিলিত হলে, এটি অ্যাক্সেস টোকেন রিফ্রেশ করার জন্য ক্লায়েন্ট লাইব্রেরিকে যে রাউন্ড ট্রিপ করতে হয়, তার সংখ্যা আরও কমাতে পারে।
সম্ভব হলে Search-এর পরিবর্তে SearchStream ব্যবহার করুন।
যদিও GoogleAdsService.Search সম্পূর্ণ রিপোর্টটি ডাউনলোড করার জন্য একাধিক পেজযুক্ত অনুরোধ পাঠাতে পারে, GoogleAdsService.SearchStream রিপোর্টের আকার নির্বিশেষে একটিমাত্র অনুরোধ পাঠায় এবং Google Ads API-এর সাথে একটি স্থায়ী সংযোগ স্থাপন করে। একটি Search রেসপন্সের প্রতিটি স্বতন্ত্র পেজের জন্য প্রয়োজনীয় রাউন্ড-ট্রিপ নেটওয়ার্ক সময় বাদ দেওয়ার মাধ্যমে, আপনার অ্যাপের উপর নির্ভর করে, SearchStream পেজিংয়ের চেয়ে উন্নত পারফরম্যান্স দিতে পারে। এই অপটিমাইজেশন সম্পর্কে আরও জানতে Search বনাম SearchStream দেখুন।
অ্যাক্সেস টোকেন রিফ্রেশগুলি ম্যানুয়ালি পরিচালনা করুন
Google Cloud Functions- এর মতো কিছু পরিবেশে GoogleAdsClient ইনস্ট্যান্সগুলো পুনরায় ব্যবহার করা সম্ভব নাও হতে পারে। এই ধরনের পরিবেশে ডেটা সংরক্ষণ এবং পুনরায় ব্যবহারের জন্য নিজস্ব সেরা অনুশীলন থাকতে পারে। সেক্ষেত্রে, আপনি নিম্নলিখিত উপায়ে আপনার নিজস্ব অ্যাক্সেস টোকেন রিফ্রেশ করার জন্য GoogleAdsConfig ক্লাসটি এক্সটেন্ড করতে পারেন।
// Create your own config class by extending the GoogleAdsConfig class.
class MyGoogleAdsConfig : GoogleAdsConfig
{
public MyGoogleAdsConfig() : base()
{
// Disable the library's in-built channel caching mechanism.
this.UseChannelCache = false;
}
protected override ICredential CreateCredentials()
{
// TODO: Create your own ICredentials object here. You may refer to the
// default implementation of GoogleAdsConfig::CreateCreateCredentials
// for an example.
}
}
// Use your own config class when initializing the GoogleAdsClient instance.
MyGoogleAdsConfig myconfig = new MyGoogleAdsConfig();
GoogleAdsClient client = new GoogleAdsClient(myconfig);
রিলিজ বিল্ডের জন্য কম্পাইল করুন
সার্ভারে ডেপ্লয় করার সময় নিশ্চিত করুন যে আপনি আপনার অ্যাপটি রিলিজ কনফিগারেশন ব্যবহার করে কম্পাইল করছেন। ডিবাগ কনফিগারেশন ব্যবহার করলে, আপনার অ্যাপটি সম্পূর্ণ সিম্বলিক ডিবাগ তথ্যসহ কম্পাইল হয় এবং এতে কোনো অপটিমাইজেশন থাকে না।
আপনার অ্যাপের প্রোফাইল তৈরি করুন
পারফরম্যান্সের প্রতিবন্ধকতা শনাক্ত করতে আপনার অ্যাপের সিপিইউ এবং মেমরি ব্যবহারের প্রোফাইল তৈরি করুন। ভিজ্যুয়াল স্টুডিও আপনার অ্যাপের প্রোফাইল তৈরিতে সাহায্য করার জন্য ডায়াগনস্টিক টুল সরবরাহ করে। এছাড়াও অন্যান্য বাণিজ্যিক প্রোফাইলিং টুলও পাওয়া যায়।
অ্যাসিঙ্ক পদ্ধতি ব্যবহার করুন
async-await প্যারাডাইম ব্যবহার করে অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং পারফরম্যান্সের বাধা এড়াতে এবং আপনার অ্যাপের সার্বিক রেসপন্সিভনেস বাড়াতে সাহায্য করে। Google Ads .NET লাইব্রেরি সমস্ত সার্ভিস এবং RPC মেথডের জন্য async মেথড তৈরি করে।
অ্যাসিঙ্ক মেথড বাতিলকরণ
আপনি callSettings প্যারামিটার ব্যবহার করে async মেথডগুলিতে CancellationToken পাস করতে পারেন:
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
cancellationTokenSource.CancelAfter(3000);
CallSettings callSettings = CallSettings.FromCancellationToken(cancellationTokenSource.Token);
string query = "SELECT campaign.name FROM campaign";
var request = new SearchGoogleAdsStreamRequest()
{
CustomerId = customerId.ToString(),
Query = query,
};
GoogleAdsServiceClient googleAdsService = client.GetService(
Services.V25.GoogleAdsService);
googleAdsService.SearchStream(request,
delegate (SearchGoogleAdsStreamResponse resp)
{
foreach (GoogleAdsRow googleAdsRow in resp.Results)
{
// Process the row.
}
}, callSettings
);
যখন সম্ভব লগিং বন্ধ করুন
Google Ads .NET লাইব্রেরি ডিফল্টরূপে লগিং বন্ধ রাখে এবং একটি লেজি লগিং পদ্ধতি ব্যবহার করে, যা আপনার অ্যাপকে আরও ভালো পারফরম্যান্স দেয়। আপনি যদি লগিং চালু করেন, তবে প্রোডাকশন এনভায়রনমেন্টে তা বন্ধ করে দিন। প্রোডাকশনে নির্দিষ্ট কোনো ব্যর্থ রিকোয়েস্ট নিরীক্ষণ করার প্রয়োজন হলে, আপনি আপনার অ্যাপের পারফরম্যান্সে কোনো নেতিবাচক প্রভাব না ফেলেই নিম্নলিখিত এক বা একাধিক পদক্ষেপ নিতে পারেন:
- শুধু সারসংক্ষেপ লগগুলো চালু করুন।
- সম্পূর্ণ লগগুলোকে
ERRORলেভেলে সেট করুন। - আপনার গুরুত্বপূর্ণ নির্দিষ্ট অনুরোধগুলোর জন্য রিকোয়েস্ট আইডিটি সংরক্ষণ করুন, যা আপনি সাপোর্ট চ্যানেলগুলোর সাথে শেয়ার করতে পারবেন।
আরও জানতে লগিং নির্দেশিকা দেখুন।
SearchStream নাকি Search পদ্ধতি ব্যবহার করবেন তা স্থির করুন।
গুগল অ্যাডস এপিআই অবজেক্ট পুনরুদ্ধার করার দুটি প্রধান উপায় প্রদান করে: Search মেথড (যা পেজিনেশন ব্যবহার করে) এবং SearchStream (যা স্ট্রিমিং ব্যবহার করে)।
SearchStream Search চেয়ে ভালো পারফরম্যান্স দেয়, কিন্তু এমন কিছু পরিস্থিতি আছে যেখানে Search ই বেশি পছন্দনীয়।
এই দুটি পদ্ধতি সম্পর্কে আরও জানতে স্ট্রিমিং রিপোর্ট গাইডটি দেখুন।
রেডিটুরান বিকল্পটি ব্যবহার করুন
.NET Core 3.1-এ এখন একটি নির্দিষ্ট প্ল্যাটফর্ম ও আর্কিটেকচারের জন্য আপনার বাইনারিগুলোকে প্রি-কম্পাইল করার সুবিধা যোগ করা হয়েছে। এর জন্য PublishReadyToRun সেটিংটি true সেট করতে হয় এবং পাবলিশ করার সময় একটি বৈধ RuntimeIdentifier উল্লেখ করে বাইনারিটি পাবলিশ করতে হয়। এই ReadyToRun ফিচারটি সম্পর্কে আরও জানতে এর নির্দেশিকাটি দেখুন।
টিয়ার্ডকম্পাইলেশন ব্যবহার করুন
TieredCompilation .NET-কে হটস্পট শনাক্ত করতে এবং এর পারফরম্যান্স উন্নত করতে সাহায্য করে। টিয়ার্ড কম্পাইলেশন ReadyToRun অপশনের সাথে আরও ভালোভাবে কাজ করে, কারণ এটি উপলব্ধ থাকলে আগে থেকে তৈরি করা ইমেজটি ব্যবহার করতে পারে। আরও জানতে TieredCompilation সম্পর্কিত নির্দেশিকাটি দেখুন।
আপনার গার্বেজ কালেকশন (GC) সূক্ষ্মভাবে সমন্বয় করুন।
.NET গার্বেজ কালেকশন (GC)-এর জন্য দুটি সাধারণ প্রোফাইল প্রদান করে: একটি ওয়ার্কস্টেশন প্রোফাইল এবং একটি সার্ভার প্রোফাইল। এই দুটি প্রোফাইলের পারফরম্যান্সের ক্ষেত্রে ভিন্ন ভিন্ন সুবিধা-অসুবিধা রয়েছে। যে অ্যাপগুলো Google Ads .NET লাইব্রেরি ব্যবহার করে, সেগুলো সার্ভার প্রোফাইলে চললে সাধারণত ভালো পারফর্ম করে। নিম্নলিখিত GC সেটিংসগুলো সূক্ষ্মভাবে সমন্বয় করে আপনি এর থেকে সুবিধা পেতে পারেন।
সার্ভার গার্বেজ কালেকশন: সার্ভার গার্বেজ কালেকশন একাধিক থ্রেডে কাজ করার মাধ্যমে .NET রানটাইমকে একটি গুগল অ্যাডস এপিআই অ্যাপকে আরও ভালো পারফরম্যান্স দিতে সাহায্য করে। আরও বিস্তারিত জানতে এই গাইডটি দেখুন। আপনার অ্যাপের
.csprojফাইলে নিম্নলিখিত লাইনগুলো যোগ করে আপনি সার্ভার গার্বেজ কালেকশন চালু করতে পারেন।<PropertyGroup> <ServerGarbageCollection>true</ServerGarbageCollection> </PropertyGroup>কনকারেন্ট গার্বেজ কালেকশন: আপনি কনকারেন্ট গার্বেজ কালেকশন চালু করে দ্বিতীয় জেনারেশনে গার্বেজ কালেকশনের জন্য .NET GC-কে একটি ডেডিকেটেড থ্রেড দিতে পারেন। বড় আকারের রিপোর্ট প্রসেস করার সময় এই সেটিংটি কার্যকর হতে পারে। আপনার অ্যাপের
.csprojফাইলে নিম্নলিখিত লাইনগুলো যোগ করে আপনি কনকারেন্ট গার্বেজ কালেকশন চালু করতে পারেন।<PropertyGroup> <ConcurrentGarbageCollection>true</ConcurrentGarbageCollection> </PropertyGroup>ভার্চুয়াল মেমরি (VM) গার্বেজ কালেকশন ধরে রাখা:
RetainVMGarbageCollectionসেটিংটি নির্ধারণ করে যে, ভার্চুয়াল মেমরির যে অংশগুলো মুছে ফেলা উচিত, সেগুলো ভবিষ্যতের ব্যবহারের জন্য স্ট্যান্ডবাই তালিকায় রাখা হবে, নাকি অপারেটিং সিস্টেমকে (OS) ফিরিয়ে দেওয়া হবে। আপনার অ্যাপে নিম্নলিখিত লাইনগুলো যোগ করে আপনি ভার্চুয়াল মেমরি রিটেনশন চালু করতে পারেন।<PropertyGroup> <RetainVMGarbageCollection>true</RetainVMGarbageCollection> </PropertyGroup>
আপনি একটি ওয়ার্কস্টেশন এবং সার্ভারের মাঝামাঝি একটি সেটআপ বেছে নিয়ে আপনার GC-কে সূক্ষ্মভাবে নিয়ন্ত্রণ করতে পারেন। সমস্ত প্রাসঙ্গিক সেটিংস আপনার .NET Core অ্যাপের runtimeconfig.json ফাইলে, একটি এনভায়রনমেন্ট ভেরিয়েবলে, অথবা আপনার .NET SDK অ্যাপের App.config নির্দিষ্ট করা থাকে।