← कोर्सच्या मुख्य पानाकडे परत

📐 13 धडे आकृत्यांमध्ये

भाग 1: UI (निळसर, 1–4) · भाग 2: API (नारिंगी, 5–8) · भाग 3: database (हिरवा, 9–12) · भाग 4: बिघाडातून टिकणे (लाल, 13). प्रत्येक आकृती खऱ्या lab मधून काढलेली आहे — scale/demo.py छापत असलेले आकडे — आणि प्रत्येकीखाली एक lab आहे जिथे तुम्ही स्वतः dials फिरवता. वर्तुळातील क्रमांकांनुसार पुढे जा 1 → 2 → 3.

1 🎪 Scaling का

शाळेच्या जत्रेतील निकालाचा दिवस — दर सेकंदाला 40 पालकांचे 2,000 होतात; मोठी खिडकी (up) की जास्त खिडक्या (out), आणि सर्वात हळू भाग वेग ठरवतो.

🧒 सोप्या शब्दांत

सामान्य दिवशी शाळेच्या office मध्ये थोडेच पालक येतात. निकालाच्या दिवशी सगळे एकदम येतात. एक खिडकी मोठी करता येते, किंवा शेजारी शेजारी अनेक खिडक्या उघडता येतात. जास्त खिडक्या वाढतच राहू शकतात. पण रांग तिच्या सर्वात हळू पायरीइतक्याच वेगाने पुढे सरकते.

📖 नवे शब्दscale up — एकच server मोठा करणे, जास्त CPU आणि memory; पण सर्वात मोठा size कधीतरी संपतोचscale out — load balancer मागे शेजारी शेजारी जास्त servers जोडणे; मर्यादा नाहीreq/s — requests per second: दर सेकंदाला किती पालक खिडकीवर पोहोचतातbottleneck — बाकी सगळ्यांचा वेग ठरवणारा सर्वात हळू भाग
1🎪 शाळेच्या जत्रेतील निकालाचा दिवस — निकाल लागताच दर सेकंदाला 40 पालकांचे 2,000 होतातएक सामान्य दुपार40 req/s → 1 खिडकी पुरेशी01,0002,000📢 निकाल लागला40 req/s2,000 req/sवेळ →req/sनिकालाचा दिवस — 50× पालकएक खिडकी बुडते → 2,000 req/s2⬆️ scale UP — एक मोठी खिडकीउपलब्ध असलेला सर्वात मोठा sizeलहानमोठेसर्वात मोठारांग अजूनही लांब आहे✓ सोपे — code मध्ये बदल नाही, चालवायला एकच machine✗ एक कमाल मर्यादा, आणि एक restart संपूर्ण जत्रा थांबवतो3➡️ scale OUT — एका usher मागे जास्त खिडक्यामार्गदर्शक(load balancer)40 req/s → 1 खिडकी400 req/s → 5 खिडक्या2,000 req/s → 23 खिडक्याservers = ceil(2,000 ÷ (150 × 60%)) = ceil(22.2) = 23प्रत्येक खिडकी 150 req/s सेवा देते पण 60% वर चालते — spike किंवा बंद पडलेल्या खिडकीसाठी जागा4🐢 सर्वात हळू भाग वेग ठरवतो — page, API आणि database प्रत्येकाला स्वतःची योजना हवी🖥️ page (UI)CloudFront + S3 · धडे 03–04🔌 APIservers, pods, Lambda · धडे 05–08🗄️ databasecache, replicas, partitions · 09–12अडथळा (bottleneck)
⏪ आधी

वर्षभर एक server सेकंदाला 40 पालक सांभाळत होता; मग निकाल लागला आणि एकदम सेकंदाला 2,000 पालक आले.

💡 काय

Scaling म्हणजे निकालाच्या दिवशीची शाळेची जत्रा: मोठी खिडकी (up) किंवा जास्त खिडक्या (out); सर्वात हळू भाग वेग ठरवतो.

⚙️ कसे

एक server 150 req/s, 60% वर चालवला तर 40 req/s ला 1 server, 400 req/s ला 5 आणि 2,000 req/s ला 23 servers लागतात.

🎯 का

Scale out ला मर्यादा नसते आणि एक server गेला तरी तो अनेकांपैकी एकच असतो, त्यामुळे निकालाच्या दिवशी पूर्ण site बंद पडत नाही.

🚀 पुढे

पुढचा धडा बांधण्याआधी मोजतो: p50, p95, p99 आणि Little's law traffic ला servers च्या खऱ्या संख्येत बदलतात.

🧪 इथे करून पाहा — एक capacity calculator — जत्रेला किती खिडक्या लागतील?
200015060

संपूर्ण धडा 01 वाचा →

2 ⏱️ Load मोजणे

बांधण्याआधी मोजा — p50, p95, p99, Little's law, load tests आणि एका आकड्याचा खरा अर्थ किती servers.

🧒 सोप्या शब्दांत

Dipika खिडकीवर प्रत्येक पालकाची वेळ मोजते. बहुतेक जण सुमारे 100 ms मध्ये संपवतात, पण एकाला 1,200 ms थांबावे लागते. सरासरी ठीक दिसते आणि त्या पालकाला लपवते. म्हणून ती वेळा क्रमाने लावते आणि हळू टोक पाहते: p95 आणि p99. आता तिला खरोखर किती खिडक्या लागतील ते कळते.

📖 नवे शब्दp50 — मधली वेळ: अर्ध्या भेटी यापेक्षा जलद होत्या, जसे 100 msp95 — 100 पैकी 95 भेटी किमान इतक्या जलद होत्या, जसे 400 msp99 — हळू टोक: 100 पैकी फक्त 1 भेट यापेक्षा हळू होती, जसे 1,200 msLittle's law — एकाच वेळी चालू = येणारे × वेळ: 2,000 req/s × 0.12 s = एकाच वेळी 240
1⏱️ खिडकीवर मोजलेल्या 20 requests — सरासरी एक हळू भेट लपवते; percentiles ती दाखवतात60801001502003004006008001,200ms (log scale) →ती एक1,200 ms ची भेटp50 = 100 msसरासरी = 182.8 msp95 = 400 msp99 = 1,200 msएक हळू भेट ती वर ओढते — कोणत्याही खऱ्यापालकाने 182.8 ms वाट पाहिली नाहीक्रमाने लावलेले — nearest rank: p = ceil(p% × 20) या स्थानावरील value808588909295959798100102105110120130150180240400120010 वे → p5019वा → p9520वा → p992🧮 Little's law — एका वेळी आत किती जण?जत्रेचे सभागृह, आत्ता2,000येतातदर सेकंदाला0.120 sप्रत्येक जण थांबतोआत असलेले (in flight) = 2,000 req/s × 0.120 s = 240सभागृहात 240 ठिपके = त्या क्षणी व्यस्त असलेले 240 threads, DB connections किंवा Lambdaenvironments — pools चा आकार या संख्येवरून ठरवाL = λ × W (आत असलेले लोक = येण्याचा दर × प्रत्येकाचा थांबण्याचा वेळ)3🧾 एका संख्येपासून servers पर्यंतएक server, load-test केलेला: p99 बिघडण्यापूर्वी 150 req/s60% वर चालवा = 90 req/sराखीव क्षमता (headroom)अचानक वाढ / बंद पडलेला server0150 req/s2,000 ÷ 90 = 22.2 → वरच्या पूर्णांकात (round UP) → 23 servers2340 req/s → 1 · 400 req/s → 5 · 2,000 req/s → 23आधी मोजा (load test), मग उभारा — कधीही उलट नाहीservers_needed(rps, 150) = ceil(rps ÷ (150 × 0.6))
⏪ आधी

