সরাসরি পর্বে যান
পর্ব ১৯ · ৮১-এর মধ্যে · মডিউল ৩

কোন compute কখন — VM, container, PaaS আর FaaS-এর তুলনা

Choosing Compute — Matching VMs, Containers, PaaS and FaaS to the Workload

Taught in Bangla, this lesson measures compute options on nine dimensions and reaches a decision for seven common workloads by elimination. It works out the cost crossover between FaaS, container services and VMs with assumed prices, checks concurrency limits early, explains container services as the step before Kubernetes, identifies jobs suited to batch and spot, and argues when Kubernetes is too heavy for a small team.

এই পর্বে যা শিখবেন

  • নয়টি মাত্রা দিয়ে যেকোনো 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 Engine

Container service

আপনি image দেন, provider চালান। Node আর cluster আপনার নয়।

Fargate · Container Apps · Cloud Run

Kubernetes

অনেক container চালানোর পূর্ণ platform. শক্তি অনেক, শেখা আর চালানোর দামও অনেক। (পর্ব ৪২)

EKS · AKS · GKE

PaaS

কোড দিলেই app চলে। Runtime, patch আর deployment platform-এর।

Elastic Beanstalk · App Service · App Engine

FaaS

Event এলে একটি function চলে, না এলে কিছুই চলে না। বিল প্রতি call আর সময়ে। (পর্ব ৬৯)

Lambda · Azure Functions · Cloud Run functions

Batch service

নির্দিষ্ট কাজ দিন, শেষ হলে যন্ত্র ছেড়ে দেবে। প্রায়ই spot-এ চলে।

AWS Batch · Azure Batch · Google Cloud Batch

এই বিকল্পগুলোকে একটি রেখায় সাজানো যায়। ডানে গেলে নিয়ন্ত্রণ বাড়ে, আর ওপরে গেলে আপনার দলের operational burden, অর্থাৎ চালিয়ে রাখার ঝক্কি বাড়ে। প্রায় সব কিছুই একটি কোনাকুনি রেখায় বসে। একটি ব্যতিক্রম খেয়াল করুন।

নিয়ন্ত্রণ বনাম চালানোর ঝক্কি

Control vs operational burden (qualitative, not measured)

নিয়ন্ত্রণ বনাম operational burden-এর বর্ণালি নিয়ন্ত্রণ বাড়ে → চালানোর ঝক্কি বাড়ে → FaaS PaaS Container service VM Bare metal Kubernetes
ছবি ১৯.১ — Kubernetes রেখার ওপরে: এটি VM-এর চেয়ে কম নিয়ন্ত্রণ দেয়, অথচ ছোট দলের জন্য ঝক্কি বেশি। অবস্থানগুলো গুণগত ধারণা, মাপা সংখ্যা নয়।

VM-এ OS-এর ভেতরের সব কিছু আপনার হাতে। Kubernetes-এ node-এর kernel সাধারণত আপনি বদলান না, তবু cluster, upgrade আর network নিয়ে অনেক কাজ থাকে। বড় দলে এই বিনিয়োগ শোধ হয়, কারণ এক platform-এ শত শত service চলে। তাই ঝক্কির মাপ দলের আকার আর service সংখ্যার ওপরও নির্ভর করে। VM, container আর serverless-এর ভেতরের isolation বিষয়টি Operating Systems কোর্সের এই পর্বে আছে। এখানে সেটি আর নয়, এখানে শুধু সিদ্ধান্ত।

২ · নয়টি মাত্রা — তুলনা করবেন কী দিয়ে

“কোনটি ভালো” বলার আগে ঠিক করুন, কী মাপছেন। নিচের টেবিলের নয়টি মাত্রা প্রায় যেকোনো সিদ্ধান্তের জন্য যথেষ্ট। সংখ্যাগুলো মাত্রার ধারণা দেয়, provider আর সেটিংভেদে আলাদা হয়।

