হারের সীমা
গুগল অ্যাডস এপিআই প্রতিটি ক্লায়েন্ট কাস্টমার আইডি (সিআইডি) এবং ডেভেলপার টোকেনের জন্য প্রতি সেকেন্ডে কোয়েরির (কিউপিএস) ভিত্তিতে রেট লিমিটিংয়ের অনুরোধগুলোকে ভাগ করে, যার অর্থ হলো সিআইডি এবং ডেভেলপার টোকেন উভয়ের ক্ষেত্রেই মিটারিং স্বাধীনভাবে প্রয়োগ করা হয়। গুগল অ্যাডস এপিআই অনুরোধ পরিমাপ করতে এবং একটি উপযুক্ত কিউপিএস সীমা নির্ধারণ করতে একটি টোকেন বাকেট অ্যালগরিদম ব্যবহার করে, তাই যেকোনো নির্দিষ্ট সময়ে সার্ভারের সামগ্রিক লোডের উপর নির্ভর করে সঠিক সীমাটি পরিবর্তিত হবে।
রেট লিমিট আরোপ করার উদ্দেশ্য হলো, কোনো একজন ব্যবহারকারী যাতে ইচ্ছাকৃত বা অনিচ্ছাকৃতভাবে বিপুল সংখ্যক অনুরোধ পাঠিয়ে গুগল অ্যাডস এপিআই সার্ভারগুলোকে অতিরিক্ত চাপে ফেলে অন্য ব্যবহারকারীদের পরিষেবা ব্যাহত করতে না পারে, তা প্রতিরোধ করা।
রেট লিমিট লঙ্ঘনকারী অনুরোধগুলি RESOURCE_TEMPORARILY_EXHAUSTED ত্রুটি সহ প্রত্যাখ্যান করা হবে।
আপনি সক্রিয়ভাবে অনুরোধের সংখ্যা কমিয়ে এবং ক্লায়েন্ট সাইড থেকে QPS থ্রটল করার মাধ্যমে আপনার অ্যাপের নিয়ন্ত্রণ নিতে ও রেট লিমিট প্রশমিত করতে পারেন।
রেট লিমিট অতিক্রম করার সম্ভাবনা কমানোর বেশ কিছু উপায় রয়েছে। এন্টারপ্রাইজ ইন্টিগ্রেশন প্যাটার্নস (EIP)-এর ধারণা, যেমন মেসেজিং, রিডেলিভারি এবং থ্রটলিং-এর সাথে পরিচিত হলে তা আপনাকে আরও শক্তিশালী একটি ক্লায়েন্ট অ্যাপ তৈরি করতে সাহায্য করতে পারে।
নিম্নলিখিত প্রস্তাবিত অনুশীলনগুলি জটিলতা অনুসারে সাজানো হয়েছে, যেখানে সরল কৌশলগুলি শীর্ষে এবং তারপরে আরও শক্তিশালী কিন্তু অত্যাধুনিক স্থাপত্যগুলি রয়েছে:
একই সাথে একাধিক কাজ সীমিত করুন
রেট লিমিট অতিক্রম করার একটি মূল কারণ হলো ক্লায়েন্ট অ্যাপের অতিরিক্ত সংখ্যক সমান্তরাল টাস্ক তৈরি করা। যদিও আমরা একটি ক্লায়েন্ট অ্যাপের সমান্তরাল অনুরোধের সংখ্যা সীমিত করি না, এটি ডেভেলপার টোকেন স্তরে 'রিকোয়েস্টস পার সেকেন্ড' সীমা অতিক্রম করতে পারে।
একই সাথে অনুরোধ করতে পারে এমন মোট টাস্কের (সমস্ত প্রসেস এবং মেশিন জুড়ে) সংখ্যার জন্য একটি যুক্তিসঙ্গত ঊর্ধ্বসীমা নির্ধারণ করা এবং রেট লিমিট অতিক্রম না করে আপনার থ্রুপুট অপ্টিমাইজ করার জন্য এটিকে প্রয়োজন অনুযায়ী বাড়ানো বাঞ্ছনীয়।
এছাড়াও, আপনি ক্লায়েন্ট সাইড থেকে QPS থ্রটল করার কথা বিবেচনা করতে পারেন ( থ্রটলিং এবং রেট লিমিটার দেখুন)।
ব্যাচিং অনুরোধ
একাধিক অপারেশনকে একটিমাত্র অনুরোধে ব্যাচ করার কথা বিবেচনা করুন। এটি MutateFoo কলের ক্ষেত্রে সবচেয়ে বেশি প্রযোজ্য। উদাহরণস্বরূপ, যদি আপনি AdGroupAd এর একাধিক ইনস্ট্যান্সের স্ট্যাটাস আপডেট করতে চান, তাহলে প্রতিটি AdGroupAd জন্য একবার MutateAdGroupAds কল করার পরিবর্তে, আপনি একবার MutateAdGroupAds কল করে একাধিক operations পাস করতে পারেন। আরও কিছু উদাহরণের জন্য আমাদের ব্যাচ অপারেশন নির্দেশিকা দেখুন।
যদিও অনুরোধগুলিকে ব্যাচিং করলে মোট অনুরোধের সংখ্যা কমে যায় এবং প্রতি মিনিটে অনুরোধের হারের সীমা হ্রাস পায়, তবে আপনি যদি একটি একক অ্যাকাউন্টের বিরুদ্ধে বিপুল সংখ্যক অপারেশন সম্পাদন করেন তবে এটি প্রতি মিনিটে অপারেশনের হারের সীমা সক্রিয় করতে পারে।
থ্রটলিং এবং রেট লিমিটার
আপনার ক্লায়েন্ট অ্যাপ্লিকেশনে মোট থ্রেডের সংখ্যা সীমিত করার পাশাপাশি, আপনি ক্লায়েন্ট সাইডেও রেট লিমিটার প্রয়োগ করতে পারেন। এর মাধ্যমে নিশ্চিত করা যায় যে, আপনার প্রসেস এবং/অথবা ক্লাস্টার জুড়ে থাকা সমস্ত থ্রেড ক্লায়েন্ট সাইড থেকে একটি নির্দিষ্ট QPS লিমিট দ্বারা নিয়ন্ত্রিত হবে।
আপনি গুয়াভা রেট লিমিটার (Guava Rate Limiter) দেখতে পারেন, অথবা একটি ক্লাস্টারড এনভায়রনমেন্টের জন্য আপনার নিজস্ব টোকেন বাকেট -ভিত্তিক অ্যালগরিদম প্রয়োগ করতে পারেন। উদাহরণস্বরূপ, আপনি টোকেন তৈরি করে সেগুলোকে একটি শেয়ারড ট্রানজ্যাকশনাল স্টোরেজ, যেমন একটি ডাটাবেসে, সংরক্ষণ করতে পারেন এবং প্রতিটি ক্লায়েন্টকে অনুরোধটি প্রসেস করার আগে একটি টোকেন সংগ্রহ ও ব্যবহার করতে হবে। যদি টোকেনগুলো শেষ হয়ে যায়, তাহলে ক্লায়েন্টকে পরবর্তী ব্যাচের টোকেন তৈরি হওয়া পর্যন্ত অপেক্ষা করতে হবে।
সারিবদ্ধ হওয়া
অপারেশন লোড বন্টনের জন্য একটি মেসেজ কিউ হলো সমাধান, যা একই সাথে রিকোয়েস্ট এবং কনজিউমার রেটও নিয়ন্ত্রণ করে। বেশ কিছু মেসেজ কিউ অপশন উপলব্ধ আছে—কিছু ওপেন সোর্স, কিছু প্রোপাইটারি—এবং এদের মধ্যে অনেকগুলো বিভিন্ন প্রোগ্রামিং ল্যাঙ্গুয়েজের সাথে কাজ করতে পারে।
মেসেজ কিউ ব্যবহার করার সময়, একাধিক প্রডিউসার কিউতে মেসেজ পাঠাতে পারে এবং একাধিক কনজিউমার সেই মেসেজগুলো প্রসেস করতে পারে। কনজিউমার প্রান্তে একই সাথে একাধিক কনজিউমারের সংখ্যা সীমিত করে থ্রটল প্রয়োগ করা যেতে পারে, অথবা প্রডিউসার বা কনজিউমার উভয়ের জন্যই রেট লিমিটার বা থ্রটলার ব্যবহার করা যায়।
উদাহরণস্বরূপ, যদি কোনো মেসেজ কনজিউমার রেট লিমিট ত্রুটির সম্মুখীন হয়, তবে সেই কনজিউমার অনুরোধটি পুনরায় চেষ্টা করার জন্য কিউ-তে ফেরত পাঠাতে পারে। একই সাথে, সেই কনজিউমার ত্রুটি থেকে পুনরুদ্ধারের জন্য নির্দিষ্ট সংখ্যক সেকেন্ডের জন্য প্রসেসিং থামিয়ে রাখতে অন্য সকল কনজিউমারকেও অবহিত করতে পারে।