Teams सरासरी 182.8 ms पाहून नियोजन करत, आणि खिडकीवर 1,200 ms थांबलेला एक पालक त्यांना कधी दिसलाच नाही.

💡 काय

Load मोजणे म्हणजे खिडकीवर प्रत्येक पालकाची वेळ मोजणे: सरासरी लपवते त्या हळू भेटी percentiles दाखवतात.

⚙️ कसे

20 मोजलेल्या requests मधून p50 100 ms, p95 400 ms, p99 1200 ms; 2,000 req/s × 0.12 s = 240 requests एकाच वेळी चालू.

🎯 का

खरे आकडे किती threads, connections किंवा servers लागतील ते सांगतात, निकालाचा दिवस ते तुम्हाला दाखवण्याआधीच.

🚀 पुढे

पुढचा धडा UI पासून सुरू होतो: प्रत्येक gate वर झेरॉक्स प्रती, म्हणजे origin ऐवजी CloudFront pages देते.

🧪 इथे करून पाहा — वेळ मोजलेल्या 20 requests — मंद requests जोडा आणि p50, p95, p99 आणि सरासरी कशी बदलते ते पाहा
2000120

पूर्ण धडा 02 वाचा →

3 🌍 UI साठी CloudFront + S3

प्रत्येक दारावर झेरॉक्स प्रती — प्रत्येक पालकाजवळ edge cache, TTLs, hit ratio, invalidation आणि versioned files.

🧒 सोप्या शब्दांत

सगळ्यांना तीच निकालाची यादी हवी असते. सगळे पालक एकाच office मध्ये गेले तर रांग संपतच नाही. म्हणून शाळा प्रत्येक gate वर झेरॉक्स प्रती ठेवते. प्रत्येक gate आपली प्रत काही सेकंद देते, मग नवी आणते. Office ला फक्त प्रत न मिळालेले थोडे पालक दिसतात.

📖 नवे शब्दCloudFront — प्रत्येक user जवळ प्रती ठेवणारे AWS चे edge locations चे जाळेorigin — files चा खरा स्रोत, जसे S3 bucketTTL — edge नवी प्रत आणण्याआधी एक प्रत किती वेळ चालते तो वेळhit ratio — प्रतीमधून उत्तर मिळालेल्या requests चा वाटा; TTL 10 s ला 98.8%invalidation — TTL संपण्याआधीच प्रत टाकून देण्यास प्रत्येक edge ला सांगणे
1🌍 प्रत्येक दरवाजावर झेरॉक्स प्रती — पालकांजवळ CloudFront edge locations, origin म्हणून एक S3 bucketS3origin: S3 bucket(एकमेव मूळ प्रत)Virginiaसाओ पाउलोFrankfurtजोहान्सबर्गटोकियोSydneyMISS → S3 मधून आणा, एक प्रत ठेवाHIT → दरवाजावरच्या झेरॉक्स प्रतीतून दिलेसिडनीमधील पालकाला पान सिडनीमधूनच मिळते — फक्त MISS origin पर्यंत जातो2⏳ TTL — एखादी प्रत किती वेळ ताजी मानली जाते (3,000 requests, 1 मिनिट, 6 पाने)hit ratio (edge वरूनच दिलेले)S3 पर्यंत पोहोचणाऱ्या requestsTTL 0 s0.0%3,000TTL 1 s88.0%359TTL 10 s98.8%36TTL 60 s99.8%6TTL 1 s → 10 s केल्याने origin वरील requests 359 वरून 36 होतात: दहापट कमी काम3🔁 नवीन release: invalidate करा किंवा नाव बदला/app.js एका दिवसासाठी cache केलेलेMISSt=0HITt=5🧹invalidateMISSt=6invalidation चालते — पण ते प्रत्येक edge पर्यंत पोहोचायलावेळ लागतो, आणि flush केलेल्या प्रत्येक path साठी एका request चा खर्च येतो✓ अधिक चांगले: versioned file namesapp.3f9c.jsapp.a71e.jsनवीन नाव म्हणजे नवीन cache key — वर्षभर cache करा,invalidation ची गरजच नाही
⏪ आधी

प्रत्येक शहरातले पालक प्रत्येक page एकाच S3 origin कडून आणत: मिनिटाला 3,000 requests, सगळ्या एकाच जागी.

💡 काय

CloudFront प्रत्येक gate वर झेरॉक्स प्रती ठेवते: प्रत्येक पालकाजवळचा edge cache UI च्या प्रती TTL पर्यंत ठेवतो.

⚙️ कसे

मिनिटाच्या 3,000 requests पैकी TTL 0 s ला सगळ्या 3,000 S3 कडे जातात; TTL 10 s ला 98.8% hit ratio आणि S3 ला फक्त 36.

🎯 का

पालकांना जवळच्या edge वरून pages मिळतात, जलद आणि स्वस्त; app.3f9c.js सारख्या versioned नावांना invalidation लागत नाही.

🚀 पुढे

पुढचा धडा live pages सुद्धा edge वर काही सेकंद cache करतो: Cache-Control, stale-while-revalidate आणि shield वापरून.

🧪 इथे करून पाहा — एक CloudFront edge, 6 पानांसाठी जत्रेच्या traffic चे एक मिनिट — TTL बदला
1050

पूर्ण धडा 03 वाचा →

4 ⚡ edge वर dynamic पाने

गजबजलेली live पानेसुद्धा काही सेकंदांसाठी cache करता येतात — Cache-Control, stale-while-revalidate, origin shield आणि edge functions.

🧒 सोप्या शब्दांत

निकालाचा फलक बदलतो, पण दर सेकंदाला नाही. 10 सेकंद जुनी प्रतही गर्दीसाठी चालते. प्रत किती वेळ ठेवायची ते सांगणारी चिठ्ठी प्रत्येक page सोबत असते. तुमच्या स्वतःच्या गुणांसारख्या private page वर मात्र माझी कधीच प्रत काढू नका अशी चिठ्ठी असते.