মাত্রাVMContainer servicePaaSFaaS
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 burdenOS patch, disk, agent সব আপনারImage আর scaling ruleকোড আর configকোড, সাথে quota আর tracing
Portabilityমাঝারি, disk image সরানো যায়বেশি, image একই থাকেমাঝারিকম, event-এর জোড়াগুলো provider-এর
GPU ও বিশেষ hardwareপ্রায় সব পাওয়া যায়Provider-ভেদে সীমিতকমসাধারণত নেই
দলের দক্ষতাLinux আর নিরাপত্তাDocker আর networkকোড আর deploymentEvent নকশা, idempotency

খরচ দুটি সারিতে ভাঙা, তবু মাত্রা একটিই। কারণ এই দুই সারি উল্টো দিকে চলে, আর সেখান থেকেই অংশ ৪-এর crossover আসে। Startup time-ও শুধু গতির প্রশ্ন নয়। পর্ব ১৭-এ দেখেছেন, VM উঠতে দেরি হলে autoscaling ভিড়ের পেছনে পড়ে যায়। Container মিনিটের বদলে সেকেন্ডে ওঠে বলে হঠাৎ ভিড় সামলানো সহজ হয়।

State নিয়ে এক লাইন মনে রাখুন। Stateful process নিজের ভেতরে এমন ডেটা রাখে, যা হারালে ক্ষতি। পর্ব ০২-এর stateless নিয়ম মানলে ডানের তিনটি কলাম সহজে খোলে। যে app লোকাল disk-এ session বা upload রাখে, সেটি আগে বদলাতে হয়।

টেবিল দেখে শুধু কলামের “জয়” গুনবেন না। সব মাত্রার গুরুত্ব সমান নয়। একটিমাত্র শর্ত, যেমন “৪০ মিনিট চলে”, একাই একটি কলাম বাদ দিতে পারে। তাই মাত্রাগুলোকে আগে ছাঁকনি হিসেবে ব্যবহার করুন, তারপর ওজন দিন।

৩ · কাজ ধরে ধরে — সাতটি workload

এবার নিয়মগুলো সাতটি পরিচিত কাজে খাটাই। শেষ কলামটিই সবচেয়ে কাজের: কেন অন্য বিকল্প বাদ গেল। সিদ্ধান্তের কারণ জানলে শর্ত বদলালে সিদ্ধান্তও বদলাতে পারবেন।

Workloadআসল চাহিদাপ্রথম পছন্দকেন অন্যটি নয়
Web APIসারাদিন চলে, দ্রুত উত্তর চাইPaaS বা container serviceBatch চলে না। Traffic খুব কম হলে তবেই FaaS, নইলে cold start.
রাতের batch৪০ মিনিট চলে, শেষ হলে ছুটিBatch service, spot-এFaaS-এর সময়সীমা পার হয়। সারাদিনের VM অপচয়।
ML trainingGPU, কয়েক ঘণ্টা বা দিনBatch বা GPU VM, spot-এFaaS আর PaaS-এ GPU নেই বললেই চলে।
Stream consumerসবসময় চলে, নিজের client libraryContainer serviceকাজ শেষ হয় না, তাই batch নয়। সময়সীমার কারণে FaaS কঠিন।
Cron job২ মিনিট, ঘণ্টায় একবারFaaSএই ছোট কাজের জন্য VM রাখা অপচয়।
পুরোনো Windows appInstaller, পুরো 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
সূত্রঅনুমিত দাম

            
  1. একটি request-এর মাপ। ধরুন একটি API call ০.২ সেকেন্ড চলে আর ৫১২ MB, অর্থাৎ ০.৫ GB memory নেয়। FaaS-এর বিল আসে এই দুটি সংখ্যা থেকে।
  2. Compute খরচ। ০.৫ GB × ০.২ s = ০.১ GB-second. ০.১ × $০.০০০০২ = $০.০০০০০২ প্রতি request. এক মিলিয়ন request-এ $২.০০.
  3. লুকানো সারি যোগ। Call-এর ফি $০.২০ আর gateway $১.০০ প্রতি মিলিয়নে। মোট $৩.২০. শুধু compute দেখলে হিসাব ৩৭.৫% কম আসত।
  4. VM-এর মাসিক ভাড়া। $০.১০ × ৭২০ = $৭২. Request ১টি হোক বা ১ কোটি, ক্ষমতার মধ্যে থাকলে এই বিল বদলায় না।
  5. Crossover. ৭২ / ৩.২০ = ২২.৫ মিলিয়ন request প্রতি মাসে। ৩০ দিনে আছে ২৫,৯২,০০০ সেকেন্ড, তাই গড়ে সেকেন্ডে প্রায় ৮.৬৮টি request. সংখ্যাটি শুনতে ছোট, কিন্তু এটি দিনরাত গড়।
  6. যাচাই। ১০ মিলিয়নে FaaS $৩২, VM $৭২, FaaS সস্তা। ৪০ মিলিয়নে FaaS $১২৮, VM $৭২, VM সস্তা। দুই পাশে ফল উল্টাচ্ছে, তাই হিসাব ঠিক।
  7. দুটি VM. একটি VM নষ্ট হলে সেবা বন্ধ। ভরসার জন্য ২টি নিলে $১৪৪, crossover ৪৫ মিলিয়ন. FaaS-এ এই বাড়তি নিরাপত্তা সাধারণত দামের ভেতরেই থাকে।
  8. মানুষের সময়। 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)

