একজন ডেভেলপার ক্লায়েন্ট-সাইড পোলিং ইন্টারভাল ৩০ সেকেন্ড থেকে বাড়িয়ে ১৫ মিনিট করার মাধ্যমে Neon-এর সার্ভারলেস-ডেটাবেস কম্পিউট চার্জ কমিয়ে এনেছেন। এই দীর্ঘ বিরতি ডেটাবেসকে যথেষ্ট সময়ের জন্য নিষ্ক্রিয় (idle) থাকতে দেয় যাতে এটি 'scale to zero' অবস্থায় পৌঁছাতে পারে, ফলে প্রতি ৩০ সেকেন্ড অন্তর পোলিং করার কারণে যে কম্পিউট ক্রেডিট খরচ হতো তা বেঁচে যায়।

Neon তার কম্পিউট ইঞ্জিন যত সেকেন্ড চলে তার জন্য বিল করে। একটি সাধারণ সার্ভারলেস সেটআপে, যেকোনো রিকোয়েস্ট—তা যত ছোটই হোক না কেন—ইঞ্জিনটিকে সচল রাখে। লেখকের টিভি ড্যাশবোর্ডটি প্রতি আধা-মিনিটে ডেটাবেস থেকে তথ্য সংগ্রহ (query) করত, যদিও প্রদর্শিত ডেটা কেবল তখনই পরিবর্তিত হতো যখন কোনো ব্যবহারকারী ম্যানুয়ালি সিঙ্ক করতেন বা নতুন কোনো সম্প্রচার শুরু হতো। এই প্যাটার্নের কারণে Neon-এর কম্পিউট পুল কখনোই সেই 'zero-state'-এ পৌঁছাতে পারত না যা বিলিং বন্ধ করে দেয়, যার ফলে Vercel কস্ট ড্যাশবোর্ডে নিয়মিত খরচের ঊর্ধ্বগতি দেখা যাচ্ছিল।

কেন মূল পোলিংটি গুরুত্বপূর্ণ ছিল

  • ড্যাশবোর্ডটি ছিল সম্পূর্ণ একটি ক্লায়েন্ট-সাইড React কম্পোনেন্ট, তাই প্রতিটি ব্রাউজার ইনস্ট্যান্স সরাসরি Neon-এ রিকোয়েস্ট পাঠাত।
  • Neon-এর প্রাইসিং রিকোয়েস্ট সংখ্যার পরিবর্তে সক্রিয় কম্পিউট সময়ের সাথে খরচ নির্ধারণ করে, তাই প্রতি ৩০ সেকেন্ডে একটি রিকোয়েস্ট একটি বেসলাইন চার্জ বজায় রাখত।
  • লেখকের Vercel মনিটরিং ট্রাফিক এবং Neon কম্পিউট ব্যবহারের মধ্যে একটি সম্পর্ক দেখিয়েছে, যা নিশ্চিত করে যে পোলিং ডেটাবেসটিকে সচল রাখছিল।

ব্যর্থ বিকল্প সমাধানসমূহ

একটি দ্রুত 'debounce' পদ্ধতি—অর্থাৎ শেষ ইউজার ইন্টারঅ্যাকশনের পর রিকোয়েস্টটি বিলম্বিত করা—কোনো কাজে আসেনি কারণ টাইমারটি তখনও প্রতি ৩০ সেকেন্ড অন্তর কাজ করত। আমি Vercel Edge Functions ব্যবহার করার চেষ্টাও করেছিলাম, কিন্তু সেটি অতিরিক্ত জটিলতা তৈরি করেছিল।

সহজ সমাধান

কোডে কেবল একটি কনস্ট্যান্ট (constant) পরিবর্তন করার প্রয়োজন ছিল যা রিফ্রেশ ইন্টারভাল নির্ধারণ করত:

  • ৩০ সেকেন্ড থেকে → ৫ মিনিট
  • তারপর ৫ মিনিট থেকে → ১৫ মিনিট

১৫ মিনিট অন্তর পোলিং করলে Neon-এর নিষ্ক্রিয়তা শনাক্ত করার এবং তার কম্পিউট রিসোর্সগুলো 'spin down' করার জন্য যথেষ্ট সময় পাওয়া যায়। ড্যাশবোর্ডটি কার্যকর থাকে: ব্যবহারকারীরা যখন ম্যানুয়ালি রিফ্রেশ করেন তখন তারা সর্বশেষ ডেটা দেখতে পান, এবং মাঝে মাঝে হওয়া অটোমেটিক পোলিং কোনো নতুন সম্প্রচার শনাক্ত করতে পারে, যার ফলে অনবরত অপ্রয়োজনীয় রিকোয়েস্ট পাঠানোর প্রয়োজন হয় না।

কেন ক্লায়েন্ট-সাইড পোলিং বজায় রাখা উচিত?

  1. সরলতা – কোনো অতিরিক্ত সার্ভারলেস ফাংশন বা বিল্ড স্টেপ প্রয়োজন নেই।
  2. ব্যবহারকারীর প্রত্যাশা – ড্যাশবোর্ডটি ইতিমধ্যেই একটি ক্লায়েন্ট অ্যাপের মতো কাজ করে; ম্যানুয়াল ক্লিকের মাধ্যমে তাৎক্ষণিক আপডেট পাওয়া যায়।
  3. কস্ট মডেলের সাথে সামঞ্জস্য – Neon প্রতি রিকোয়েস্টের পরিবর্তে প্রতি সেকেন্ড কম্পিউট ব্যবহারের জন্য চার্জ করে, তাই পোলিংয়ের ফ্রিকোয়েন্সি কমানো সরাসরি বিল কমিয়ে দেয়।

সার্ভারলেস ডেভেলপারদের জন্য শিক্ষা

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

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