📖 नवे शब्दCache-Control — कोण प्रत ठेवू शकतो आणि किती वेळ ते सांगणारा headers-maxage — CloudFront सारखा shared cache प्रत किती सेकंद ठेवू शकतोstale-while-revalidate — नवी प्रत आणली जात असताना थोडा वेळ जुनी प्रत देत राहणेorigin shield — सगळे edges आधी विचारतात तो एक मधला cache, त्यामुळे origin ला 30 ऐवजी 6 requests
1✉️ प्रत्येक response वर एक शिक्का असतो — Cache-Control हे CloudFront आणि browser ला सांगतो की ते काय ठेवू शकतात/app.3f9c.jsCache-Control:public, max-age=31536000,immutable1 वर्ष · कधीच बदलत नाही🧑‍💻 browser1 वर्ष🌍 CloudFront edge1 वर्ष/results/3ACache-Control:public, s-maxage=10,stale-while-revalidate=3010 s · 30 s STALE चालेल🧑‍💻 browserपुन्हा विचारतो🌍 CloudFront edge10 s + 30 s stale/meCache-Control:private, no-storePRIVATE · प्रत काढू नका🧑‍💻 browserno-store🌍 CloudFront edgeकधीच cache होत नाहीversioned files: सगळीकडे वर्षभर cache · गर्दीची live पाने: edge वर काही सेकंद (s-maxage), आणि एकrequest ती ताजी करत असताना जुनी प्रत द्या · ज्यात user आहे असे काहीही: private, no-store — logged-in पान कधीही shared cache मध्ये जाता कामा नये2🛡️ origin shield — सगळ्यांच्या वतीने origin ला विचारणारा एक जास्तीचा दरवाजाshield शिवाय🏫 origin(तुमचा API)60 s मध्ये 30 requestsप्रत्येक edge स्वतःच refresh करतो: 5 × 6origin shield सह🏫 origin(तुमचा API)shield (एक edge region)6 requestsedges shield ला विचारतात; फक्त shield origin ला विचारतो3⚡ live पानावर काही सेकंदांचा cacheएका edge वर /results/3A, s-maxage 10 s:0s10s20s30s40s50s60sमिनिटाला 6 origin fetches (नारिंगी बाण)मधले सगळे: प्रतीतूनच HITत्या edge वर 2,000 req/s →दर 10 s ला 1 origin request⚙️ edge वर छोटासा codeCloudFront Functionsredirects · headers · A/B cookiesLambda@Edgeauth checks · जास्त काही लागणारे rewritesदरवाजावरच चालते — origin ला ते दिसतही नाही
⏪ आधी

/results/3A सारखी live pages कधीच cache होत नसत, त्यामुळे प्रत्येक पालकाचा refresh थेट origin पर्यंत जात असे.

💡 काय

गर्दीच्या निकालाचीही 10 सेकंदांसाठी झेरॉक्स प्रत काढता येते: प्रत किती वेळ चालेल ते Cache-Control प्रत्येक gate ला सांगते.

⚙️ कसे

/results/3A पाठवते s-maxage=10, stale-while-revalidate=30; 5 edges origin ला 30 requests पाठवतात, shield सह फक्त 6.

🎯 का

10 सेकंदांचा cache 2,000 req/s ला प्रत्येक location मागे 10 s ला 1 request बनवतो, आणि /me private, no-store च राहते.

🚀 पुढे

पुढचा धडा API कडे वळतो: load balancer मागे stateless servers, म्हणजे कोणतीही खिडकी कोणत्याही पालकाला सेवा देऊ शकते.

🧪 इथे करून पाहा — response header, edges ची संख्या आणि shield निवडा — 60 s, प्रत्येक edge ला सेकंदाला एकदा विचारले जाते
105

पूर्ण धडा 04 वाचा →

5 ⚖️ Stateless APIs + load balancers

कोणतीही खिडकी कोणत्याही पालकांना सेवा देऊ शकते — sessions server memory बाहेर, health checks, round robin.

🧒 सोप्या शब्दांत

Katrina सहा वेळा click करते आणि प्रत्येक वेळी वेगळी खिडकी उत्तर देते. फक्त खिडकी 1 लाच ती लक्षात असेल, तर खिडकी 2 आणि 3 तिला पुन्हा login ला पाठवतात. म्हणून शाळा तिचे नाव सगळ्या खिडक्या वाचू शकतील अशा एका सामायिक नोंदवहीत लिहिते. आता कोणतीही खिडकी तिला सेवा देऊ शकते.

📖 नवे शब्दload balancer — प्रत्येक पालकाला मोकळ्या, चालू खिडकीकडे पाठवणारा मदतनीसstateless — तुमच्याबद्दल स्वतःच्या memory मध्ये काहीच न ठेवणारा serversession — तुम्ही logged in आहात हे सांगणारी नोंद; ती एका server मध्ये नाही, Redis मध्ये ठेवाhealth check — नियमित ping; उत्तर न देणाऱ्या खिडकीकडे आणखी पालक पाठवले जात नाहीत
1⚖️ कतरिना 6 वेळा click करते — usher प्रत्येक click पुढच्या खिडकीकडे पाठवतो (round robin)Katrina123456तिचे 6 clicksload balancer(ALB · round robin)clicks 1 · 4srv-1🧠 त्याच्या स्वतःच्या memory मध्येmemory: katrina = logged inclicks 2 · 5srv-2🧠 त्याच्या स्वतःच्या memory मध्येmemory: katrina बद्दल काहीच नाहीclicks 3 · 6srv-3🧠 त्याच्या स्वतःच्या memory मध्येmemory: katrina बद्दल काहीच नाहीRedis (shared)katrina = logged inप्रत्येक खिडकी sessionएकाच shared store मधून वाचते —कोणतीही खिडकी कोणत्याही पालकांना सेवा देऊ शकतेएका (ONE) खिडकीच्या memory मधील session फक्त त्याच खिडकीवर खरा असतो2🖱️ तेच 6 clicks — server memory मधील session विरुद्ध Redis मधील session1क्लिकsrv-1memory:लॉग इन केलेलेRedis:लॉग इन केलेलेतिने इथे login केले2क्लिकsrv-2memory:सापडले नाही (NOT FOUND)→ login पानRedis:लॉग इन केलेलेlogged out झाली!3क्लिकsrv-3memory:सापडले नाही (NOT FOUND)→ login पानRedis:लॉग इन केलेलेlogged out झाली!4क्लिकsrv-1memory:लॉग इन केलेलेRedis:लॉग इन केलेलेपुन्हा srv-1 वर — नशीबवान5क्लिकsrv-2memory:सापडले नाही (NOT FOUND)→ login पानRedis:लॉग इन केलेलेlogged out झाली!6क्लिकsrv-3memory:सापडले नाही (NOT FOUND)→ login पानRedis:लॉग इन केलेलेlogged out झाली!3🩺 health checks — आजारी खिडक्यांकडे पालक पाठवले जात नाहीतsrv-1✓ /health 200 OKsrv-2✗ /health अयशस्वी → वगळलाsrv-3✓ /health 200 OK4📦 stateless = या गोष्टी server च्या बाहेर (OUTSIDE) ठेवाsessionsRedis / DynamoDB (किंवा signed tokens)अपलोडS3cachesElastiCache — सर्वांसाठी एकच सामायिक प्रत
⏪ आधी

Sessions server च्या memory मध्ये होते, त्यामुळे round robin ने click srv-2 किंवा srv-3 कडे पाठवताच Katrina logout होत असे.

💡 काय

Stateless म्हणजे कोणतीही खिडकी कोणत्याही पालकाला सेवा देऊ शकते: sessions Redis मध्ये राहतात आणि load balancer पालक वाटून देतो.

⚙️ कसे

Katrina चे 6 clicks round robin ने 3 servers वर जातात: memory sessions 4 clicks वर अपयशी, Redis मुळे ती सहाही वेळा logged in.

🎯 का

Servers मोकळेपणाने वाढवता किंवा काढता येतात, आणि health checks बंद पडलेल्या खिडकीपासून पालकांना दूर ठेवतात.

🚀 पुढे

पुढचा धडा रांग वाढली की आपोआप खिडक्या वाढवतो: target tracking आणि warm-up सह Auto Scaling.

🧪 इथे करून पाहा — Katrina चे clicks load balancer मधून पाठवा — मग तिचे session Redis मध्ये हलवा

पूर्ण धडा 05 वाचा →

6 📈 Auto Scaling

रांग वाढली की जास्त खिडक्या — target tracking, warm-up, scheduled scaling आणि हळूहळू scale in.

🧒 सोप्या शब्दांत