VM, container service আর FaaS-এর মাসিক বিল $0$100$200 040M80M120M মাসিক request FaaS VM Container 9M 65M
ছবি ১৯.২ — FaaS সোজা রেখা, বাকি দুটি সিঁড়ি। সবুজ বিন্দু দুটি প্রথম crossover. ১২০ মিলিয়নে VM-এর দ্বিতীয় ধাপের বিল container-এর ওপরে, আগের সিমুলেটরের মতোই।

৫ · 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 FargateECS বা EKS-এর জন্য node-ছাড়া চালানোর পথচালু task-এর vCPU ও memory অনুযায়ী বিল। Scale to zero নিজে থেকে হয় না।
Google Cloud RunHTTP service আর jobRequest না থাকলে শূন্যে নামতে পারে। এক instance অনেক request একসাথে নেয়।
Azure Container AppsService আর 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-south1

latest 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-এ এই সীমা ভিন্ন: কোথাও কম, কোথাও এক ঘণ্টা বা তারও বেশি। আপনার ক্ষেত্রে সীমা বদলালে ফলও বদলাবে।

অনুমিত দামে, compute-এর বিল
পথ
রাতে সময়
মাসিক বিল
বাড়তি কাজ
  1. কাজের মাপ। রাতের রিপোর্টে ২৪ লাখ সারি, সেকেন্ডে ১,০০০ সারি পড়া যায়, memory লাগে ৪ GB. মোট সময় ২,৪০০ সেকেন্ড, অর্থাৎ ৪০ মিনিট. সকালের আগে শেষ হলেই চলে।
  2. সরাসরি FaaS. ১৫ মিনিটে ৯,০০,০০০ সারি হয়, অর্থাৎ ৩৭.৫%, তারপর platform থামিয়ে দেয়। Retry করলে আবার শুরু থেকে একই জায়গায় থামবে। ফল নেই, কিন্তু বিল আছে।
  3. ভেঙে FaaS. ৪ ভাগে ৬ লাখ করে সারি, প্রতিটি ১০ মিনিট। বিল মাসে $৫.৭৬. চলে, কিন্তু এখন কাজ ভাগ করা, ব্যর্থ ভাগ আবার চালানো আর ফল জোড়া দেওয়ার কোড লাগবে।
  4. সবসময় চালু VM. সবচেয়ে সহজ: cron দিলেই হলো। বিল $৭২, অথচ ব্যস্ত থাকে দিনের মাত্র ২.৮%. আগের পথের চেয়ে প্রায় ১২.৫ গুণ দামি।
  5. সময় ধরে VM. Scheduler রাতে VM চালু করে, কাজ শেষে বন্ধ করে। Boot-সহ ৪৫ মিনিট। বিল $২.২৫. ঝুঁকি: কাজ আটকে গেলে VM চলতেই থাকে, তাই একটি সময়সীমা রাখুন। Disk-এর বিল আলাদা।
  6. Batch + spot. Batch service যন্ত্র আনে, কাজ চালায়, যন্ত্র ফেরত দেয়। Spot দাম on-demand-এর ৩০% ধরলে ঘণ্টায় $০.০৩। ১০ রাতে ১ রাত আবার চালাতে হবে ধরে নিলে বিল প্রায় $০.৭৪.
  7. সিদ্ধান্ত। এই কাজে 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 সংখ্যা
