এই পর্বে যা শিখবেন
- নয়টি মাত্রা দিয়ে যেকোনো compute বিকল্প মাপা
- সাতটি পরিচিত workload-এর জন্য বিকল্প বাদ দিয়ে সিদ্ধান্তে আসা
- VM আর FaaS-এর cost crossover হাতে হিসাব করা
- Concurrency সীমা আগেই ধরা, সিস্টেম ভেঙে পড়ার পরে নয়
- Batch আর spot-এর উপযোগী কাজ চেনা
- কখন Kubernetes ছোট দলের জন্য বেশি বোঝা, সেটি যুক্তি দিয়ে বলা
১ · “সবচেয়ে ভালো compute” বলে কিছু নেই
এই মডিউলে আপনি VM, image, autoscaling আর load balancer দেখেছেন। পর্ব ০২-এ দেখেছেন কে কী সামলায়, অর্থাৎ দায়িত্বের তুলনা। এবার প্রশ্ন আলাদা: আমার এই কাজটি কোথায় চালাব? এখানে আমরা দায়িত্ব নয়, workload-এর সাথে মানানসই হওয়া মাপব। Workload মানে আপনার সিস্টেম আসলে যে কাজটি করে: একটি API, রাতের রিপোর্ট, বা ছবি ছোট করার কাজ।
যাতায়াতের কথা ভাবুন। রোজ দুই বেলা অফিসে যেতে হলে মাসিক চুক্তির গাড়ি ভালো, না চালালেও ভাড়া দিতে হয় (VM). ড্রাইভারসহ গাড়ি নিলে তেল আর মেরামত নিয়ে ভাবতে হয় না (PaaS). মাসে দুবার ডাক্তারের কাছে গেলে CNG-ই সস্তা, প্রতি ট্রিপে ভাড়া (FaaS). রাতে গুদাম খালি করতে একটি ট্রাক কয়েক ঘণ্টার জন্য ভাড়া নিলেই হয় (batch). কোনো বাহনই “সেরা” নয়। সেরা হলো দূরত্ব, কতবার যাবেন আর কী বইবেন, তার সাথে মেলা।
বিকল্পগুলোকে একবার গুছিয়ে নিই। সব কিছুর ভেতরে শেষ পর্যন্ত server-ই আছে। পার্থক্য হলো আপনি কতটা দেখেন আর সামলান।
VM
পুরো OS আপনার। যা খুশি বসানো যায়, চালু থাকলেই বিল। (পর্ব ১৫)
AWS EC2 · Azure VM · Compute EngineContainer service
আপনি image দেন, provider চালান। Node আর cluster আপনার নয়।
Fargate · Container Apps · Cloud RunKubernetes
অনেক container চালানোর পূর্ণ platform. শক্তি অনেক, শেখা আর চালানোর দামও অনেক। (পর্ব ৪২)
EKS · AKS · GKEPaaS
কোড দিলেই app চলে। Runtime, patch আর deployment platform-এর।
Elastic Beanstalk · App Service · App EngineFaaS
Event এলে একটি function চলে, না এলে কিছুই চলে না। বিল প্রতি call আর সময়ে। (পর্ব ৬৯)
Lambda · Azure Functions · Cloud Run functionsBatch service
নির্দিষ্ট কাজ দিন, শেষ হলে যন্ত্র ছেড়ে দেবে। প্রায়ই spot-এ চলে।
AWS Batch · Azure Batch · Google Cloud Batchএই বিকল্পগুলোকে একটি রেখায় সাজানো যায়। ডানে গেলে নিয়ন্ত্রণ বাড়ে, আর ওপরে গেলে আপনার দলের operational burden, অর্থাৎ চালিয়ে রাখার ঝক্কি বাড়ে। প্রায় সব কিছুই একটি কোনাকুনি রেখায় বসে। একটি ব্যতিক্রম খেয়াল করুন।
নিয়ন্ত্রণ বনাম চালানোর ঝক্কি
Control vs operational burden (qualitative, not measured)
VM-এ OS-এর ভেতরের সব কিছু আপনার হাতে। Kubernetes-এ node-এর kernel সাধারণত আপনি বদলান না, তবু cluster, upgrade আর network নিয়ে অনেক কাজ থাকে। বড় দলে এই বিনিয়োগ শোধ হয়, কারণ এক platform-এ শত শত service চলে। তাই ঝক্কির মাপ দলের আকার আর service সংখ্যার ওপরও নির্ভর করে। VM, container আর serverless-এর ভেতরের isolation বিষয়টি Operating Systems কোর্সের এই পর্বে আছে। এখানে সেটি আর নয়, এখানে শুধু সিদ্ধান্ত।
২ · নয়টি মাত্রা — তুলনা করবেন কী দিয়ে
“কোনটি ভালো” বলার আগে ঠিক করুন, কী মাপছেন। নিচের টেবিলের নয়টি মাত্রা প্রায় যেকোনো সিদ্ধান্তের জন্য যথেষ্ট। সংখ্যাগুলো মাত্রার ধারণা দেয়, provider আর সেটিংভেদে আলাদা হয়।
| মাত্রা | VM | Container service | PaaS | FaaS |
|---|---|---|---|---|
| Startup time | মিনিটের ঘরে | সেকেন্ড থেকে এক মিনিট | সেকেন্ড থেকে মিনিট | ms থেকে কয়েক সেকেন্ড (cold start-এ বেশি) |
| Scaling granularity | পুরো VM, ধাপ বড় | একটি task | একটি instance | প্রতি request বা event |
| Max run time | সীমা নেই | সাধারণত সীমা নেই, HTTP request-এ timeout থাকে | Service চলে, request-এ timeout থাকে | সীমা আছে, যেমন ১৫ মিনিট (provider-ভেদে) |
| State | লোকাল disk চলে, তবে VM হারালে ঝুঁকি | লোকাল জায়গা অস্থায়ী | লোকাল জায়গা অস্থায়ী | কিছুই থাকবে ধরে নেওয়া যায় না |
| খরচ: অল্প load | অলস থাকলেও পুরো বিল | Scale to zero থাকলে কম | ছোট plan-এর স্থির বিল | প্রায় শূন্য |
| খরচ: বেশি load | একক দাম সবচেয়ে কম | মাঝারি | মাঝারি থেকে বেশি | একক দাম সবচেয়ে বেশি |
| Operational burden | OS patch, disk, agent সব আপনার | Image আর scaling rule | কোড আর config | কোড, সাথে quota আর tracing |
| Portability | মাঝারি, disk image সরানো যায় | বেশি, image একই থাকে | মাঝারি | কম, event-এর জোড়াগুলো provider-এর |
| GPU ও বিশেষ hardware | প্রায় সব পাওয়া যায় | Provider-ভেদে সীমিত | কম | সাধারণত নেই |
| দলের দক্ষতা | Linux আর নিরাপত্তা | Docker আর network | কোড আর deployment | Event নকশা, idempotency |
খরচ দুটি সারিতে ভাঙা, তবু মাত্রা একটিই। কারণ এই দুই সারি উল্টো দিকে চলে, আর সেখান থেকেই অংশ ৪-এর crossover আসে। Startup time-ও শুধু গতির প্রশ্ন নয়। পর্ব ১৭-এ দেখেছেন, VM উঠতে দেরি হলে autoscaling ভিড়ের পেছনে পড়ে যায়। Container মিনিটের বদলে সেকেন্ডে ওঠে বলে হঠাৎ ভিড় সামলানো সহজ হয়।
State নিয়ে এক লাইন মনে রাখুন। Stateful process নিজের ভেতরে এমন ডেটা রাখে, যা হারালে ক্ষতি। পর্ব ০২-এর stateless নিয়ম মানলে ডানের তিনটি কলাম সহজে খোলে। যে app লোকাল disk-এ session বা upload রাখে, সেটি আগে বদলাতে হয়।
টেবিল দেখে শুধু কলামের “জয়” গুনবেন না। সব মাত্রার গুরুত্ব সমান নয়। একটিমাত্র শর্ত, যেমন “৪০ মিনিট চলে”, একাই একটি কলাম বাদ দিতে পারে। তাই মাত্রাগুলোকে আগে ছাঁকনি হিসেবে ব্যবহার করুন, তারপর ওজন দিন।
৩ · কাজ ধরে ধরে — সাতটি workload
এবার নিয়মগুলো সাতটি পরিচিত কাজে খাটাই। শেষ কলামটিই সবচেয়ে কাজের: কেন অন্য বিকল্প বাদ গেল। সিদ্ধান্তের কারণ জানলে শর্ত বদলালে সিদ্ধান্তও বদলাতে পারবেন।
| Workload | আসল চাহিদা | প্রথম পছন্দ | কেন অন্যটি নয় |
|---|---|---|---|
| Web API | সারাদিন চলে, দ্রুত উত্তর চাই | PaaS বা container service | Batch চলে না। Traffic খুব কম হলে তবেই FaaS, নইলে cold start. |
| রাতের batch | ৪০ মিনিট চলে, শেষ হলে ছুটি | Batch service, spot-এ | FaaS-এর সময়সীমা পার হয়। সারাদিনের VM অপচয়। |
| ML training | GPU, কয়েক ঘণ্টা বা দিন | Batch বা GPU VM, spot-এ | FaaS আর PaaS-এ GPU নেই বললেই চলে। |
| Stream consumer | সবসময় চলে, নিজের client library | Container service | কাজ শেষ হয় না, তাই batch নয়। সময়সীমার কারণে FaaS কঠিন। |
| Cron job | ২ মিনিট, ঘণ্টায় একবার | FaaS | এই ছোট কাজের জন্য VM রাখা অপচয়। |
| পুরোনো Windows app | Installer, পুরো OS লাগে | VM | কোড বদলানো যায় না, তাই container বা FaaS-এ নেওয়া কঠিন। |
| Event thumbnail | ছবি এলে কয়েক সেকেন্ডের কাজ | FaaS | অনিয়মিত, ছোট আর স্বতন্ত্র। অলস সময়ে বিল নেই। |
নিয়মগুলোকে কোড করে নিলে কৌশলটি স্পষ্ট হয়। নিচের elimination rule-গুলো “কোনটি ভালো” বলে না, শুধু বলে “কোনটি চলবে না”। প্রতিটি বাদের কারণ পাশে ছাপা হয়। যা বাকি থাকে, তার মধ্যে হালকাটি বাছা হয়। পাতার ভেতরেই চলে, কোনো account লাগে না। TEAM_K8S বা MAX_MIN বদলে চালিয়ে দেখুন।
// Workload-to-compute recommender: rules ELIMINATE options, then the
// lightest survivor wins. The limits below are ASSUMED; check your provider.
const MAX_MIN = 15, TEAM_K8S = false;
const ORDER = ["FaaS", "Batch", "PaaS", "CaaS", "K8s", "VM"]; // light to heavy
const rules = [
[(w) => w.legacyOS, ["FaaS", "Batch", "PaaS", "CaaS", "K8s"], "full OS"],
[(w) => w.minutes > MAX_MIN, ["FaaS"], "run time"],
[(w) => w.gpu, ["FaaS", "PaaS", "CaaS"], "GPU"],
[(w) => w.alwaysOn, ["Batch"], "always on"],
[(w) => !w.alwaysOn, ["PaaS"], "not a service"],
[(w) => w.coldOK === false, ["FaaS"], "cold start"],
[(w) => w.nativeLibs, ["PaaS"], "custom runtime"],
[() => !TEAM_K8S, ["K8s"], "team skill"],
];
const jobs = [
{ name: "web API", minutes: 0.1, alwaysOn: true, coldOK: false },
{ name: "nightly batch", minutes: 40 },
{ name: "ML training", minutes: 600, gpu: true },
{ name: "stream consumer", minutes: Infinity, alwaysOn: true, nativeLibs: true },
{ name: "cron job", minutes: 2 },
{ name: "legacy Windows", minutes: Infinity, alwaysOn: true, legacyOS: true },
{ name: "event thumbnail", minutes: 0.1 },
];
for (const w of jobs) {
const out = new Map();
for (const [when, opts, why] of rules) {
if (!when(w)) continue;
for (const o of opts) if (!out.has(o)) out.set(o, why);
}
const keep = ORDER.filter((o) => !out.has(o));
console.log(w.name);
console.log(" out : " + [...out].map(([o, y]) => `${o} (${y})`).join(", "));
console.log(" keep: " + keep.join(", ") + " -> pick " + keep[0]);
}web API
out : Batch (always on), FaaS (cold start), K8s (team skill)
keep: PaaS, CaaS, VM -> pick PaaS
nightly batch
out : FaaS (run time), PaaS (not a service), K8s (team skill)
keep: Batch, CaaS, VM -> pick Batch
ML training
out : FaaS (run time), PaaS (GPU), CaaS (GPU), K8s (team skill)
keep: Batch, VM -> pick Batch
stream consumer
out : FaaS (run time), Batch (always on), PaaS (custom runtime), K8s (team skill)
keep: CaaS, VM -> pick CaaS
cron job
out : PaaS (not a service), K8s (team skill)
keep: FaaS, Batch, CaaS, VM -> pick FaaS
legacy Windows
out : FaaS (full OS), Batch (full OS), PaaS (full OS), CaaS (full OS), K8s (full OS)
keep: VM -> pick VM
event thumbnail
out : PaaS (not a service), K8s (team skill)
keep: FaaS, Batch, CaaS, VM -> pick FaaS
web API-তে তিনটি বিকল্প বাদ পড়ল, প্রতিটির আলাদা কারণে। থাকল PaaS, CaaS, VM, আর ক্রমে সবচেয়ে হালকা PaaS জিতল। nightly batch বাদ দিল FaaS-কে শুধু run time-এর কারণে: MAX_MIN-কে 60 করুন, FaaS ফিরে আসবে। legacy Windows-এ একটি নিয়মই পাঁচটি বিকল্প বাদ দিল। এটিই ছাঁকনির শক্তি।
এই কোড সরল। বাস্তবে কিছু PaaS-এ .NET চলে, Windows container আছে, আর কিছু container service এখন GPU দেয়। তাই সীমাগুলো নিজের provider-এর নথির সাথে মেলান। মডেলের আসল কাজ চিন্তা গোছানো, শেষ কথা বলা নয়।
৪ · খরচের crossover — কোন load-এ কে সস্তা
VM-এর বিল একটি স্থির ভাড়া, আর FaaS-এর বিল প্রতি request-এ বাড়ে। মোবাইল প্যাকেজের মতো: মাসিক বান্ডেল কিনলে কম কথা বললে লোকসান, মিনিট-প্রতি রেটে বেশি কথা বললে লোকসান। দুই বিল যে load-এ সমান হয়, সেটিই cost crossover. পর্ব ০৪-এর break-even ছিল সময়ের ওপর, আর এটি load-এর ওপর।
সব দাম অনুমিত গোল সংখ্যা, কোনো provider-এর আসল দাম নয়। Free tier ধরা হয়নি। VM ঘণ্টায় $০.১০। FaaS: প্রতি মিলিয়ন call-এ $০.২০, প্রতি GB-second-এ $০.০০০০২। HTTP gateway: প্রতি মিলিয়নে $১। মাস ৩০ দিনের, ৭২০ ঘণ্টা। আসল হিসাবে provider-এর pricing পাতা দেখুন।
| FaaS, প্রতি মিলিয়ন | |
| VM দিকের মাসিক | |
| Crossover (মিলিয়ন/মাস) | |
| গড় req/s |
- একটি request-এর মাপ। ধরুন একটি API call ০.২ সেকেন্ড চলে আর ৫১২ MB, অর্থাৎ ০.৫ GB memory নেয়। FaaS-এর বিল আসে এই দুটি সংখ্যা থেকে।
- Compute খরচ। ০.৫ GB × ০.২ s = ০.১ GB-second. ০.১ × $০.০০০০২ = $০.০০০০০২ প্রতি request. এক মিলিয়ন request-এ $২.০০.
- লুকানো সারি যোগ। Call-এর ফি $০.২০ আর gateway $১.০০ প্রতি মিলিয়নে। মোট $৩.২০. শুধু compute দেখলে হিসাব ৩৭.৫% কম আসত।
- VM-এর মাসিক ভাড়া। $০.১০ × ৭২০ = $৭২. Request ১টি হোক বা ১ কোটি, ক্ষমতার মধ্যে থাকলে এই বিল বদলায় না।
- Crossover. ৭২ / ৩.২০ = ২২.৫ মিলিয়ন request প্রতি মাসে। ৩০ দিনে আছে ২৫,৯২,০০০ সেকেন্ড, তাই গড়ে সেকেন্ডে প্রায় ৮.৬৮টি request. সংখ্যাটি শুনতে ছোট, কিন্তু এটি দিনরাত গড়।
- যাচাই। ১০ মিলিয়নে FaaS $৩২, VM $৭২, FaaS সস্তা। ৪০ মিলিয়নে FaaS $১২৮, VM $৭২, VM সস্তা। দুই পাশে ফল উল্টাচ্ছে, তাই হিসাব ঠিক।
- দুটি VM. একটি VM নষ্ট হলে সেবা বন্ধ। ভরসার জন্য ২টি নিলে $১৪৪, crossover ৪৫ মিলিয়ন. FaaS-এ এই বাড়তি নিরাপত্তা সাধারণত দামের ভেতরেই থাকে।
- মানুষের সময়। Patch আর নজরদারিতে মাসে ৪ ঘণ্টা, প্রতি ঘণ্টা $১০ ধরলে আরও $৪০। মোট $১৮৪, crossover ৫৭.৫ মিলিয়ন. একই প্রশ্নের উত্তর ২২.৫ থেকে ৫৭.৫-এ গেল শুধু হিসাবের সারি বাড়াতে।
Crossover একটি সংখ্যা নয়, অনুমানের ফল। আগের ধাপগুলোতে দেখলেন, কোন সারি ধরছেন তার ওপর উত্তর আড়াই গুণ বদলে গেল। এবার মাঝে container service-কেও যোগ করি। ধরি একটি task ০.৫ vCPU আর ১ GB-র, ঘণ্টায় $০.০৪, অর্থাৎ মাসে $২৮.৮০। একটি task সেকেন্ডে ১৫টি request নিতে পারে, আর একটি VM ৬০টি। VM-গুলো peak-এর মাপে স্থির (peak গড়ের ১.৫ গুণ), আর task load-এর সাথে বাড়ে-কমে, ২০% বাড়তি জায়গা রেখে। সবই অনুমান।
// Monthly bill: VM vs container service vs FaaS. All prices are ASSUMED.
const P = {
vmMonth: 72, vmRps: 60, peak: 1.5, // VMs are fixed, sized for the peak
taskMonth: 28.8, taskRps: 15, head: 1.2, // tasks follow the load, 20% headroom
faasPerM: 3.2, // $ per million requests
};
const rps = (m) => m * 1e6 / (30 * 86400); // m = million requests per month
const count = (need, cap) => Math.max(1, Math.ceil(need / cap));
const bill = {
VM: (m) => count(rps(m) * P.peak, P.vmRps) * P.vmMonth,
CaaS: (m) => count(rps(m) * P.head, P.taskRps) * P.taskMonth,
FaaS: (m) => m * P.faasPerM,
};
const names = Object.keys(bill);
const best = (m) => names.reduce((a, b) => (bill[b](m) < bill[a](m) ? b : a));
console.log(" M req/mo avg rps VM CaaS FaaS cheapest");
for (const m of [1, 5, 9, 20, 50, 70, 100, 200, 400]) {
const row = names.map((n) => bill[n](m).toFixed(0).padStart(n === "FaaS" ? 9 : 8));
console.log(String(m).padStart(8), rps(m).toFixed(1).padStart(8), row.join(""), "", best(m));
}
console.log("\ncheapest choice, scanning 0.5M to 400M:");
let cur = best(0.5), from = 0.5;
for (let m = 1; m <= 400; m += 0.5) {
if (best(m) !== cur) {
console.log(` ${from}M - ${m - 0.5}M: ${cur}`);
cur = best(m); from = m;
}
}
console.log(` ${from}M - 400M: ${cur}`); M req/mo avg rps VM CaaS FaaS cheapest
1 0.4 72 29 3 FaaS
5 1.9 72 29 16 FaaS
9 3.5 72 29 29 CaaS
20 7.7 72 29 64 CaaS
50 19.3 72 58 160 CaaS
70 27.0 72 86 224 VM
100 38.6 72 115 320 VM
200 77.2 144 202 640 VM
400 154.3 288 374 1280 VM
cheapest choice, scanning 0.5M to 400M:
0.5M - 8.5M: FaaS
9M - 64.5M: CaaS
65M - 103.5M: VM
104M - 129.5M: CaaS
130M - 207M: VM
207.5M - 226.5M: CaaS
227M - 400M: VM
আউটপুটের নিচের অংশই আসল উত্তর। প্রায় ৯ মিলিয়ন পর্যন্ত FaaS, কারণ $২৮.৮০ / $৩.২০ = ৯। প্রায় ৬৫ মিলিয়ন পর্যন্ত CaaS, এখানে তৃতীয় task লাগতেই বিল $৮৬ হয়, আর একটি VM তখনও $৭২। তার পরের সারিগুলো খেয়াল করুন: VM আর CaaS কয়েকবার জায়গা বদলাচ্ছে।
এটি bug নয়। VM আর task দুটিই গোটা সংখ্যায় কেনা হয়, তাই দুই বিলই সিঁড়ির মতো লাফায়। সিঁড়ি দুটি একে অপরকে কয়েকবার কাটে। FaaS-এর বিল সিঁড়ি নয়, সোজা রেখা, আর সেই রেখা দ্রুত ওপরে ওঠে। তাই FaaS একবার পেছনে পড়লে আর ফেরে না।
এই মডেলে সবচেয়ে ছোট ধাপে একটিমাত্র VM বা task, তাই সেটি নষ্ট হলে সেবা বন্ধ। আর শুধু compute ধরা হয়েছে। অনুশীলন ১-এ এই শর্ত বদলে দেখবেন।
তিনটি বিল, ০ থেকে ১২০ মিলিয়ন request
Monthly bill vs request volume (assumed prices)
৫ · Container service — VM আর Kubernetes-এর মাঝখানে
অনেক দল এভাবে ভাবে: হয় VM, নয়তো Kubernetes. মাঝখানে একটি বড় জায়গা আছে। Serverless container service-এ আপনি একটি image দেন, CPU আর memory বলেন, কয়টি কপি চলবে বা কোন rule-এ বাড়বে তা বলেন। Node কেনা, patch করা, cluster upgrade করা আপনার কাজ নয়।
নামের গোলমাল: পর্ব ০২-এ CaaS বলতে container চালানোর platform-এর পুরো পরিবারকে বোঝানো হয়েছে, যার ভেতরে Kubernetes-ও পড়ে। এই পর্বে “container service” মানে সেই অংশ, যেখানে node আপনার নয়। Provider আর লেখকভেদে নাম আলাদা। কোড আর টেবিলে সংক্ষেপে CaaS লেখা হয়েছে।
| উদাহরণ | কী ধরনের | লক্ষণীয় |
|---|---|---|
| AWS Fargate | ECS বা EKS-এর জন্য node-ছাড়া চালানোর পথ | চালু task-এর vCPU ও memory অনুযায়ী বিল। Scale to zero নিজে থেকে হয় না। |
| Google Cloud Run | HTTP service আর job | Request না থাকলে শূন্যে নামতে পারে। এক instance অনেক request একসাথে নেয়। |
| Azure Container Apps | Service আর event-চালিত কাজ | ভেতরে Kubernetes-ভিত্তিক, তবে cluster আপনি দেখেন না। Scale to zero-র সুযোগ আছে। |
এই তথ্যগুলো লেখার সময়ের। সুবিধা বদলায়, তাই provider-এর নথি দেখে নিন। নিচের উদাহরণটি একটি সাধারণ deployment-এর চেহারা দেখায়, যা service-এর ধারণা বোঝাতে লেখা। এতে node, cluster বা OS-এর কথা নেই। অন্য provider-এ command আলাদা, ধারণা একই। কোনো account ছাড়াই শুধু পড়ে দেখুন। আসলে চালালে খরচ হতে পারে, আর পরে service মুছে ফেলতে হবে।
# উদাহরণ — চালাতে Google Cloud account লাগে, খরচ হতে পারে
gcloud run deploy shop-api \
--image=example.registry.dev/shop/api:1.4.2 \
--cpu=1 --memory=512Mi \
--min-instances=0 --max-instances=20 \
--concurrency=80 --region=asia-south1
# কাজ শেষে মুছে ফেলুন
gcloud run services delete shop-api --region=asia-south1latest tag নয়, নির্দিষ্ট 1.4.2 ব্যবহার করা হয়েছে, যাতে কী চলছে তা জানা থাকে। --max-instances বিলের ওপর একটি ছাদ, আর পরের অংশে দেখবেন এটি database-কেও বাঁচায়।
Kubernetes কখন ছোট দলের জন্য বেশি
Microservice-এর মতো Kubernetes-ও বড় সমস্যার সমাধান, আর ছোট দলে সেটি নিজেই সমস্যা হতে পারে। Managed Kubernetes-এ control plane provider চালান, তবু version upgrade, node group, ingress, network policy, RBAC, observability দলের কাজই থাকে। Kubernetes বছরে কয়েকটি minor version ছাড়ে, আর প্রতিটির সমর্থন সীমিত সময়ের। তাই upgrade একবারের কাজ নয়, নিয়মিত কাজ।
নিচের প্রশ্নগুলোর বেশিরভাগ উত্তর “না” হলে Kubernetes-এর আগে container service বা PaaS ভাবুন:
- আপনার কি অন্তত ৮–১০টি স্বাধীন service আছে, বা শিগগিরই হবে?
- দলে কি Kubernetes জানা অন্তত দুজন আছেন, যাতে on-call একজনের ওপর না পড়ে?
- Custom scheduling, sidecar বা operator-এর মতো সত্যিকারের কোনো দরকার আছে?
- একই platform-এ অনেক দল কাজ করবে, তাই সাধারণ নিয়ম লাভজনক?
- Cluster-এর খরচ আর সময় উঠে আসার মতো স্থির load আছে?
ওপরের ৮–১০ কোনো মানদণ্ড নয়, শুধু আলোচনার একটি শুরু। ছবি ১৯.১-এর কথা মনে রাখুন: ৩ জনের দলে যে ঘণ্টাগুলো cluster-এ যায়, সেগুলো পণ্য থেকে কমে। Kubernetes-এর পথ পরে খোলাই থাকে। Image আগে থেকেই তৈরি থাকলে সরে যাওয়া তুলনামূলক সহজ। এজন্যই container service একটি ভালো মাঝের ধাপ। পর্ব ৪২-এ Kubernetes-কে নিজের জায়গায় পূর্ণ মর্যাদায় দেখবেন।
৬ · FaaS-এর সীমা কখন কামড়ায় — concurrency check
FaaS-এ স্কেল করা বিনামূল্যের জাদু মনে হয়। কিন্তু একটি নিয়ম আছে: অনেক FaaS platform-এ এক instance একসাথে একটি request-ই সামলায়। তাই একসাথে যত request চলছে, ততগুলো instance লাগে। এই সংখ্যাই concurrency. এটি বের হয় Little's law থেকে:
concurrency = request rate × একটি request-এর সময়800 req/s × 0.2 s = 160রেলস্টেশনের টিকিট কাউন্টার ভাবুন। মিনিটে ৬ জন আসেন আর একজনের ২ মিনিট লাগলে গড়ে ১২ জন কাউন্টারে থাকেন। কাজ যদি ধীর হয়, ভিড় বাড়ে, যদিও মানুষ বেশি আসেনি। FaaS-এও তা-ই। সূত্রের দ্বিতীয় অংশটি লক্ষ করুন: database ধীর হলে duration বাড়ে, আর concurrency বাড়ে কোনো নতুন ক্রেতা ছাড়াই।
এবার তিনটি ছাদ ধরি। Account-এর concurrency সীমা ১,০০০, database-এর connection সীমা ৩০০, আর নতুন instance ওঠার গতি মিনিটে ৫০০। শেষ সংখ্যাটি বিশেষভাবে অনুমিত, কারণ provider-ভেদে এটি অনেক আলাদা আর অনেক দ্রুতও হতে পারে। প্রতিটি instance একটি করে database connection খোলে ধরা হলো।
// Concurrency check. Little's law: concurrent = rate x duration.
// Limits are ASSUMED round numbers; real ones differ by provider and account.
const LIMIT = 1000, DB_CONN = 300, NEW_PER_MIN = 500, PER_TASK = 80;
const cases = [
["normal day", 100, 0.2],
["sale begins", 800, 0.2],
["DB is slow", 800, 1.0],
["Eid peak", 3000, 0.4],
];
console.log("case req/s sec concurrent platform database");
for (const [name, rate, sec] of cases) {
const c = Math.round(rate * sec);
const lost = Math.max(0, rate - LIMIT / sec);
const plat = c > LIMIT ? `-${lost}/s` : "ok";
const db = c > DB_CONN ? "over" : "ok";
console.log(name.padEnd(12), String(rate).padStart(6), String(sec).padStart(4),
String(c).padStart(11), plat.padStart(9), db.padStart(9));
}
console.log("\nramp to Eid peak: starts from 20 running, +" + NEW_PER_MIN + " per minute");
const want = 1200, sec = 0.4, rate = want / sec;
let running = 20;
for (let min = 0; min <= 3; min++) {
const served = Math.min(running, want, LIMIT) / sec;
console.log(`minute ${min}: running ${String(running).padStart(4)}, ` +
`served ${String(served).padStart(4)}/s, rejected ${String(rate - served).padStart(4)}/s`);
running = Math.min(running + NEW_PER_MIN, LIMIT);
}
const tasks = Math.ceil(want / PER_TASK);
console.log(`\ncontainer service: ${want} / ${PER_TASK} per task = ${tasks} tasks; ` +
`pool of 10 per task = ${tasks * 10} DB connections`);case req/s sec concurrent platform database
normal day 100 0.2 20 ok ok
sale begins 800 0.2 160 ok ok
DB is slow 800 1 800 ok over
Eid peak 3000 0.4 1200 -500/s over
ramp to Eid peak: starts from 20 running, +500 per minute
minute 0: running 20, served 50/s, rejected 2950/s
minute 1: running 520, served 1300/s, rejected 1700/s
minute 2: running 1000, served 2500/s, rejected 500/s
minute 3: running 1000, served 2500/s, rejected 500/s
container service: 1200 / 80 per task = 15 tasks; pool of 10 per task = 150 DB connections
DB is slow সারিটি পড়ুন। Request বাড়েনি, ৮০০-ই আছে, কিন্তু সময় ০.২ থেকে ১ সেকেন্ড হলো, আর concurrency ১৬০ থেকে ৮০০ হলো। Platform ঠিক আছে, অথচ database-এর ৩০০ সীমা পার। অনেক সময় প্রথম কামড় FaaS-এর নয়, পেছনের database-এর।
Eid peak সারিতে দরকার ১,২০০, ছাদ ১,০০০, তাই সেকেন্ডে ৩,০০০ − ১,০০০ / ০.৪ = ৫০০টি request throttling-এ ফেরত যায়। মাঝের অংশে ramp দেখুন: ভিড় হঠাৎ এলে instance ধীরে ওঠে। প্রথম মিনিটে সেকেন্ডে ৩,০০০-এর মধ্যে মাত্র ৫০টি request সেবা পায়। সীমা ছাড়াও স্কেলের গতি নিজেই একটি সীমা।
শেষ লাইনে একই ভিড় container service-এ: এক task একসাথে ৮০টি request নিলে ১৫টি task-ই যথেষ্ট, আর ছোট connection pool মিলিয়ে connection মাত্র ১৫০। তাই ভিড়ের কাজে এক instance-এ অনেক request নেওয়া একটি বড় সুবিধা। অবশ্য কোড তখন একসাথে অনেক request সামলানোর উপযোগী হতে হবে।
সমাধানগুলো চিনে রাখুন, বিস্তারিত পর্ব ৬৯ আর ৭০-এ। Function-এর সর্বোচ্চ concurrency একটি নির্দিষ্ট সংখ্যায় বেঁধে দিলে database বাঁচে। সামনে queue রাখলে কাজ জমা থাকে, হারায় না, যদিও উত্তর দেরিতে আসে। Provisioned concurrency কিছু instance আগেই তৈরি রাখে, যদিও তার জন্য অলস সময়েও বিল আসে। ঈদের আগে quota বাড়ানোর আবেদনও আগেভাগে করুন।
৭ · Batch আর spot — শেষ হয় এমন কাজ
Web service-এর কাজ কখনো শেষ হয় না। Batch job-এর কাজ শেষ হয়। রাতের রিপোর্ট, ভিডিও রূপান্তর, ML training সবই শুরু আর শেষ আছে এমন কাজ। এদের বিশেষ সুবিধা: সাধারণত কেউ তাকিয়ে অপেক্ষা করেন না। এক ঘণ্টা দেরি হলেও ক্ষতি নেই, যদি সকালের আগে শেষ হয়। তাই এরাই spot-এর স্বাভাবিক গ্রাহক।
নিচের কাজটি দেখুন। ধরা যাক, FaaS-এর একটি call সর্বোচ্চ ১৫ মিনিট চলে। লেখার সময়ে AWS Lambda-র সীমা এমনই, তবে অন্য provider আর plan-এ এই সীমা ভিন্ন: কোথাও কম, কোথাও এক ঘণ্টা বা তারও বেশি। আপনার ক্ষেত্রে সীমা বদলালে ফলও বদলাবে।
| পথ | |
| রাতে সময় | |
| মাসিক বিল | |
| বাড়তি কাজ |
- কাজের মাপ। রাতের রিপোর্টে ২৪ লাখ সারি, সেকেন্ডে ১,০০০ সারি পড়া যায়, memory লাগে ৪ GB. মোট সময় ২,৪০০ সেকেন্ড, অর্থাৎ ৪০ মিনিট. সকালের আগে শেষ হলেই চলে।
- সরাসরি FaaS. ১৫ মিনিটে ৯,০০,০০০ সারি হয়, অর্থাৎ ৩৭.৫%, তারপর platform থামিয়ে দেয়। Retry করলে আবার শুরু থেকে একই জায়গায় থামবে। ফল নেই, কিন্তু বিল আছে।
- ভেঙে FaaS. ৪ ভাগে ৬ লাখ করে সারি, প্রতিটি ১০ মিনিট। বিল মাসে $৫.৭৬. চলে, কিন্তু এখন কাজ ভাগ করা, ব্যর্থ ভাগ আবার চালানো আর ফল জোড়া দেওয়ার কোড লাগবে।
- সবসময় চালু VM. সবচেয়ে সহজ: cron দিলেই হলো। বিল $৭২, অথচ ব্যস্ত থাকে দিনের মাত্র ২.৮%. আগের পথের চেয়ে প্রায় ১২.৫ গুণ দামি।
- সময় ধরে VM. Scheduler রাতে VM চালু করে, কাজ শেষে বন্ধ করে। Boot-সহ ৪৫ মিনিট। বিল $২.২৫. ঝুঁকি: কাজ আটকে গেলে VM চলতেই থাকে, তাই একটি সময়সীমা রাখুন। Disk-এর বিল আলাদা।
- Batch + spot. Batch service যন্ত্র আনে, কাজ চালায়, যন্ত্র ফেরত দেয়। Spot দাম on-demand-এর ৩০% ধরলে ঘণ্টায় $০.০৩। ১০ রাতে ১ রাত আবার চালাতে হবে ধরে নিলে বিল প্রায় $০.৭৪.
- সিদ্ধান্ত। এই কাজে batch + spot জেতে, কারণ রাতে হাতে কয়েক ঘণ্টা সময় আছে। কিন্তু যদি কাজটি ১২ মিনিটের হতো? একটি FaaS call-এই হয়ে যেত, মাসে প্রায় $১.৭৩, কোনো বাড়তি যন্ত্র ছাড়া। ছোট কাজে সরলতা নিজেই লাভ।
Spot মানে provider-এর ফাঁকা ক্ষমতা, যা দরকার হলে ফেরত নেওয়া হয়। আগে একটি ছোট নোটিশ আসে: লেখার সময়ে AWS-এ প্রায় দুই মিনিট, Azure আর Google Cloud-এ প্রায় ৩০ সেকেন্ড। নিচের প্রশ্নগুলো মিলিয়ে দেখুন, কোন কাজ spot-এ চলবে।
| প্রশ্ন | Spot-এর পক্ষে | Spot-এর বিপক্ষে |
|---|---|---|
| থামলে কী হবে? | আবার চালালেই হয় | ক্রেতার payment আটকে যায় |
| কাজ কি ভাগ করা যায়? | অনেক ছোট, স্বাধীন ভাগ | একটি লম্বা, অবিভাজ্য কাজ |
| অগ্রগতি রাখা যায়? | Checkpoint আছে | সব memory-তে, থামলেই শেষ |
| সময়সীমা? | কয়েক ঘণ্টা ছাড় আছে | ঠিক ৮টায় লাগবেই |
| Instance type? | কয়েক ধরনে চলে | একটি নির্দিষ্ট ধরনই লাগে |
সময়সীমা শক্ত হলে একটি ব্যবহারিক পথ আছে: শুরুতে spot, শেষ সময়ের আগে কাজ না ফুরালে on-demand-এ চলে যাওয়া। Checkpoint-এর মূল্য অনুশীলন ৪-এ হিসাব করবেন। দামের নিয়ম আর spot-এর বিস্তারিত পর্ব ৭২-এ আছে।
৮ · একটি সিস্টেমে কয়েকটি compute, আর সময়ের সাথে বদল
আসল সিস্টেম একটি compute-এ থাকে না। প্রতিটি অংশের চরিত্র আলাদা, তাই উত্তরও আলাদা। বিয়েবাড়ির ক্যাটারিংয়ের মতো: মূল রান্না নিজের হাঁড়িতে, মিষ্টি বাইরে থেকে অর্ডার, আর বাড়তি অতিথি এলে অতিরিক্ত লোক ডাকা। নিচে একটি কাল্পনিক অনলাইন শাড়ির দোকানের তিন বছর দেখুন। লক্ষ করুন, কোনো ধাপেই “সব নতুন করে” লেখা হয়নি। প্রতিটি বদল এসেছে একটি নির্দিষ্ট ব্যথা থেকে।
| মাস | |
| মাসিক request | |
| Task সংখ্যা | |
| মাসিক বিল |
- মাস ১: একটি VM. App, database আর cron সব এক জায়গায়। একজন developer, মাসে ২ মিলিয়ন request. এটি ভুল নকশা নয়, এই আকারে এটিই ঠিক। এখন Kubernetes আনলে শুধু সময় নষ্ট হতো।
- মাস ৬: প্রথম ব্যথা। বিক্রেতারা ছবি তুললে CPU আটকে যায়, আর ক্রেতার পাতা ধীর হয়। শুধু thumbnail-এর কাজটি FaaS-এ গেল। অনিয়মিত আর ছোট কাজ, তাই বিল মাত্র $৩। বাকি সব আগের মতো।
- মাস ১২: ডেটার ভয়। এক VM-এ database মানে VM গেলে সব গেল। Database managed সার্ভিসে সরল, যা পর্ব ২২-এ দেখবেন। বিল বাড়ল $৬০, কিন্তু backup-এর দায় কমল।
- মাস ১৮: ঈদের শিক্ষা। গত ঈদে VM আটকে গিয়েছিল, আর নতুন VM উঠতে মিনিট লাগছিল। App এখন container image, ২টি task-এ চলে, ভিড়ে বাড়ে। VM বন্ধ। Task সংখ্যা সিমুলেটরের নিয়মে, তবে ভরসার জন্য অন্তত ২টি।
- মাস ২৪: রাতের রিপোর্ট। রিপোর্ট চলত পুরোনো VM-এর cron-এ, সেই VM আর নেই। ৪০ মিনিটের কাজ FaaS-এর সময়সীমায় শেষ হয় না, তাই আগের অংশের মতো batch + spot-এ গেল।
- মাস ৩০: পণ্যের সুপারিশ। সপ্তাহে একবার ছোট একটি model train করা হয়। GPU spot-এ চলে, কয়েক ঘণ্টা, $৪০। সারা মাস GPU VM রাখা হলে বিল বহুগুণ হতো। Database-ও বড় হলো।
- মাস ৩৬: পুনর্মূল্যায়ন। ৪টি task $১১৫.২০। ২টি VM $১৪৪, অঙ্গীকারে ৩০% ছাড় পেলে $১০০.৮০। সাশ্রয় মাসে মাত্র $১৪.৪০, অথচ OS patch আবার ফিরবে। সিদ্ধান্ত: কিছুই না বদলানো। হিসাব করে “না” বলাও একটি ভালো সিদ্ধান্ত। মোট বিল $৪১৫.২০, আর পাঁচ ধরনের compute-এর কাজ।
মিশ্রণের একটি দাম আছে। প্রতিটি নতুন compute মানে আরেকটি deployment পথ, আরেক ধরনের log, আরেক সেট permission, আর on-call-এ শেখার আরেকটি জিনিস। তাই নিয়মটি হলো: কারণ ছাড়া নতুন ধরন যোগ করবেন না। দোকানটি প্রতিটি ধরন যোগ করেছে একটি মাপা ব্যথার জন্য। সবাইকে মিলিয়ে দেখার কৌশল পর্ব ৬৫-এর tracing-এ আছে।
সিদ্ধান্ত একবার নিলেই শেষ নয়। নিচের ঘটনাগুলোর কোনোটি ঘটলে হিসাবটি আবার খুলুন। না ঘটলেও বছরে অন্তত দুবার দেখুন।
| সংকেত | যে প্রশ্ন করবেন |
|---|---|
| Load crossover-এর কাছে এসেছে | পরের ছয় মাসের অনুমানে কোন বিকল্প সস্তা? |
| FaaS-এ throttling বা বিল লাফাচ্ছে | কাজটি কি এখন স্থির? Container-এ নেওয়া যায়? |
| VM-এর CPU দিনের বেশিরভাগ অলস | Rightsizing, না কি হালকা বিকল্প? |
| দলে Kubernetes জানা মানুষ এলেন বা গেলেন | দক্ষতা বদলালে আগের বাদ পড়া বিকল্প ফিরবে? |
| Provider-এর দাম বা সীমা বদলাল | আগের অনুমানগুলো এখনো সত্য? |
আরও গভীরে: Concurrency-র সূত্রটি John Little-এর নামে, যিনি ১৯৬১ সালে L = λW সম্পর্কটি প্রমাণ করেন। এটি স্থিতিশীল ব্যবস্থায় প্রায় যেকোনো সারির জন্য খাটে, arrival-এর ধরন যা-ই হোক। Serverless-এর সীমা নিয়ে দুটি লেখা একসাথে পড়ার মতো: Hellerstein ও সহ-লেখকদের “Serverless Computing: One Step Forward, Two Steps Back” (CIDR, ২০১৯) আর Berkeley-র “Cloud Programming Simplified” (২০১৯). প্রথমটি ডেটা-ভারী কাজে function-এর সীমা দেখায়, দ্বিতীয়টি ভবিষ্যৎ নিয়ে বেশি আশাবাদী। দুটি মিলিয়ে বোঝা যায়, দ্বিমত আসলে workload-এর ধরন নিয়েই।
পরীক্ষা ও ইন্টারভিউতে:
- FaaS কখন খারাপ পছন্দ? লম্বা কাজ, স্থির উঁচু load, GPU, কঠোর latency, বা অনেক লোকাল state থাকলে।
- VM আর FaaS-এর crossover কীভাবে বের করবেন? VM-এর মাসিক বিলকে প্রতি request-এর পুরো FaaS দাম দিয়ে ভাগ করে।
- Concurrency কীভাবে হিসাব করবেন? Request rate × duration, যেমন ২০০ req/s × ০.৫ s = ১০০।
- Container service আর Kubernetes-এর পার্থক্য? প্রথমটিতে node আর cluster সামলাতে হয় না, কিন্তু নিয়ন্ত্রণ কম।
- Spot কোন কাজে চলে? থামলে আবার চালানো যায়, ভাগ করা যায় আর সময়ে ছাড় আছে এমন কাজে।
৯ · AI-এর যুগে compute বাছাই
AI ভালো তালিকা বানায়, কিন্তু আপনার workload চেনে না। আর একটি প্রবণতা আছে: “scalable” শব্দটি শুনলেই সে Kubernetes লিখে দেয়, দলের আকার না জেনেই। নিচের টেবিলে এই বিষয়ে তার সাধারণ ভুলগুলো আছে।
| AI প্রায়ই যা করে | কীভাবে ধরবেন |
|---|---|
| ছোট দলকেও Kubernetes দেয় | দলের আকার আর service সংখ্যা বলে আবার জিজ্ঞেস করুন |
| পুরোনো দাম আর সময়সীমা বলে | Provider-এর pricing আর quota পাতায় মেলান |
| Free tier ধরে হিসাব করে, gateway ও log বাদ দেয় | প্রতিটি সারি আলাদা করে লিখতে বলুন |
* permission, 0.0.0.0/0 আর public storage লেখে | Least privilege দিয়ে নতুন করে লিখুন |
Secret কোডে বসায়, latest tag আর মুছে যাওয়া API version দেয় | Secret store, নির্দিষ্ট tag আর বর্তমান নথি ব্যবহার করুন |
| অস্তিত্বহীন flag বা resource argument বানায় | terraform plan বা --dry-run চালিয়ে দেখুন |
terraform destroy, kubectl delete, rm -rf সতর্কতা ছাড়াই দেয় | কী মুছবে তা বুঝে throwaway পরিবেশে আগে চালান |
AI-কে সিদ্ধান্ত দিতে না বলে বিকল্প বাদ দেওয়ার কাজে লাগান। নিচের prompt-এ নিজের সংখ্যা বসান, কোনো secret বা account id নয়:
AI-এর পরামর্শ হাতে পেলে — চেকলিস্ট
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন, তারপর “→ উত্তর” চাপুন। এখানেই টেবিল মুখস্থ থেকে বিচারবুদ্ধিতে যাওয়ার পথ।
প্র ০১EC2 ২০০৬, Heroku ২০০৭, App Engine ২০০৮, Docker ২০১৩, Lambda ২০১৪। নতুনটি এলে পুরোনোটি মরে গেল না কেন?
প্রযুক্তির ইতিহাস প্রায়ই এক সরলরেখা হিসেবে বলা হয়, যেন প্রতিটি ধাপ আগেরটিকে সরিয়েছে। আসলে compute-এর ইতিহাস স্তর জমার গল্প। প্রতিটি নতুন বিকল্প একটি নির্দিষ্ট ব্যথা কমিয়েছে, আর আগের স্তরের ওপরেই দাঁড়িয়েছে।
- VM: ২০০৬ সালে EC2 মিনিটে server দিল, কিন্তু OS রয়ে গেল আপনার।
- PaaS: Heroku আর ২০০৮ সালের App Engine সেই OS সরিয়ে দিল। দাম ছিল স্বাধীনতা: প্রথম দিকের App Engine-এ ভাষা, library আর লোকাল ফাইলে কড়া বাধা ছিল। Heroku-র অভিজ্ঞতা থেকেই পরে The Twelve-Factor App (২০১১ সালের দিকে) লেখা হয়।
- Container: ২০১৩ সালে Docker নিজের পরিবেশ প্যাক করার স্বাধীনতা ফেরাল।
- FaaS: ২০১৪ সালে Lambda অলস সময়ের বিল সরাল, আর দাম হলো সময়সীমা ও event-এর বাঁধন।
- Container service: ২০১৭ সালে Fargate আর পরে Cloud Run বলল, image-এর স্বাধীনতা রাখুন, node সরান।
খেয়াল করুন, দোলকের মতো দুলছে: স্বাধীনতা, তারপর সুবিধা, তারপর আবার স্বাধীনতা। আর নিচের স্তর হারায়নি। AWS-এর ২০২০ সালের Firecracker গবেষণাপত্র অনুযায়ী Lambda আর Fargate-এর কাজ microVM-এ চলে, অর্থাৎ VM-এর ধারণাই নিচে আছে। পুরোনো স্তর বেঁচে থাকার আরেকটি কারণ বাজার। পুরোনো Windows app, বিশেষ driver আর লাইসেন্সে বাঁধা software-এর জন্য VM ছাড়া পথ কম, আর এমন software কয়েক দশক টিকে থাকে।
মূল উপলব্ধি: নতুন স্তর পুরোনোকে মারে না, তার কিছু কাজ নিয়ে নেয়। তাই “কোনটি আধুনিক” প্রশ্নটি অর্থহীন। প্রতিটি স্তর আলাদা একটি দর-কষাকষি, আর আপনার কাজই ঠিক করে কোন দর ভালো।
প্র ০২২০২৩ সালে Prime Video-র একটি দল serverless থেকে container-এর এক প্রোগ্রামে গিয়ে খরচ বিপুল কমানোর কথা লেখে। এটি কি serverless-এর ব্যর্থতা?
২০২৩ সালের মার্চে Prime Video-র প্রযুক্তি ব্লগে একটি লেখা আসে। দলটির ভিডিও-অডিও মান পর্যবেক্ষণের ব্যবস্থা প্রথমে serverless অংশ দিয়ে সাজানো ছিল: AWS Step Functions-এ ধাপ, Lambda-য় কাজ, আর ধাপগুলোর মাঝে S3-তে ডেটা। লেখাটি অনুযায়ী, প্রত্যাশিত load-এর সামান্য অংশেই সীমা আর খরচের সমস্যা দেখা দেয়। তারা অংশগুলো এক প্রক্রিয়ায় এনে container service-এ চালায়, আর infrastructure খরচ ৯০%-এর বেশি কমানোর দাবি করে।
লেখাটি ঝড় তোলে, কেউ বলেন serverless শেষ। কিন্তু এই পর্বের মাত্রা দিয়ে দেখুন:
- Load-এর ধরন: প্রতিটি stream-এর প্রতি সেকেন্ড বিশ্লেষণ একটি স্থির, অবিরাম কাজ। এটি crossover-এর অনেক ওপরে।
- মাঝের ধাপের দাম: প্রতি সেকেন্ডে অনেক ধাপের বদল আর storage call-এর নিজস্ব দাম ছিল। এক প্রক্রিয়ার ভেতরে একই ডেটা মেমরিতেই যায়।
- ঘনত্ব: Function-এর কাজগুলো একে অপরের সাথে খুব বেশি কথা বলছিল। ঘন যোগাযোগের অংশ আলাদা করলে network-এর দাম লাগে।
Amazon-এর CTO Werner Vogels পরে একটি লেখায় এই ঘটনার প্রেক্ষিতে বলেন, স্থাপত্য কোনো এক পথের ধর্ম নয়। সিস্টেম বদলালে স্থাপত্যও আবার ভাবতে হয়। একই সাথে মনে রাখুন, লেখাটি একটি দলের একটি ব্যবস্থার গল্প, পুরো Prime Video-র নয়, আর সংখ্যাগুলো স্বাধীনভাবে যাচাই করা নয়। দলটি শুরুতে serverless দিয়ে দ্রুত বানিয়েছিল, যা হয়তো সঠিক প্রথম ধাপ ছিল। ভুল হতো যদি পরে হিসাব না করত।
মূল উপলব্ধি: ঘটনাটি serverless-এর ব্যর্থতা নয়, একটি workload-এর চরিত্র বোঝার উদাহরণ। অনিয়মিত ছোট কাজে যা সস্তা, অবিরাম ঘন কাজে তা-ই দামি।
প্র ০৩“Google যা করে, আমরাও তা করব”: তিনজনের একটি দল Kubernetes দিয়ে শুরু করতে চাইলে আপনি কী বলবেন?
Kubernetes এসেছে Google-এর Borg-এর অভিজ্ঞতা থেকে, আর ২০১৫ সালের Borg গবেষণাপত্রে দেখা যায়, সেই ব্যবস্থা তৈরি হয়েছিল বিপুল সংখ্যক মেশিন আর হাজারো কাজের জন্য। ছোট দলের সমস্যা সম্পূর্ণ আলাদা। তাদের অভাব মেশিনের নয়, মানুষের সময়ের।
২০১৫ সালে Dan McKinley তাঁর “Choose Boring Technology” প্রবন্ধে একটি কাজের উপমা দেন। প্রতিটি প্রতিষ্ঠানের হাতে অল্প কয়েকটি “innovation token” থাকে। নতুন, কম-চেনা প্রযুক্তি নিলে একটি করে খরচ হয়, আর পুরোনো প্রযুক্তির অজানা ঝুঁকি কম, কারণ তার ব্যর্থতার ধরন মানুষ চেনে। তিনজনের দল Kubernetes-এ একটি token খরচ করলে, পণ্যের জন্য কী বাকি থাকে?
তবে একতরফা হওয়াও ঠিক নয়। পক্ষের যুক্তিগুলো সৎভাবে বলুন:
- দলের একজন যদি আগে থেকেই Kubernetes ভালো চেনেন, শেখার দাম কম।
- Managed আর স্বয়ংক্রিয় ধরন, যেমন GKE Autopilot, node-এর কাজ কমাচ্ছে। সীমারেখা সরছে।
- এটি প্রায় সব provider-এ পাওয়া একটি সাধারণ API, যা চাকরির বাজারেও পরিচিত।
- কিছু পণ্যের গ্রাহক নিজের পরিবেশে Kubernetes-এ চালাতে চান। তখন এটি পণ্যের শর্ত।
আমি প্রশ্ন করব: কোন নির্দিষ্ট সমস্যাটি আজ Kubernetes ছাড়া সমাধান হচ্ছে না? উত্তর যদি হয় “ভবিষ্যতে দরকার হবে”, তবে image বানিয়ে container service-এ শুরু করুন। পরে সরে যাওয়ার পথ খোলা থাকে। বাংলাদেশের ছোট দলে on-call একজনের কাঁধে পড়ার ঝুঁকিও ভাবুন, কারণ সেই একজন চাকরি বদলালে cluster-টি কে সামলাবেন? Platform দলের ধারণা পর্ব ৬২-এ দেখবেন, যেখানে এই বিনিয়োগ শোধ হওয়া শুরু করে।
মূল উপলব্ধি: অন্য প্রতিষ্ঠানের সমাধান নয়, তাদের সমস্যাটি আপনার আছে কি না, সেটিই আসল প্রশ্ন। Kubernetes কোনো মান নির্ধারক নয়, একটি বিনিয়োগ।
প্র ০৪Crossover-এ মানুষের সময় কীভাবে ধরবেন? ঢাকা আর সান ফ্রান্সিসকোর উত্তর কি একই হবে?
অংশ ৪-এ মাসে ৪ ঘণ্টা × $১০ যোগ করতেই crossover ৪৫ থেকে ৫৭.৫ মিলিয়নে গেল। এই সারিটি তাই ছোট নয়, অথচ বিলে এটি কখনো দেখা যায় না।
লক্ষ করুন, উদাহরণের দুটি সংখ্যা আসলে দুই রকম মুদ্রায় চলে। Cloud-এর বিল সাধারণত ডলারে, সারা পৃথিবীতে প্রায় একই। মানুষের বেতন স্থানীয়। ধরা যাক, একই কাজের জন্য এক শহরে ঘণ্টায় $১০০, অন্য শহরে $১০ খরচ হয় (দুটিই অনুমিত সংখ্যা, আসল বেতনের তথ্য নয়)। প্রথম শহরে মাসিক ৪ ঘণ্টার দাম $৪০০, যা VM-এর বিলকে ছাড়িয়ে যায়। তাই সেখানে managed সার্ভিস প্রায় সবসময় যুক্তিসংগত। দ্বিতীয় শহরে একই ৪ ঘণ্টা $৪০, তাই নিজে সামলানোর যুক্তি শক্ত হতে পারে। বিদেশি পরামর্শ অন্ধভাবে নেবেন না, কারণ “মানুষ দামি, মেশিন সস্তা” বাক্যটি সব জায়গায় একই ওজনের নয়।
কিন্তু ঘণ্টার দামই সব নয়। আরও তিনটি বিষয় ভাবুন।
- সুযোগের দাম: ওই ৪ ঘণ্টায় পণ্যের কী কাজ হতো? ছোট দলে এই সময় প্রায়ই বেতনের চেয়ে বেশি মূল্যবান।
- ঝুঁকির দাম: একটি patch বাদ পড়লে কী হয়? নিরাপত্তা ঘটনার খরচ মাসিক গড়ে দেখা যায় না।
- দক্ষতার প্রাপ্যতা: কাজটি জানা মানুষ কি পাওয়া যায়, আর তিনি চলে গেলে কী হবে?
আরেকটি ব্যবহারিক বিষয় হলো, ডলারের বিল টাকার মানের সাথে ওঠানামা করে। স্থানীয় বেতন তা করে না। তাই লম্বা সময়ের হিসাবে একটি মুদ্রা-ঝুঁকিও আছে। এ ধরনের হিসাবে এক সারি অনুমান নয়, একটি পরিসীমা ধরুন, যেমন মাসে ২, ৪ আর ১০ ঘণ্টা।
মূল উপলব্ধি: মানুষের সময় বাদ দিলে হিসাব ভুল, আর বিদেশের হারে ধরলেও ভুল। নিজের দলের আসল খরচ, সুযোগের দাম আর ঝুঁকি মিলিয়েই সিদ্ধান্ত হয়।
প্র ০৫Spot এত সস্তা কেন, আর checkpoint কত ঘন ঘন নিলে সবচেয়ে ভালো?
Provider-কে peak-এর মাপে ক্ষমতা রাখতে হয়, তাই অনেক সময় মেশিন ফাঁকা থাকে। ফাঁকা মেশিন থেকে সামান্য আয়ও শূন্যের চেয়ে ভালো। এটাই spot-এর অর্থনীতি, অনেকটা শেষ মুহূর্তে কম দামে বিক্রি হওয়া বিমানের আসনের মতো। পার্থক্য হলো, এখানে মাঝপথে “নামিয়ে” দেওয়াও যায়।
AWS ২০০৯ সালে Spot Instances চালু করে, শুরুতে দর হাঁকার নিয়মে। গবেষকদের একটি পরিচিত লেখা (Ben-Yehuda ও সহ-লেখক, “Deconstructing Amazon EC2 Spot Instance Pricing”) তখনকার দামের ধরন বিশ্লেষণ করে যুক্তি দেয়, দাম সবসময় খাঁটি বাজারের ফল নাও হতে পারে। ২০১৭ সালে AWS নিয়ম সরল করে, দাম মসৃণভাবে বদলাতে থাকে, আর দর হাঁকা জরুরি থাকে না। অন্য provider-দেরও এমন সস্তা, ফেরতযোগ্য ক্ষমতা আছে, নাম ও নিয়ম আলাদা।
এবার checkpoint. প্রতি checkpoint-এ সময় যায়, আবার না নিলে থামার পর অনেক কাজ হারায়। মাঝের ভালো বিন্দুটি John Young ১৯৭৪ সালে একটি সহজ সূত্রে দেখান:
interval ≈ √(2 × checkpoint cost × mean time between failures)
ধরুন একটি checkpoint-এ ২ মিনিট লাগে, আর গড়ে ৮ ঘণ্টায়, অর্থাৎ ৪৮০ মিনিটে একবার থামে। তাহলে √(২ × ২ × ৪৮০) = √১৯২০ ≈ ৪৪ মিনিট। এটি একটি প্রথম অনুমান, পরিমাপ করে ঠিক করে নিতে হয়।
দুটি সতর্কতাও আছে। প্রথমত, spot-এর ফেরত নেওয়া প্রায়ই একসাথে ঘটে। চাহিদা বাড়লে একই type-এর অনেক মেশিন একসাথে যায়, তাই কয়েক ধরনের instance আর কয়েকটি zone মিলিয়ে নিন। দ্বিতীয়ত, GPU-র চাহিদা বেশি থাকলে spot পাওয়াই কঠিন হতে পারে। তখন “৩০% দাম” হিসাবটি কাজে লাগে না, কারণ মেশিনই নেই।
মূল উপলব্ধি: Spot হলো অনিশ্চয়তা বেচে ছাড় কেনা। যে কাজ অনিশ্চয়তা সইতে পারে, শুধু তার জন্যই এই দাম সত্যি সস্তা।
অনুশীলন
কলম-কাগজ নিন, বা ওপরের সিমুলেটরে সংখ্যা বসান। সব দাম অনুমিত। কোনো cloud account লাগবে না।
-
Crossover হিসাব: একটি function ০.৩ s চলে, ১ GB memory নেয়। প্রতি GB-second $০.০০০০২, call-এর ফি প্রতি মিলিয়নে $০.২০, gateway প্রতি মিলিয়নে $১। VM ঘণ্টায় $০.১৫। মাস ৭২০ ঘণ্টা। (ক) প্রতি মিলিয়নের FaaS খরচ, (খ) crossover, (গ) ৩০ দিনে গড় req/s বের করুন। (ঘ)
compute_cost.js-এ VM আর task দুটিরই সর্বনিম্ন সংখ্যা ২ করলে FaaS-এর সীমা কোথায় সরবে?(ক) ১ × ০.৩ = ০.৩ GB-s; ০.৩ × $০.০০০০২ = $০.০০০০০৬, অর্থাৎ প্রতি মিলিয়নে $৬। সাথে $০.২০ আর $১ যোগে $৭.২০.
(খ) VM: $০.১৫ × ৭২০ = $১০৮। ১০৮ / ৭.২০ = ১৫ মিলিয়ন.
(গ) ১,৫০,০০,০০০ / ২৫,৯২,০০০ ≈ ৫.৭৯ req/s.
(ঘ) ২টি task-এর বিল $৫৭.৬০, আর ৫৭.৬ / ৩.২ = ১৮ মিলিয়ন. সিমুলেটরে তখন FaaS থাকে ১৮ মিলিয়নের নিচে, আর CaaS প্রায় ১৩০ মিলিয়ন পর্যন্ত। Redundancy-র দাম FaaS-কে বেশি জায়গা দেয়।
-
নকশা ও সমালোচনা: একটি নতুন পণ্যে ৩ জন developer, দিনে ২০,০০০ request. প্রস্তাব: “প্রথম দিন থেকেই ৫টি microservice, Kubernetes cluster, service mesh. পরে বদলাতে কষ্ট হবে, তাই এখনই।” এই প্রস্তাবের সমস্যা বলুন আর নিজের নকশা দিন।
- ২০,০০০ / ৮৬,৪০০ ≈ ০.২৩ req/s. এই load-এ একটি ছোট instance-ই যথেষ্ট।
- ৩ জনের সময় cluster, upgrade আর mesh-এ গেলে পণ্যের গতি কমে।
- “পরে বদলাতে কষ্ট” যুক্তিটি উল্টো দিকেও খাটে। ৫টি service-এর সীমা আগেভাগে ভুল জায়গায় টানলে সেটি বদলানোই কঠিন।
- কোনো মাপা ব্যথা নেই। সমস্যার আগেই সমাধান কেনা হচ্ছে।
প্রস্তাব: একটি deployable app, container image-এ, PaaS বা container service-এ, ২টি instance, সাথে managed database. ছবি বা ইমেইলের মতো কাজ FaaS-এ। Load, দল আর ব্যথা বাড়লে অংশ ৮-এর সংকেত দেখে এগোন। Image থাকায় Kubernetes-এর পথ পরেও খোলা।
-
Predict the output: নিচের কোড না চালিয়ে দুই লাইনের আউটপুট বলুন।
const limit = 100; function check(rate, sec) { const need = rate * sec; const lost = need > limit ? rate - limit / sec : 0; console.log(need, lost); } check(400, 0.5); check(400, 0.2);প্রথম লাইন
200 200: দরকার ৪০০ × ০.৫ = ২০০, যা সীমা ১০০-এর ওপরে। সেকেন্ডে সেবা পায় ১০০ / ০.৫ = ২০০টি, তাই ৪০০ − ২০০ = ২০০টি ফেরত যায়। দ্বিতীয় লাইন80 0: request একই, শুধু duration ০.২ s হওয়ায় দরকার ৮০, যা সীমার নিচে। কোড দ্রুত করাই এখানে সীমা বাড়ানোর কাজ করল। -
Checkpoint-এর মূল্য: একটি ML training-এ ২০ ঘণ্টা GPU লাগে। On-demand ঘণ্টায় $২, spot ঘণ্টায় $০.৬০ (অনুমিত)। পুরো কাজে ৪ বার interruption হবে ধরে নিন। (ক) On-demand খরচ। (খ) Checkpoint-সহ spot, যেখানে প্রতিবার সর্বোচ্চ ৩০ মিনিট কাজ হারায়। (গ) Checkpoint ছাড়া spot, যেখানে প্রতিবার গড়ে ৫ ঘণ্টা কাজ হারায়। কোনটি বাছবেন?
(ক) ২০ × $২ = $৪০.
(খ) মোট সময় ২০ + ৪ × ০.৫ = ২২ ঘণ্টা; ২২ × $০.৬০ = $১৩.২০.
(গ) মোট সময় ২০ + ৪ × ৫ = ৪০ ঘণ্টা; ৪০ × $০.৬০ = $২৪.
(খ) জেতে। Checkpoint টাকা বাঁচায় $১০.৮০, আর তার চেয়ে বড় কথা, সময় ৪০ থেকে ২২ ঘণ্টায় নামে। Deadline কাছে থাকলে এই সময়ের মূল্যই বেশি। Checkpoint-এর নিজের সময় আর storage-এর বিল এখানে ধরা হয়নি।
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রমএকটি নতুন কাজের জন্য compute বাছাইয়ের ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)
- কাজের আসল চাহিদা লেখা: run time, load, state, GPU
- কঠিন শর্তে যেসব বিকল্প চলবে না, সেগুলো বাদ দেওয়া
- বাকি বিকল্পের খরচ আর crossover হিসাব করা
- দলের দক্ষতা দেখে সবচেয়ে হালকা বিকল্প বাছা
- পুনর্মূল্যায়নের সংকেত আর তারিখ ঠিক করা
একটি কাজ প্রতিবার ৪০ মিনিট চলে, আর সেটি ভাগ করা হয়নি। একটি provider-এর FaaS-এ প্রতি call-এর সর্বোচ্চ সীমা ১৫ মিনিট। সবচেয়ে ঠিক কথা কোনটি?
- Memory বাড়ালেই সীমা বেড়ে যাবে
- এই অবস্থায় কাজটি FaaS-এ শেষ হবে না
- Retry চালু করলে কাজটি নিজে থেকে শেষ হবে
- দিনে একবার চললে সীমা প্রযোজ্য নয়
FaaS-এর পুরো খরচ প্রতি মিলিয়ন request-এ $৪। একটি VM-এর মাসিক খরচ $১২০। দুটিই অনুমিত দাম, আর VM ক্ষমতার মধ্যে থাকে। Crossover কত?
- ৪৮০ মিলিয়ন request/মাস
- ১০ মিলিয়ন request/মাস
- ৩০ মিলিয়ন request/মাস
- কোনো crossover নেই
একটি function-এ সেকেন্ডে ৫০০ request আসে, আর প্রতিটি ০.৪ সেকেন্ড চলে। প্রতি instance একসাথে একটি request নিলে গড়ে কতগুলো instance একসাথে লাগবে?
- ২০০
- ১,২৫০
- ৫০০
- ২০
একটি serverless সিস্টেমে request-এর হার একই আছে, কিন্তু database ধীর হওয়ায় প্রতি request-এর সময় ০.১ থেকে ০.৫ সেকেন্ড হলো। Concurrency-র কী হবে?
- একই থাকবে, কারণ request বাড়েনি
- ৫ গুণ কমবে
- ৪০% বাড়বে
- ৫ গুণ বাড়বে
নিচের কোন কাজ spot ক্ষমতার জন্য সবচেয়ে উপযোগী?
- অনলাইন payment API
- একটিমাত্র primary database
- হাজারো ভিডিওকে ছোট ভাগে রূপান্তরের কাজ, রাতের মধ্যে শেষ হলেই চলে
- নির্ধারিত সময়ে লাইভ সম্প্রচার
মাসিক request বাড়ার সাথে VM আর container task-এর বিল সিঁড়ির মতো লাফায়, কিন্তু FaaS-এর বিল প্রায় সোজা রেখায় বাড়ে। মূল কারণ কী?
- VM-এ বেশি কিনলে ছাড় পাওয়া যায়
- Scaling granularity-র পার্থক্য: গোটা একক বনাম প্রতি request
- FaaS-এর কোনো সীমা নেই
- VM-এ traffic অনিয়মিত হয়
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন, অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:
মনে রাখুন
- আগে বাদ, পরে বাছাই: Run time, GPU, OS আর state আগে ছাঁকুন, তারপর সবচেয়ে হালকা বিকল্প নিন।
- Crossover = স্থির মাসিক বিল ÷ প্রতি request-এর পুরো দাম। লুকানো সারি আর মানুষের সময় ধরলে সংখ্যাটি অনেক সরে।
- Concurrency = rate × duration. ধীর database concurrency বাড়ায়, তাই সীমা আগে সেখানেই কামড়াতে পারে।
- Container service VM আর Kubernetes-এর মাঝের ভালো ধাপ। Kubernetes বিনিয়োগ, মান নির্ধারক নয়।
- একটি সিস্টেমে কয়েকটি compute স্বাভাবিক, তবে প্রতিটি ধরনের জন্য মাপা কারণ চাই, আর হিসাব নিয়মিত আবার করতে হয়।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ২০ · Object, block আর file storage — কোনটি কোন কাজেপরবর্তী পর্বStateless compute-এর ডেটা যেখানে থাকে।
- ক্লাউড কম্পিউটিং ও DevOps · কোর্স হোম৮১টি পর্বপুরো কোর্সের রোডম্যাপ।
- Operating Systems · VM, container, microVM আর serverlessগভীরে যানIsolation-এর বর্ণালি আর cold start-এর ভেতরের ধাপ।
- System Design · Scaling-এর গোড়ার কথাপাশের ট্র্যাকVertical আর horizontal scaling কেন আর কখন।
- System Design · Microservicesপাশের ট্র্যাকService ভাগ করার লাভ আর দাম।