रांग वाढली की शाळा जास्त खिडक्या उघडते. पण नवी खिडकी तयार व्हायला दोन मिनिटे लागतात. निकाल आधी लागला तर पालक लांब रांगेत थांबतात. म्हणून निकालाच्या दिवशी शाळा जादा खिडक्या आधीच उघडते. गर्दी गेली की त्या एकेक करून बंद करते.

📖 नवे शब्दAuto Scaling group — आपोआप वाढणारा आणि कमी होणारा servers चा गटtarget tracking — CPU 60% सारखा आकडा टिकवण्यासाठी servers वाढवणे किंवा कमी करणेwarm-up — नव्या server ला मदत करण्याआधी लागणारा वेळ; इथे 2 मिनिटेscheduled scaling — येणार हे माहीत असलेल्या गर्दीआधी ठरलेल्या वेळी servers वाढवणे
1📈 निकाल मिनिट 2 ला लागतात — target 60% CPU, प्रति server 150 req/s, 2 मिनिटांचा warm-up05001,0001,5002,0002,5003,000req/s6001,500900+8 मिनिट 2 ला मागवले → मिनिट 4 पासून सेवेत+10 आणखी मिनिट 3 ला → मिनिट 5 पासून सेवेतक्षमतेपेक्षा जास्त →(मंद pages / 5xx)scale in: दर मिनिटाला एक server ↘भार (req/s)सेवेत × 150 req/sसुटलेले / मंदमिनिट01234567891011req/s1501509001,8002,4002,4002,4001,200600300300300सेवेत22221020202019181716util50%50%100%100%100%80%80%40%21%11%12%12%2⏳ नवीन खिडक्या उघडायला वेळ लागतोमिनिट 2: 8 मागवलेमिनिट 4: सेवेत2 मिनिटांचा warm-upनवीन servers warm-up होण्याआधीच spike येऊन धडकतो →📅 निकाल लागण्याआधीच (BEFORE) scale-out चे वेळापत्रक ठरवा🔥 2 थंड servers नव्हे, तर warm किमान संख्या ठेवा3↘️ हळूहळू scale in करा — एका वेळी एक serverमिनिट 720मिनिट 819मिनिट 918मिनिट 1017मिनिट 1116भार 2,400 वरून 300 req/s वर आला — group दर मिनिटाला एकचखिडकी सोडतो, म्हणजे दुसरी लाट आली तर समोर फक्त 2 servers नसतात
⏪ आधी

मिनिट 2 ला निकाल लागेपर्यंत दोन servers 50% वर चालत होते; मिनिट 3 पर्यंत 1,500 req/s क्षमतेबाहेर गेल्या.

💡 काय

रांग वाढली की Auto Scaling जास्त खिडक्या उघडते: target tracking servers वाढवून CPU 60% जवळ ठेवते.

⚙️ कसे

2,400 req/s वर servers 2 → 10 → 20 झाले, पण 2 मिनिटांच्या warm-up मुळे 600, 1,500 आणि 900 req/s क्षमतेबाहेर राहिल्या.

🎯 का

क्षमता गर्दीमागे जाते, आणि निकालाच्या दिवसाआधी scheduled scale-out केला तर कोणत्याही पालकाला हळू page दिसत नाही.

🚀 पुढे

पुढचा धडा Kubernetes वर scale करतो: CPU-utilisation target साठी HPA pods वाढवतो, आणि Karpenter त्यांच्याखाली nodes वाढवतो.

🧪 इथे करून पाहा — निकालाच्या दिवसाचा भार (धड्यातील 12 मिनिटे) — autoscaler tune करा आणि लाल क्षमतेपेक्षा जास्त भाग पाहा
260150220

पूर्ण धडा 06 वाचा →

7 ☸️ Kubernetes वर scaling

Pods आणि ते ज्या जमिनीवर उभे असतात ती — CPU target साठी HPA सूत्र, प्रामाणिक requests, bin packing, Cluster Autoscaler आणि Karpenter.

🧒 सोप्या शब्दांत

प्रत्येक खिडकी म्हणजे pod नावाचा छोटा stall, आणि stalls nodes नावाच्या जमिनीच्या तुकड्यांवर उभे असतात. Stalls वर खूप काम आले की एक मदतनीस आणखी stalls लावतो. जमीन उरली नाही की दुसरा मदतनीस आणखी जमीन भाड्याने घेतो. प्रत्येक stall ने किती जागा लागते ते प्रामाणिकपणे सांगायला हवे.

📖 नवे शब्दpod — Kubernetes वर चालणारी तुमच्या app ची एक प्रत, एका खिडकीसारखीHPA — CPU-utilisation target साठी pods वाढवतो: target 60% असताना 90% वरचे 4 pods 6 होतातnode — pods ज्यावर उभे असतात ते machine; 500m चे 4 pods एका 2,000m node वर बसतातKarpenter — कोणत्याही node वर जागा नसल्याने pods Pending राहिले की nodes वाढवतो
1🎛️ CPU utilisation वर HPA: desired = ceil(replicas × current% / target%) — target 60%, 10% सहनशीलता (tolerance)4 pods, 90% CPU वरceil(4 × 90% / 60%) = 6→ 6 pods6 pods, 63% CPU वर63% / 60% = 1.05 — ±10% च्या आत→ 6 pods (बदल नाही)6 pods, 30% CPU वरceil(6 × 30% / 60%) = 3→ 3 pods3 pods, 240% CPU वरceil(3 × 240% / 60%) = 12→ 12 pods2🧺 nodes म्हणजे ट्रे, pods म्हणजे त्यावरचे डबे — scheduler प्रत्येक pod ने मागितलेल्या (REQUESTS) प्रमाणानुसार भरतो16 pods × 500m CPU, 2,000m च्या nodes वर → 4 nodesnode 1 · 2,000m500m500m500m500mभरला ✓node 2 · 2,000m500m500m500m500mभरला ✓node 3 · 2,000m500m500m500m500mभरला ✓node 4 · 2,000m500m500m500m500mभरला ✓तेच pods 1,100m मागत असतील तर → 16 nodes1,100m900m वाया1,100m900m वाया1,100m900m वाया1,100m900m वाया1,100m900m वाया1,100m900m वाया1,100m900m वाया1,100m900m वाया1,100m900m वाया1,100m900m वाया1,100m900m वाया1,100m900m वाया1,100m900m वाया1,100m900m वाया1,100m900m वाया1,100m900m वायाप्रत्येक node वर एकच बसतो (2 × 1,100 = 2,200 > 2,000) — 14,400m चे पैसे भरले, पण वापर नाहीप्रत्येक node वर नेमके 4 pods बसतात — काहीच वाया नाही3⏳ Pending pods → Cluster Autoscaler / Karpenter एक node जोडतोPending"0/4 nodes are available: 4 Insufficient cpu."लक्ष ठेवतोKarpenter /Cluster Autoscalerनवीन nodeHPA podsजोडतो; हेnodes जोडतात
⏪ आधी

निकालाच्या दिवशी ठरावीक pods 90% CPU वर होते, आणि कोणत्याही node वर जागा नसल्याने नवे pods Pending राहिले.

💡 काय

Pods म्हणजे खिडक्या आणि nodes म्हणजे त्या उभ्या असलेली जमीन: HPA pods वाढवतो, Karpenter त्यांच्यासाठी जमीन वाढवतो.

⚙️ कसे