মাসিক বিল
বিলের সারিঅনুমিত দাম

            
  1. মাস ১: একটি VM. App, database আর cron সব এক জায়গায়। একজন developer, মাসে ২ মিলিয়ন request. এটি ভুল নকশা নয়, এই আকারে এটিই ঠিক। এখন Kubernetes আনলে শুধু সময় নষ্ট হতো।
  2. মাস ৬: প্রথম ব্যথা। বিক্রেতারা ছবি তুললে CPU আটকে যায়, আর ক্রেতার পাতা ধীর হয়। শুধু thumbnail-এর কাজটি FaaS-এ গেল। অনিয়মিত আর ছোট কাজ, তাই বিল মাত্র $৩। বাকি সব আগের মতো।
  3. মাস ১২: ডেটার ভয়। এক VM-এ database মানে VM গেলে সব গেল। Database managed সার্ভিসে সরল, যা পর্ব ২২-এ দেখবেন। বিল বাড়ল $৬০, কিন্তু backup-এর দায় কমল।
  4. মাস ১৮: ঈদের শিক্ষা। গত ঈদে VM আটকে গিয়েছিল, আর নতুন VM উঠতে মিনিট লাগছিল। App এখন container image, ২টি task-এ চলে, ভিড়ে বাড়ে। VM বন্ধ। Task সংখ্যা সিমুলেটরের নিয়মে, তবে ভরসার জন্য অন্তত ২টি।
  5. মাস ২৪: রাতের রিপোর্ট। রিপোর্ট চলত পুরোনো VM-এর cron-এ, সেই VM আর নেই। ৪০ মিনিটের কাজ FaaS-এর সময়সীমায় শেষ হয় না, তাই আগের অংশের মতো batch + spot-এ গেল।
  6. মাস ৩০: পণ্যের সুপারিশ। সপ্তাহে একবার ছোট একটি model train করা হয়। GPU spot-এ চলে, কয়েক ঘণ্টা, $৪০। সারা মাস GPU VM রাখা হলে বিল বহুগুণ হতো। Database-ও বড় হলো।
  7. মাস ৩৬: পুনর্মূল্যায়ন। ৪টি 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 নয়:

আমি একটি workload-এর জন্য compute বাছছি। কাজ: [কী করে]. Request বা event: [মাসে কত], peak: [গড়ের কত গুণ]. একবারের run time: [কত]. Memory: [কত]. GPU: [হ্যাঁ/না]. State: [কোথায় থাকে]. দল: [কতজন, কী জানে]. Provider: [নাম]. ১. VM, PaaS, container service, Kubernetes, FaaS আর batch-এর একটি টেবিল বানাও। ২. প্রতিটি বিকল্প কোন শর্তে বাদ যায়, সেটি আগে লেখো। বাদ না পড়লে কেন, সেটিও লেখো। ৩. খরচের হিসাবে প্রতিটি দাম "অনুমিত" লিখে আলাদা তালিকায় দাও। Gateway, log আর data transfer বাদ দিও না। ৪. তোমার জানা সীমাগুলো কোন তারিখের, আর provider-এর কোন পাতায় মেলাব, তা বলো। ৫. কোন দুটি সংখ্যা বদলালে সিদ্ধান্ত উল্টে যাবে, সেটি বলো।

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 লাগবে না।

  1. 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-কে বেশি জায়গা দেয়।

  2. নকশা ও সমালোচনা: একটি নতুন পণ্যে ৩ জন 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-এর পথ পরেও খোলা।

  3. 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 হওয়ায় দরকার ৮০, যা সীমার নিচে। কোড দ্রুত করাই এখানে সীমা বাড়ানোর কাজ করল।

  4. Checkpoint-এর মূল্য: একটি ML training-এ ২০ ঘণ্টা GPU লাগে। On-demand ঘণ্টায় $২, spot ঘণ্টায় $০.৬০ (অনুমিত)। পুরো কাজে ৪ বার interruption হবে ধরে নিন। (ক) On-demand খরচ। (খ) Checkpoint-সহ spot, যেখানে প্রতিবার সর্বোচ্চ ৩০ মিনিট কাজ হারায়। (গ) Checkpoint ছাড়া spot, যেখানে প্রতিবার গড়ে ৫ ঘণ্টা কাজ হারায়। কোনটি বাছবেন?

    (ক) ২০ × $২ = $৪০.

    (খ) মোট সময় ২০ + ৪ × ০.৫ = ২২ ঘণ্টা; ২২ × $০.৬০ = $১৩.২০.

    (গ) মোট সময় ২০ + ৪ × ৫ = ৪০ ঘণ্টা; ৪০ × $০.৬০ = $২৪.

    (খ) জেতে। Checkpoint টাকা বাঁচায় $১০.৮০, আর তার চেয়ে বড় কথা, সময় ৪০ থেকে ২২ ঘণ্টায় নামে। Deadline কাছে থাকলে এই সময়ের মূল্যই বেশি। Checkpoint-এর নিজের সময় আর storage-এর বিল এখানে ধরা হয়নি।

নিজেকে যাচাই করুন

ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।

ক্রমএকটি নতুন কাজের জন্য compute বাছাইয়ের ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. কাজের আসল চাহিদা লেখা: run time, load, state, GPU
  2. কঠিন শর্তে যেসব বিকল্প চলবে না, সেগুলো বাদ দেওয়া
  3. বাকি বিকল্পের খরচ আর crossover হিসাব করা
  4. দলের দক্ষতা দেখে সবচেয়ে হালকা বিকল্প বাছা
  5. পুনর্মূল্যায়নের সংকেত আর তারিখ ঠিক করা

একটি কাজ প্রতিবার ৪০ মিনিট চলে, আর সেটি ভাগ করা হয়নি। একটি 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 অনিয়মিত হয়

শব্দকোষ

লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন, অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:

মনে রাখুন

  1. আগে বাদ, পরে বাছাই: Run time, GPU, OS আর state আগে ছাঁকুন, তারপর সবচেয়ে হালকা বিকল্প নিন।
  2. Crossover = স্থির মাসিক বিল ÷ প্রতি request-এর পুরো দাম। লুকানো সারি আর মানুষের সময় ধরলে সংখ্যাটি অনেক সরে।
  3. Concurrency = rate × duration. ধীর database concurrency বাড়ায়, তাই সীমা আগে সেখানেই কামড়াতে পারে।
  4. Container service VM আর Kubernetes-এর মাঝের ভালো ধাপ। Kubernetes বিনিয়োগ, মান নির্ধারক নয়।
  5. একটি সিস্টেমে কয়েকটি compute স্বাভাবিক, তবে প্রতিটি ধরনের জন্য মাপা কারণ চাই, আর হিসাব নিয়মিত আবার করতে হয়।

পরের পর্বে: Compute মডিউল শেষ। এখন পর্যন্ত বারবার বলেছি, state বাইরে রাখুন। সেই “বাইরে” আসলে কোথায়? পর্ব ২০-এ object, block আর file storage-এর পার্থক্য আর কোন কাজে কোনটি, সেটি দেখব।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

এই পর্বটি শেয়ার করুন:
এই পর্বে ভুল পেয়েছেন? জানান