4 pods 90% CPU वर, CPU-utilisation target 60% साठी → ceil(4 × 90/60) = 6 pods; 500m मागणारे 16 pods 2,000m च्या 4 nodes वर बसतात.

🎯 का

प्रामाणिक requests मुळेच दोन्ही autoscalers चालतात: 1,100m मागितले तर तेच 16 pods 16 nodes घेतात.

🚀 पुढे

पुढचा धडा serverless कडे जातो: Lambda प्रत्येक पालकासाठी खिडकी उघडते, आणि concurrency ≈ requests × duration.

🧪 इथे करून पाहा — CPU utilisation वर HPA: desired = ceil(replicas × current% / target%) — मग pods nodes वर भरा
4906016500

पूर्ण धडा 07 वाचा →

8 🪄 Serverless scaling

प्रत्येक पालकासाठी एक खिडकी उघडते — Lambda concurrency ≈ requests × duration, cold starts, reserved आणि provisioned concurrency.

🧒 सोप्या शब्दांत

कल्पना करा, पालक येताच प्रकट होणारी आणि तो गेल्यावर नाहीशी होणारी जादूची खिडकी. तेच Lambda. सेकंदाला 2,000 पालक, प्रत्येकी सेकंदाचा पाचवा भाग, म्हणजे एकाच वेळी 400 खिडक्या. अगदी नवी खिडकी पहिल्या पाहुण्यासाठी हळू असते, म्हणून काही खिडक्या तयार ठेवता येतात.

📖 नवे शब्दconcurrency — एकाच क्षणी किती चालू आहेत; स्थिर traffic साठी ≈ सेकंदाला requests × durationcold start — नवे environment सुरू होत असताना लागणारी जादा वाट, सुमारे 600 msreserved concurrency — एका function साठीची मर्यादा; 300 असताना बाकीचे throttled होतातprovisioned concurrency — आधीच तयार ठेवलेली environments, त्यामुळे cold starts नाहीत
1🪄 Lambda: प्रत्येक पालकासाठी एक खिडकी उगवते — concurrency ≈ प्रति सेकंद requests × सरासरी duration100 req/s × 200 ms≈ एकाच वेळी 20 environments2,000 req/s × 200 ms≈ एकाच वेळी 400 environments2,000 req/s × 50 ms≈ एकाच वेळी 100 environments≈, = नाही: हे सूत्र स्थिर traffic आणि सरासरी duration साठी लागू होते — अचानक गर्दी आणि मंद अपवादांसाठी त्यापेक्षा जास्त जागा ठेवाप्रत्येक छोटा चौकोन = एक environment (पालक तिथे असेपर्यंतच अस्तित्वात असणारी खिडकी) — 200 ms ऐवजी 50 ms असेल तर यांपैकी फक्त एक चतुर्थांश लागतात;account चा default प्रति Region 1,000 concurrent executions आहे (वाढवता येणारा quota)2❄️ निकालाचा spike — reserved concurrency 300, cold start सुमारे 600 ms0100200300400राखीव 300environmentsसेकंद 0100 req/s20 लागतात · 20 चालतात20 cold startsसेकंद 12,000 req/s400 लागतात300 चालतात429 × 500280 cold startsसेकंद 22,000 req/s400 लागतात300 चालतात429 × 500सेकंद 3500 req/s100 लागतात · 100 चालतातbars कसे वाचायचेलागणारेचालू (मर्यादित)≈ 20 cold starts429throttled (Too ManyRequests)सेकंद 1: 280 नवीनenvironments थंड (cold) सुरू होतात;2,000 × 300/400 = 1,500सेवा दिली → 500 throttledसेकंद 2: सगळे warm, तरीही300 ची मर्यादा → आणखी 5003🔥 provisioned concurrency — निकाल लागण्याआधीच 400 environments चा warm-up2,000 req/s × 200 ms वर = 400 लागतात:cold starts = 0ते वाट पाहत असतानाही तुम्ही त्यांचे पैसे भरताधडा 06 मधील warm किमान संख्येप्रमाणे, निकालाच्या दिवसासाठी त्याचे वेळापत्रक ठरवा
⏪ आधी

Autoscaled servers ना सुद्धा warm up व्हायला मिनिटे लागत, आणि शांत रात्रीही न वापरलेल्या खिडक्यांचे पैसे भरावे लागत.

💡 काय

Lambda प्रत्येक पालकासाठी खिडकी उघडते: स्थिर traffic साठी concurrency ≈ सेकंदाला requests × duration.

⚙️ कसे

2,000 req/s × 200 ms ला 400 environments लागतात; reserved concurrency 300 असताना दर सेकंदाला 500 req/s throttled झाल्या.

🎯 का

पैसे प्रति millisecond आणि scaling प्रति request; 400 provisioned environments मुळे 2,000 req/s वर cold starts 0 झाले.

🚀 पुढे

पुढचा धडा database पर्यंत पोहोचतो: त्याच्यासमोर सूचना फलक, Redis cache-aside, म्हणजे बहुतेक reads त्याच्यापर्यंत जातच नाहीत.

🧪 इथे करून पाहा — Lambda वर निकालाचा spike — 100, spike, spike, 500 req/s चे सेकंद
20020003000

पूर्ण धडा 08 वाचा →

9 📌 Database चे caching

कार्यालयासमोरचा सूचना फलक — Redis सह cache-aside, TTLs, hit ratio आणि stampede थांबवणे.

🧒 सोप्या शब्दांत

पालक office ला सारखा तोच प्रश्न विचारतात: 3A चा निकाल काय? म्हणून office उत्तर सूचना फलकावर लावते. पालक फलक वाचतात, आणि सूचना काढली गेली तरच office ला विचारले जाते. ती काढली की एकच मदतनीस नवे उत्तर आणतो आणि बाकी सगळे थांबतात.

📖 नवे शब्दRedis — अतिशय जलद in-memory store, database समोरचा सूचना फलक म्हणून वापरला जातोcache-aside — आधी cache वाचा; miss झाला तर DB वाचून cache भरा; write झाला की key delete कराstampede — एकाच expired key वर 500 जणांचा miss आणि सगळे एकदम database वरsingle-flight — एकच जण key पुन्हा भरतो आणि बाकीचे थांबतात: 500 reads चे 1 होतात
1📌 office समोरचा सूचना फलक — Redis सह cache-aside, TTL 30 s6,000 वेळा वाचन —results:3Aएका मिनिटात5,998 HITSफलक वाचा — रांग नाहीresults:3Aresults:3Bवेळापत्रकमेनू📌 सूचना फलक = Redisएका millisecond पेक्षा खूप कमी वेळात उत्तर2 DB readsफक्त miss झाल्यावरoffice = databaseते मिनिट:0s30s60sDB read @ 0sमग 30 sHITsDB read @ 30sमग 30 sHITs2🏃 500 पालक वाट पाहत असतानाच note ची मुदत संपते — stampede, आणि त्याला काय थांबवतेsingle-flight OFFमुदत संपलेलाएकाच वेळी 500 DB readsवाट पाहणारा प्रत्येक पालक office कडे धावतो — database कोसळतोsingle-flight ONमुदत संपलेला499 फलकापाशी थांबतातएकच धावपटू1 DB वाचनएकच जण चिठ्ठी पुन्हा भरतो; बाकीच्या 499 जणांना तेच उत्तर मिळते3📋 cache-aside, टप्प्याटप्प्याने1फलक वाचाRedis GET results:3A2miss? कार्यालयात वाचाSELECT … FROM results3एक प्रत लावाSET … EX 30 (एक TTL)✎लिहितानाUPDATE, मग key DEL करा
⏪ आधी

प्रत्येक पालकाचा refresh database वर तीच निकालाची query चालवत असे: एका मिनिटात results:3A चे 6,000 reads.

💡 काय

Redis म्हणजे office समोरचा सूचना फलक: आधी फलक वाचा, आणि miss झाला तरच office ला विचारा.

⚙️ कसे

TTL 30 s सह 6,000 reads म्हणजे फक्त 2 DB reads; 500 जण थांबले असताना key expire झाली, तर single-flight 500 reads चे 1 करते.

🎯 का

Database ला कामाचा अगदी लहान वाटा उरतो, आणि एका expired key वरचा stampede आता त्याला पाडू शकत नाही.

🚀 पुढे

पुढचा धडा नोंदवहीच्या प्रती बनवतो: वाचणाऱ्यांसाठी read replicas, आणि connections वाटून देणारा proxy.

🧪 इथे करून पाहा — कार्यालयासमोरचा सूचना फलक — एक मिनिट वाचन, मग पालक थांबलेले असतानाच चिठ्ठीची मुदत संपते
30100500

संपूर्ण धडा 09 वाचा →

10 📚 Read replicas + connection pools

वाचणाऱ्यांसाठी नोंदवहीच्या प्रती — replica lag, read-your-own-writes, आणि connections वाटून घेणारा proxy.

🧒 सोप्या शब्दांत

शाळा एक मुख्य नोंदवही आणि वाचण्यासाठी काही प्रती ठेवते. प्रती थोड्या उशिराने update होतात. Aishwarya मुख्य नोंदवहीत Katrina चा grade लिहिते, आणि प्रतीमध्ये तो 200 ms नंतर दिसतो. म्हणून लिहिल्यानंतर लगेच मुख्य नोंदवहीतूनच वाचा. एक मदतनीस काही पेन अनेक लिहिणाऱ्यांमध्ये वाटूनही देतो.

📖 नवे शब्दprimary — प्रत्येक write घेणारा मुख्य databaseread replica — primary च्या मागोमाग चालणारी database ची फक्त वाचण्याची प्रतreplica lag — प्रत किती उशिरा आहे; इथे 200 ms, त्यामुळे नुकताच केलेला write दिसत नाहीRDS Proxy — खऱ्या connections चा लहान pool, 100, 800 callers मध्ये वाटून देतो
1📚 नोंदवहीच्या प्रती — Katrina चा grade primary नंतर 200 ms ने replica पर्यंत पोहोचतोKatrinaA+ लिहाt = 1000 msprimaryप्रत्येक write घेतोreplica 1replica 2lag 200 msreads देतात✓ read-your-own-writesKatrina ने save केल्यावर लगेच, तिचा dataथोडा वेळ primary मधून वाचा —बाकी सगळे replicas मधूनच वाचत राहतात(काही सेकंद primary ला चिकटून राहा,किंवा write ची वेळ पुढे पाठवा)1000105011001150120012501300msreplica ने ते अजून पाहिलेले नाहीreplica ने ते @1200 ला लागू केले ✓write @1000read @1050 → Noneread @1150 → Noneread @1250 → A+2🔌 800 Lambda environments × प्रत्येकी 1 connection — database max_connections 500 परवानगी देतोप्रत्येक function थेट connect होते800 environmentsdatabasemax_connections 500500 उघडले300 नाकारलेखूप जास्त connections — errors,आणि 500 उघडी connections database ची memory खातात300 नाकारलेRDS Proxy मधून (100 चा pool)800 environmentsdatabasemax_connections 500RDS Proxy100100 उघडले · 0 नाकारले800 callers 100 खरी connections आळीपाळीनेउसनी घेतात — database शांत राहतो0 नाकारले
⏪ आधी

एकच database प्रत्येक read आणि write घेत होता, आणि फक्त 500 परवानगी असताना 800 Lambdas ना प्रत्येकी connection हवे होते.

💡 काय

Read replicas म्हणजे वाचणाऱ्यांसाठी नोंदवहीच्या प्रती; RDS Proxy काही खरे connections अनेक callers मध्ये वाटून देते.

⚙️ कसे

200 ms replica lag मुळे Katrina चा grade 1050 ms ला None आणि 1250 ला A+ दिसतो; 100 च्या pool मधून 800 callers: 0 refused.

🎯 का

Reads प्रतींवर पसरतात, writes primary वर सुरक्षित राहतात, आणि database connections नाकारणे थांबवतो.

🚀 पुढे

पुढचा धडा नोंदवहीच विभागतो: पसरणाऱ्या key ने partitions, hot key आणि DynamoDB च्या मर्यादा.

🧪 इथे करून पाहा — Katrina t = 1000 ms ला primary मध्ये A+ लिहिते — ते परत वाचा, मग connections मोजा
2001150800500100

संपूर्ण धडा 10 वाचा →

11 🗂️ Partitioning + DynamoDB

पसरणाऱ्या key ने नोंदवहीची विभागणी करा — hash partitions, hot key, write-sharding आणि DynamoDB चे per-partition capacity units.

🧒 सोप्या शब्दांत

एक नोंदवही एका कारकुनासाठी खूप जाड आहे. म्हणून शाळा ती एका key ने कप्प्यांमध्ये विभागते, आणि प्रत्येक कारकून एक कप्पा सांभाळतो. Class नुसार विभागली तर निकालाच्या दिवशीची प्रत्येक नोंद 3A च्या कप्प्यात जाते. तो कप्पा ओसंडून वाहतो आणि बाकीचे रिकामे राहतात. चांगली key पाने पसरवते.

📖 नवे शब्दpartition — विभागलेल्या data चा एक कप्पा, कामाच्या स्वतःच्या वाट्यासहpartition key — एखादी row कोणत्या कप्प्यात जाईल ते ठरवणारी valuehot partition — कामाचा बहुतेक भाग घेणारा एक कप्पा, जसे 1,000 पैकी 928 writeswrite-sharding — class-3A#0 … #39 सारखा suffix जोडणे, म्हणजे एक hot key पसरतेDynamoDB limit — प्रत्येक partition ला जास्तीत जास्त 3,000 RCU + 1,000 WCU; मोठे items जास्त units वापरतात
1🗂️ नोंदवही कप्प्यांमध्ये वाटा — partition key कप्पा ठरवते: md5(key) mod 4pupil-0md5 … mod 4 =1pupil-1md5 … mod 4 =3pupil-4md5 … mod 4 =0pupil-5md5 … mod 4 =20123तीच key → नेहमी तोच कप्पा, म्हणून कोणताही वाचक ती पुन्हा शोधू शकतोचांगल्या key ला अनेक values असतात, साधारण सारख्याच वापरल्या जातात — मग कप्पेसमान भरतात आणि प्रत्येक कप्पा traffic चा आपला वाटा उचलतोप्रत्येक कप्प्याची स्वतःची ठरलेली capacity असते (panel 3) — एक hot keyइतर कप्प्यांची वापरात नसलेली capacity उसनी घेऊ शकत नाही2📊 निकालाच्या दिवशी 1,000 writes — key चे तीन पर्याय कप्पे कसे भरतातkey = pupil id1,000 विद्यार्थी250245#0262#1249#2244#3समान — प्रत्येक कप्पा ~250key = class (निकालाचा दिवस)1,000 पैकी 900 writes 3A च्या आहेत25019#031#1928#222#3एक HOT कप्पा — 928write-sharded class-3A#0 … #39hot key 40 ठिकाणी पसरवली250179#0253#1277#2291#3पुन्हा पसरवलेbars हे scale/sim.py मधील spread(keys, 4) आहेत: md5(key) mod 4 — DynamoDB आत वापरत असलेल्या hash ऐवजी वापरलेले🔥 एक कप्पा 1,000 पैकी 928 writes घेतो: तो throttle होतो आणि बाकी तीन रिकामे बसतात — table capacity वाढवून एका key ला तिच्या partition पलीकडे नेता येत नाही✓ write-sharding: लिहिताना hot key ला suffix (#0 … #39) जोडा, आणि class 3A हवा असेल तेव्हा सगळे 40 suffixes परत वाचा3⚖️ DynamoDB — प्रत्येक partition दर सेकंदाला 3,000 RCU + 1,000 WCU पर्यंत देतोएक partition (एक कप्पा)reads3,000 RCU/swrites1,000 WCU/sएक unit किती देतो (मोठ्या items ना जास्त units लागतात):4 KBstrong read= 1 RCU10 KBstrong read= 3 RCU1 KBविचारले= 1 WCU3.5 KBविचारले= 4 WCU1 RCU = दर सेकंदाला 4 KB पर्यंतचे एक strongly consistent read1 WCU = दर सेकंदाला 1 KB पर्यंतचे एक write — आकार वरच्या दिशेने पूर्ण केले जातात🩹 adaptive capacity मदत करतेती hot partition ला न वापरलेलाथोडा throughput उसना देते — पण वरीलper-partition मर्यादेपलीकडे कधीच नाही✓ खरा उपाय: पसरणारी key(विद्यार्थ्याचा id, किंवा class-3A#0 … #39)
⏪ आधी

Replicas reads वाढवतात, पण प्रत्येक write अजूनही एकाच primary कडे जातो, आणि निकालाच्या दिवशीचे writes एकाच नोंदवहीवर साचतात.

💡 काय

Partitioning नोंदवही एका key ने कप्प्यांमध्ये विभागते; चांगली key पाने सगळ्या कप्प्यांत सारखी पसरवते.

⚙️ कसे

1,000 विद्यार्थी 4 partitions वर hash केले की प्रत्येकी सुमारे 250; class ही key घेतली तर एका hot partition ला 1,000 पैकी 928 writes.

🎯 का

DynamoDB चा एक partition जास्तीत जास्त 3,000 RCU + 1,000 WCU देतो; मोठे items जास्त units वापरतात — पसरणारी key हाच खरा उपाय.

🚀 पुढे

पुढचा धडा हळू काम रांगेत टाकतो: SQS gate वरच गर्दी झेलते, आणि workers backlog नुसार scale होतात.

🧪 इथे करून पाहा — निकालाच्या दिवशीच्या 1,000 writes साठी partition key निवडा — आणि कोणत्याही key चा कप्पा शोधा
440

संपूर्ण धडा 11 वाचा →

12 📬 Queues + संपूर्ण आराखडा

गर्दीचा लोंढा दारावरच घ्या, आपल्या गतीने काम करा — SQS, at-least-once delivery, backlog नुसार scale होणारे workers, आणि पूर्ण scale झालेली जत्रा.

🧒 सोप्या शब्दांत

Certificates छापायला वेळ लागतो. पालकांना खिडकीवर थांबवण्याऐवजी शाळा tokens देते आणि पालक घरी जातात. Workers आपल्या वेगाने certificates छापतात. Tokens चा ढीग वाढला की आणखी workers मदतीला येतात. छपाई अपयशी झाली तर ती पुन्हा केली जाते, त्यामुळे काम सुरक्षितपणे परत मिळवता येते.

📖 नवे शब्दqueue — कामाची रांग, क्रमाने घेतली जाते आणि नंतर केली जातेSQS — worker घेईपर्यंत messages धरून ठेवणारी AWS ची queue servicebacklog — किती काम थांबले आहे; त्यानुसार scaling मुळे 800 चे 0 झालेidempotent — दोनदा केले तरी सुरक्षित, कारण message एकापेक्षा जास्त वेळा येऊ शकतो
1📬 queue मधून प्रमाणपत्रांच्या PDFs — 3 सेकंद 800 requests/s, प्रत्येक worker 100 PDFs/s बनवतोSQS — टोकनची रांगगर्दीचा लोंढा सामावून घेते — संदेश आपल्या पाळीची वाट पाहतातworkersप्रत्येकी 100 PDFs/squeue गर्दीचा लोंढा दारावरच सामावून घेते; workersसंदेशांवर asynchronously, आपल्या गतीने काम करतात;workers BACKLOG वर scale करा, CPU वर नाही —प्रत्येक 100 थांबलेल्यांमागे 1 worker, जास्तीत जास्त 10↻ SQS किमान एकदा (at least once) पोहोचवते — एखादी PDF request दोनदा येऊ शकतेworker कडे संदेश असताना visibility timeout तो लपवतो; अयशस्वी झालेले retry होतात;विषारी (poison) संदेश DLQ मध्ये जातात; idempotent workers पुनरावृत्ती सुरक्षित करतात (धडा 13)04008001,2001,6000123456789सेकंद →शिखर 1,500उरले 150शिखर 800उरले 0backlog (थांबलेल्या PDFs)ठरलेले 3 workersbacklog वर scaleयेणाऱ्या requests1178821111workers2🏗️ संपूर्ण जत्रा, scaled — प्रत्येक tier स्वतःच्या signal वर वाढतोपालकCloudFront3S3UI filesALB /API Gateway5EKS वरील pods7HPA + KarpenterLambda8किंवा: प्रत्येक पालकासाठी एक खिडकीRedisसूचना फलक9miss झाल्यावरRDS Proxy10primaryreplicareplicawrites · readsकिंवा DynamoDB,partitioned11संथ कामSQS12DLQकिमान एकदा:retries, मगDLQworkers📶 hit ratio📶 requests / target📶 CPU · concurrency📶 hit ratio · memory📶 lag · connections📶 backlogयावर scale →
⏪ आधी

पालक थांबलेला असतानाच certificate PDFs बनत, त्यामुळे सेकंदाला 800 requests च्या गर्दीने प्रत्येक page हळू झाले.

💡 काय

SQS म्हणजे gate वरची token रांग: पालक token घेऊन जातात, आणि workers messages asynchronously, आपल्या वेगाने हाताळतात.

⚙️ कसे

3 s साठी सेकंदाला 800 PDFs: 3 ठरावीक workers ना peak 1,500 आणि 150 उरतात; backlog नुसार scaling ला peak 800 आणि शेवटी 0.

🎯 का

रांग गर्दी झेलते; retries, DLQ आणि idempotent workers असतील तर अपयशी काम सुरक्षितपणे परत मिळवता येते.

🚀 पुढे

पुढचा धडा अपयशातून तगून राहतो: timeout (वेळेची मर्यादा), jitter सह retry (पुन्हा प्रयत्न), circuit breaker (स्विच), DLQ आणि एकापेक्षा जास्त AZ.

🧪 इथे करून पाहा — SQS मधून प्रमाणपत्रांच्या PDFs — 3 सेकंद 800 req/s; workers कसे scale होतील ते निवडा
310100800

संपूर्ण धडा 12 वाचा →

13 🛟 बिघाडातून टिकणे

फक्त scaling पुरेसे नाही — timeouts, backoff आणि jitter सह retries, circuit breakers, graceful degradation, idempotency, DLQs आणि multi-AZ.

🧒 सोप्या शब्दांत

शाळेच्या जत्रेत payments चा stall बिघडतो. Dipika 1 सेकंदानंतर थांबणे सोडते. पुन्हा प्रयत्न करणारे पालक थोडा अनियमित वेळ थांबतात, म्हणजे ते सगळे एकदम परत येत नाहीत. Stall बरा होईपर्यंत एक स्विच कोणालाही तिकडे पाठवत नाही. सूचना फलक अजूनही निकाल दाखवतो, काही मिनिटे जुना. दोनदा आलेला token एकदाच charge होतो, आणि दुसरी इमारत जत्रा चालू ठेवते.

📖 नवे शब्दtimeout — timeout (वेळेची मर्यादा): ठरलेल्या वेळेनंतर थांबणे सोडणे; 30 s अडकण्याऐवजी 1,000 msbackoff + jitter — प्रत्येक retry (पुन्हा प्रयत्न) आधी जास्त आणि थोडी अनियमित वाट: एकदम 500 चे 10 ms मागे 81circuit breaker — circuit breaker (स्विच): service आजारी असताना लगेच अपयश; 7 calls पोहोचले, 27 लगेच अपयशीDLQ — dead-letter queue: सतत अपयशी message, जसे pdf-7, 3 receives नंतर बाजूला ठेवला जातोmulti-AZ — वेगवेगळ्या data centres मध्ये प्रती: एक AZ 99.5%, दोन AZs 99.9975%
1⏱️ timeout — स्टॉपवॉच अडकलेला call तोडतेtimeout1,000 msसहसा: 120 ms → ('ok', 120)आज, timeout नाही: thread 30 s थांबतो1,000 ms timeout सह → ('timeout', 1000)तोडले — thread पुढच्या पालकासाठी मोकळा0 s5 s10 s15 s20 s25 s30 sपुन्हा Little's law — 2,000 req/s ला किती requests अडकून थांबलेल्या असतात:timeout नाही:60,000 अडकलेल्याtimeout 1 s: जास्तीत जास्त 2,000 in flight (2,000 × 1 s)▪ = 1,000 requests · 2,000 req/s × 30 s = 60,000 threads आणि connections अडकून2🌩️ retries — 500 clients एकदम अयशस्वी होतात, प्रत्येक जण 4 वेळा retry करतोjitter नाही: सगळे 100 → 200 → 400 → 800 ms थांबतात2505000सर्वात गर्दीचे 10 ms: 500 — सगळे एकदमfull jitter: 0 आणि त्या संख्येदरम्यान यादृच्छिक प्रतीक्षा2505000सर्वात गर्दीचे 10 ms: 81 — विखुरलेले0 ms400 ms800 ms1200 ms1600 ms3🔌 circuit breaker — 5 अपयश → 10 s साठी open → half-open: एक चाचणी call; पहिले 30 s payments बंदबंदcalls पुढे जातातOPEN (उघडा)लगेच अपयश — थांबणे नाहीHALF-OPEN (अर्धा उघडा)एक चाचणी callपेमेंट्सबंद (0–30 s)पुन्हा चालूbreakerclosed (बंद)10 s open10 s open10 s openclosed (बंद)calls✗✗✗✗✗·········✗·········✗·········✓✓✓✓✓✓0 s5 s10 s15 s20 s25 s30 s35 s40 s✗ 7 calls आजारी service पर्यंत पोहोचले· 27 लगेच अयशस्वी — 30 s ची प्रतीक्षा नाही✓ 34 s ची चाचणी यशस्वी → closed (40 s ला)service 30 s ला परत आली; breaker ला ते फक्त पुढच्या चाचणीत (34 s) कळते — 40 calls ऐवजी आजारी service ला सावरायला मोकळीक मिळाली4🪧 graceful degradation (कमी पण चालू सेवा) — error page पेक्षा छोटे page बरेschool.example/results/3Aनिकाल — वर्ग 3A5 मिनिटे जुनेKatrinaA+DipikaAAishwaryaA+फोटो: बंदशिफारसी: बंदgrade सेवाबंदRedisशेवटची चांगली प्रतcache मधले page द्या,ते किती जुने आहेते सांगा, जादा गोष्टीबंद करा5✉️ किमान एकदा — 3 payments साठी 4 deliveriespay-katrinapay-dipikapay-dipikaपुन्हाpay-aishwaryaSQS तोच संदेश दोनदा पोहोचवू शकते (Dipika चा)साधा worker₹katrina₹dipika₹dipika₹aishwarya4 वेळा पैसे कापतोDipika दोनदा पैसे भरतेidempotent worker₹katrina₹dipikaवगळले₹aishwarya3 वेळा पैसे कापतोkey आधी पाहिली → वगळा6📥 विषारी (poison) संदेश → dead-letter queue (DLQ)pdf-0pdf-1pdf-2pdf-3pdf-4pdf-5pdf-6pdf-7pdf-8pdf-9worker9 PDFs1233 वेळा मिळाला,दर वेळी अयशस्वीDLQ: pdf-73 नंतरएकूण 12 receives (9 × 1 + 3)बाकीचे 9 वाहत राहतात;DLQ नंतर एखादी व्यक्ती वाचते7🏢 3 AZs मध्ये प्रती — आणि dependencies ची साखळीAZ a99.5%AZ b99.5%AZ c99.5%1 AZ99.5%≈ वर्षाला 44 h2 AZs99.9975%≈ वर्षाला 13 min3 AZs99.999988%≈ वर्षाला 4 sup = 1 − (1 − 0.995)ⁿ, जर AZs स्वतंत्रपणे बिघडत असतील तरप्रत्येक दुवा चालू असेल तरच साखळी चालू असते:API99.9%Redis99.9%database99.95%= 99.75%प्रत्येक dependency एकूण कमी करते: 99.75% ≈ वर्षाला 22 h बंद
⏪ आधी

एका अडकलेल्या service ने प्रत्येक thread 30 s धरून ठेवला, आणि 99.9% × 99.9% × 99.95% ची साखळी फक्त 99.75% चालू होती.

💡 काय

Resilience म्हणजे एक stall बिघडला तरी शाळेची जत्रा चालू ठेवणे: timeout (वेळेची मर्यादा), retry (पुन्हा प्रयत्न), circuit breaker (स्विच) आणि plan B.

⚙️ कसे

1,000 ms चा timeout 30 s अडकलेल्या call ला हरवतो; jitter एकदम 500 retries चे 10 ms मागे 81 करतो; breaker ने 7 आत सोडले, 27 लगेच अपयशी.

🎯 का

4 deliveries असूनही idempotent worker 3 च charges करतो, 3 receives नंतर pdf-7 DLQ मध्ये जातो, आणि दोन AZs 99.5% चे 99.9975% करतात.

🚀 पुढे

पुढे कुठे: Kubernetes school खिडक्या चालवते, Database school नोंदवही, आणि API Gateway school मुख्य दार.

🧪 इथे करून पाहा — एक dependency मोडा — मग timeout, jitter, breaker, idempotency आणि जास्त AZs चालू करा
30000100020005004510301399.53

संपूर्ण धडा 13 वाचा →