এই পর্বে যা শিখবেন
- System design-এর লিখিত উত্তর নম্বর-ভাগের ক্রমে সাজানো, আর খাতায় পরিষ্কার architecture, sequence ও state diagram আঁকা
- Scaling, load balancing, consistent hashing, storage engine, replication, sharding, isolation আর distributed transaction-এর নির্ভুল মডেল উত্তর
- Caching, messaging, delivery semantics, clock, quorum, Raft, fencing আর Bloom filter — যাচাই করা সংখ্যাসহ
- Microservices, resilience, rate limiting, SLO, disaster recovery, নিরাপত্তা, deployment আর case study ধাঁচের নকশার প্রশ্ন
- ভাইভায় দুই–চার বাক্যে উত্তর, follow-up সামলানো, সাধারণ ভুল এড়ানো আর AI-এর দেওয়া উত্তর যাচাই করা
১ · উত্তর লেখার কৌশল — কাঠামো, নম্বর-ভাগ, খাতায় ছবি আর সময়
লিখিত পরীক্ষা আর ভাইভা-য় একই জ্ঞানে দুজন আলাদা নম্বর পান — যিনি ছবিতে leader আর follower আলাদা করে আঁকেন, async-এর দাম বলেন আর নিজে থেকে read-your-writes-এর সমস্যা তোলেন, তিনি বেশি পান। পরীক্ষকের হাতে থাকে একটি মার্ক-স্কিম — কোন অংশে কত নম্বর। ডাকঘরে চিঠি যেমন জেলা ধরে আলাদা খোপে সাজানো থাকলে কোনোটি হারায় না, উত্তরের অংশগুলোও আলাদা শিরোনামে সাজানো থাকলে পরীক্ষক প্রতিটি নম্বর খুঁজে পান।
- সংজ্ঞা (এক–দুই বাক্য): নির্ভুল আর শর্তসহ। “Load balancer হলো একদল সার্ভারের সামনের একটি প্রবেশপথ, যা আসা অনুরোধ সুস্থ সার্ভারগুলোর মধ্যে ভাগ করে।”
- কীভাবে কাজ করে: ধাপে ধাপে, নম্বর দেওয়া তালিকায় — অনুরোধ কোথা থেকে কোথায় যায়, কে কী সিদ্ধান্ত নেয়।
- ছবি বা টেবিল: একটি architecture diagram, একটি sequence diagram বা তুলনার টেবিল। “পার্থক্য লিখুন” প্রশ্নে টেবিল প্রায় বাধ্যতামূলক।
- সংখ্যা বা উদাহরণ: ছোট, নির্দিষ্ট — “ধরা যাক সেকেন্ডে ২,০০০ অনুরোধ, গড়ে ১৫০ ms”. সূত্র → মান বসানো → একক সহ উত্তর।
- Trade-off ও ব্যর্থতা: এই বিষয়ের প্রাণ। কী পেলেন, কী দিলেন, কখন এটি বেছে নেবেন না, আর কোনো অংশ বিকল হলে কী ঘটে।
- উপসংহার: এক–দুই বাক্যে কোথায় কোনটি — “টাকা কাটায় CP, like গণনায় AP”.
নিচের প্রতিটি মডেল উত্তর এই ক্রম মেনেছে — মুখস্থ নয়, কাঠামোটি শিখুন।
প্রশ্নের ক্রিয়াপদ কী চায়
| প্রশ্নে লেখা | সাধারণ নম্বর | যা দিতেই হবে |
|---|---|---|
| সংজ্ঞা দিন / কী? | ২–৩ | শর্তসহ এক বাক্য + কেন লাগে + একটি উদাহরণ |
| পার্থক্য লিখুন | ৪–৫ | একই মাপকাঠির সারি দিয়ে টেবিল (অন্তত চারটি সারি) + শেষে “কখন কোনটি” |
| তালিকা দিন, যুক্তিসহ | ৪–৫ | নম্বর দেওয়া তালিকা, প্রতিটির পাশে এক লাইনের “কারণ” |
| ছবিসহ ব্যাখ্যা করুন | ৮–১০ | লেবেলসহ ছবি, নম্বর দেওয়া ধাপ, একটি সংখ্যা বা উদাহরণ, trade-off |
| নকশা করুন | ১০ | পরিধি ও অনুমান → ছোট হিসাব → API ও data model → ছবি → দুটি deep dive → ব্যর্থতা ও trade-off |
| মূল্যায়ন বা সমালোচনা করুন | ৫–১০ | কোথায় ভাঙবে (SPOF, hot spot, consistency), কেন, আর কী বদলাতে হবে — দামসহ |
খাতায় architecture diagram — যা থাকতেই হবে
- ওপর থেকে নিচে, বাঁ থেকে ডানে: ওপরে client, তারপর DNS/CDN, load balancer, সার্ভিস, তারপর cache আর queue, নিচে database. অনুরোধের পথ চোখে এক দিকে বয়ে চলে।
- আকারের প্রথা: সার্ভিস আয়তক্ষেত্র, database সিলিন্ডার, queue লম্বা চ্যাপ্টা বাক্স; একই রকম কয়েকটি কপি হলে তিনটি বাক্স বা একটি বাক্সে “×৩”।
- প্রতিটি বাক্সে দুই লাইন: নাম আর ভূমিকা (“Cache — cache-aside, TTL”). শুধু “Redis” লিখলে পরীক্ষক জানেন না আপনি সেটি কী কাজে লাগাচ্ছেন।
- তীরে ক্রমিক নম্বর: ১, ২, ৩… — আর ছবির পাশে বা নিচে সেই নম্বর ধরে এক লাইনের ব্যাখ্যা। লেখায় “ধাপ ৩-এ cache miss” বললেই পরীক্ষক ছবিতে খুঁজে পান।
- দুই রকম দাগ: কঠিন দাগ মানে সাথে সাথে উত্তর (sync), ড্যাশ মানে পরে বা পেছনে (async, replication) — নিচে একটি legend.
- পেন্সিল, রুলার, আধা পাতা: ছোট গিজগিজে ছবির চেয়ে কম বাক্সের পরিষ্কার ছবি ভালো। একটি ছবিতে ১০–১২টির বেশি বাক্স নয়; বাকিটা দ্বিতীয় ছোট ছবিতে (deep dive).
- ব্যর্থতার জায়গা চিহ্নিত: যে অংশ একা — একটি তারা বা “SPOF?” লিখে পাশে প্রতিকার।
খাতার ধাঁচে একটি পরিষ্কার architecture diagram
Exam-style diagram of a read-heavy web service: numbered arrows, shape conventions, legend
অন্য ছবিগুলো — কোন প্রশ্নে কোনটি
| ছবি | কোন প্রশ্নে | যা প্রায়ই বাদ পড়ে |
|---|---|---|
| Sequence diagram (খাড়া সময়রেখা) | 2PC, OAuth, cache-aside-এর ক্রম, delivery-তে ack | কোন বার্তার পর কোনটি ডিস্কে লেখা (fsync) হয়, আর কোন মুহূর্তে crash হলে কী |
| Ring | consistent hashing, virtual node, preference list | ঘড়ির কাঁটার দিক, key-এর তীর, নতুন node যোগে কোন অংশ সরে |
| State diagram | circuit breaker, Raft-এর ভূমিকা, job-এর জীবন | প্রতিটি তীরে শর্ত (“৫টি ব্যর্থতা”, “timeout শেষ”) |
| তুলনার টেবিল | যেকোনো “পার্থক্য লিখুন” | একই মাপকাঠির সারি; শেষ সারিতে “কখন কোনটি” |
সময় ভাগ
নিয়মটি সরল: মোট মিনিট ÷ মোট নম্বর। ধরা যাক ১৫০ মিনিটে ৭৫ নম্বর — প্রতি নম্বরে দুই মিনিট, একটি ১০ নম্বরের প্রশ্নে কুড়ি মিনিট। শুরুতে পাঁচ মিনিট প্রশ্ন বাছাইয়ে, শেষে দশ মিনিট মেলাতে; প্রতিটি দীর্ঘ প্রশ্নে প্রথম দুই মিনিট মার্জিনে খসড়া। কোনো প্রশ্নে আটকে গেলে কাঠামো আর সূত্র লিখে এগিয়ে যান — পদ্ধতির নম্বর থাকে।
নিচের stepper-এ একটি ১০ নম্বরের প্রশ্নের উত্তর ধাপে ধাপে গড়া হয়েছে — প্রতিটি অংশ যোগ হলে নম্বর কীভাবে জমে, আর সময় কতটা যায়:
| যোগ হলো | |
| খাতায় যা লিখলেন | |
| জমা নম্বর | |
| খরচ হওয়া সময় |
- পরিকল্পনা। মার্জিনে পাঁচ শব্দের খসড়া — দুই মিনিটে কাঠামো ঠিক, কোনো অংশ বাদ পড়বে না।
- সংজ্ঞা — ২ নম্বর। “CAP: network partition চলাকালে একটি replicated সিস্টেম একসাথে linearizable থাকতে আর প্রতিটি চালু node থেকে উত্তর দিতে পারে না।” সাথে ইতিহাস এক লাইনে: Brewer-এর অনুমান (২০০০), Gilbert ও Lynch-এর প্রমাণ (২০০২)।
- ছবি — আরও ২ নম্বর। দুটি বাক্স N1, N2; মাঝের link-এ ক্রস চিহ্ন; client-1 N1-এ x = 2 লেখে, client-2 N2 থেকে x পড়ে। ছবিতেই প্রশ্নটি দাঁড়ায়: N2 কী উত্তর দেবে?
- দুই পথ — আরও ৩ নম্বর। CP: N2 উত্তর দেয় না বা error দেয় — consistent, কিন্তু সেই অনুরোধে unavailable. AP: N2 পুরোনো x = 1 দেয় — available, কিন্তু stale; link জোড়া লাগলে মেলে। দুটির একটি করে উদাহরণ লিখুন।
- ভুল ধারণা — আরও ১ নম্বর। Partition আপনার বাছাই নয়, তাই “তিনের দুই” বা “CA ব্যবস্থা” ভুল ব্যাখ্যা; CAP-এর A মানে উঁচু uptime নয়; ACID-এর C আর CAP-এর C আলাদা।
- PACELC আর উপসংহার — শেষ ২ নম্বর। PACELC: Partition হলে A বনাম C, Else (স্বাভাবিক দিনে) Latency বনাম Consistency — শক্ত consistency মানে প্রতিটি লেখায় অন্য replica-র সাথে round trip. উপসংহার: বাছাই feature ধরে — টাকা কাটা CP, like গণনা AP. আঠারো মিনিটে দশ নম্বর।
সংখ্যার প্রশ্নে: সূত্র → মান → একক → মানে
সংখ্যা এলে চারটি জিনিস আলাদা লাইনে লিখুন: সূত্র, বসানো মান, একক সহ ফল, আর এক লাইনের “মানে কী”। প্রতিটি অনুমান শুরুতেই লিখুন (“ধরা যাক ১ দিন = ৮৬,৪০০ সেকেন্ড”)।
কোন মডিউলের প্রশ্ন কোথায়
| কোর্সের মডিউল | পর্ব | লিখিত প্রশ্ন | ভাইভা প্রশ্ন |
|---|---|---|---|
| ১ · System design-এর ভিত্তি | ০১–০৬ | অংশ ২ (ক-০১–ক-০৩) | ভ-০১–ভ-০৩ |
| ২ · যোগাযোগ আর API | ০৭–১২ | অংশ ২ (ক-০৪–ক-০৫) | ভ-০৪–ভ-০৭ |
| ৩ · Scaling-এর মৌলিক | ১৩–১৮ | অংশ ২ (ক-০৬–ক-০৮) | ভ-০৮–ভ-১০ |
| ৪ · ডেটা স্টোরেজ | ১৯–২৭ | অংশ ৩ (খ-০১–খ-০৫) | ভ-১১–ভ-১৪ |
| ৫ · Caching | ২৮–৩০ | অংশ ৪ (গ-০১–গ-০৪) | ভ-১৫–ভ-১৬ |
| ৬ · Messaging আর stream | ৩১–৩৭ | অংশ ৫ (ঘ-০১–ঘ-০৪) | ভ-১৭–ভ-২০ |
| ৭ · Distributed systems-এর তত্ত্ব | ৩৮–৪৬ | অংশ ১-এর stepper (CAP) আর অংশ ৬ (ঙ-০১–ঙ-০৭) | ভ-২১–ভ-২৫ |
| ৮ · Architecture, reliability আর operations | ৪৭–৫৩ | অংশ ৭ (চ-০১–চ-০৬) | ভ-২৬–ভ-২৮ |
| ৯ · Case study | ৫৪–৬১ | অংশ ৮ (ছ-০১–ছ-০৫) | ভ-২৯–ভ-৩১ |
এই পাতার কোনো প্রশ্ন কোনো নির্দিষ্ট পরীক্ষা, প্রতিষ্ঠান বা কোম্পানির ইন্টারভিউ থেকে নেওয়া নয়; এ ধরনের প্রশ্ন বিশ্ববিদ্যালয়, চাকরি আর ইন্টারভিউর পরীক্ষায় প্রায়ই আসে। নম্বর আনুমানিক; প্রতিটি অনুমান প্রশ্নেই লেখা (১ দিন = ৮৬,৪০০ সেকেন্ড, ৩০ দিনের মাস); সব নকশা কাল্পনিক সেবার।
২ · অংশ ক — ভিত্তি, API আর scaling (মডিউল ১–৩)
রিভিশন: পর্ব ০২ (FR, NFR), পর্ব ০৩ (হিসাবের প্রথা), পর্ব ০৪ (percentile, Little), পর্ব ০৫ (nines, MTTR), পর্ব ০৬ (আট ধাপ), পর্ব ০৮ (idempotency), পর্ব ১০ (polling, WebSocket), পর্ব ১৩, পর্ব ১৪, পর্ব ১৫, পর্ব ১৬ আর পর্ব ১৮.
ক-০১Functional আর non-functional requirement-এর পার্থক্য উদাহরণসহ লিখুন। Availability আর durability কি এক? — ৪ নম্বর (সহজ)
সংজ্ঞা: Functional requirement বলে সিস্টেম কী করবে — এমন আচরণ, যা হ্যাঁ বা না দিয়ে যাচাই করা যায়। Non-functional requirement বলে কতটা ভালোভাবে — latency, availability, কতজন ব্যবহারকারী, খরচ, নিরাপত্তা — আর তা লিখতে হয় সংখ্যায়।
| মাপকাঠি | Functional | Non-functional |
|---|---|---|
| প্রশ্ন | কী করবে? | কতটা দ্রুত, কতজনের জন্য, কতটা নির্ভরযোগ্য? |
| উদাহরণ (কাল্পনিক ছবি-শেয়ার অ্যাপ) | ছবি আপলোড, follow, feed দেখা | feed-এর p99 ৫০০ ms-এর কম; ৯৯.৯% availability; দৈনিক ১ কোটি ব্যবহারকারী |
| নকশায় প্রভাব | API আর data model | architecture — cache, replication, sharding |
Availability বনাম durability: এক নয়। Availability মানে এই মুহূর্তে সেবা পাওয়া যায় কি না; durability মানে সংরক্ষিত ডেটা হারায় কি না। এক ঘণ্টার বিভ্রাটে সেবা বন্ধ, কিন্তু একটি লেখাও হারায়নি — availability কমেছে, durability অক্ষুণ্ণ।
নম্বর কোথায়: দুটি সংজ্ঞা (১), টেবিল বা দুই জোড়া উদাহরণ (২), availability বনাম durability (১)। পর্ব ০২ · পর্ব ০৫
যেখানে নম্বর কাটে: সংখ্যা ছাড়া NFR (“দ্রুত হবে”, “scalable হবে”); ACID-এর C আর CAP-এর C এক বলে লেখা।
ক-০২Latency, throughput আর bandwidth-এর পার্থক্য লিখুন। গড়ের বদলে p99 কেন দেখা হয়? একটি অনুরোধ ৫০টি backend-এর সবার উত্তরের অপেক্ষা করে, প্রতিটি স্বাধীনভাবে ১% সময় ধীর — কত শতাংশ অনুরোধ ধীর হবে? সেকেন্ডে ২,০০০ অনুরোধ আর গড় সময় ১৫০ ms হলে Little-এর সূত্রে গড়ে কতগুলো অনুরোধ একসাথে চলে? — ১০ নম্বর (মাঝারি)
সংজ্ঞা: latency = একটি অনুরোধের শুরু থেকে উত্তর পর্যন্ত সময় (ms); throughput = প্রতি সেকেন্ডে শেষ হওয়া কাজ (req/s); bandwidth = পথ সর্বোচ্চ কতটা বইতে পারে (Gbit/s).
Percentile: p99 মানে ১০০টি অনুরোধের ৯৯টি এর চেয়ে দ্রুত। গড় কয়েকটি খুব ধীর অনুরোধ লুকিয়ে ফেলে — সেই tail-ই ব্যবহারকারী টের পান। কয়েকটি সার্ভারের p99-এর গড় সেবার p99 নয় — histogram-এর bucket যোগ করে তারপর percentile.
Fan-out-এর হিসাব:
- সূত্র: P(অন্তত একটি ধীর) = 1 − (1 − p)N.
- মান: 1 − 0.9950 ≈ 1 − 0.605 = ০.৩৯৫, অর্থাৎ প্রায় ৩৯.৫%.
Little-এর সূত্র: L = λW = ২,০০০ × ০.১৫ = ৩০০টি অনুরোধ গড়ে একসাথে চলছে। Thread বা connection pool অন্তত এত, peak-এর জন্য আরও বাড়তি।
Trade-off: batching throughput বাড়ায় কিন্তু latency বাড়াতে পারে। ব্যস্ততা ρ বাড়লে M/M/1 মডেলে গড় সময় W = S ÷ (1 − ρ): S = ১০ ms ধরলে ρ = ০.৫-এ ২০ ms, ০.৯-এ ১০০ ms.
নম্বর কোথায়: তিন সংজ্ঞা (২), percentile-এর যুক্তি (২), fan-out সূত্র ও মান (৩), Little ও প্রয়োগ (২), utilisation বা প্রতিকার (১)। পর্ব ০৪ · পর্ব ৫০
যেখানে নম্বর কাটে: “৫০ × ১% = ৫০%” — সম্ভাবনা যোগ করা; ms-কে সেকেন্ড না করে L = ৩,০০,০০০ লেখা; percentile-এর গড় নেওয়া।
ক-০৩৯৯.৯% আর ৯৯.৯৯% availability-তে বছরে কত downtime? দুটি ৯৯.৯%-এর অংশ series আর parallel-এ সাজালে মোট availability কত? MTBF ৫০০ ঘণ্টা আর MTTR ৩০ মিনিট হলে availability কত? — ৬ নম্বর (সহজ)
সূত্র: downtime = (১ − A) × ৫,২৫,৬০০ মিনিট (৩৬৫ দিনের বছর)। প্রতিটি বাড়তি nine downtime দশ ভাগের এক ভাগ করে।
| প্রশ্ন | সূত্র | ফল |
|---|---|---|
| ৯৯.৯% | ০.০০১ × ৫,২৫,৬০০ | ৫২৫.৬ মিনিট ≈ ৮ ঘণ্টা ৪৫ মিনিট |
| ৯৯.৯৯% | ০.০০০১ × ৫,২৫,৬০০ | প্রায় ৫২.৬ মিনিট |
| Series (দুটিই লাগবে) | A1 × A2 = ০.৯৯৯² | ৯৯.৮০০১% — downtime প্রায় দ্বিগুণ |
| Parallel (একটিই যথেষ্ট) | ১ − (১ − A)² = ১ − ০.০০১² | ৯৯.৯৯৯৯% |
| MTBF ৫০০ h, MTTR ০.৫ h | MTBF ÷ (MTBF + MTTR) | ৫০০ ÷ ৫০০.৫ ≈ ৯৯.৯০% |
Trade-off ও শর্ত: parallel-এর হিসাব ধরে নেয় ব্যর্থতা স্বাধীন; একই rack, একই config push বা সব কপিতে একই bug — correlated failure — হলে লাভ অনেক কম.
নম্বর কোথায়: downtime (২), series ও parallel (২), MTBF সূত্র (১), স্বাধীনতার শর্ত (১)। পর্ব ০৫
যেখানে নম্বর কাটে: parallel-এও availability গুণ করা; স্বাধীনতার শর্ত না লেখা; বছরের দিন-সংখ্যার প্রথা না বলা।
ক-০৪PUT, PATCH আর POST-এর পার্থক্য idempotency দিয়ে ব্যাখ্যা করুন। টাকা পাঠানোর একটি API-তে client timeout-এর পর retry করলে টাকা দুবার কাটা কীভাবে ঠেকাবেন? — ৫ নম্বর (মাঝারি)
সংজ্ঞা: একটি অনুরোধ idempotent যদি একবার বা বহুবার পাঠালে সার্ভারের অবস্থা একই থাকে।
| Method | কাজ | Idempotent? |
|---|---|---|
| GET | পড়া | হ্যাঁ (নিরাপদও) |
| PUT | পুরো রূপ বসানো | হ্যাঁ |
| DELETE | মোছা | হ্যাঁ — দ্বিতীয়বার 404 এলেও অবস্থা একই |
| PATCH | অংশ বদল | সাধারণভাবে নয় (“balance += ১০০”) |
| POST | তৈরি বা প্রক্রিয়া | নয় |
Retry নিরাপদ করা:
- Client প্রতিটি লেনদেনের জন্য একটি এলোমেলো Idempotency-Key বানায়; retry-তে একই key.
- সার্ভারে UNIQUE (client, key) সারি, সাথে body-র hash আর জমা উত্তর।
- একই key আর একই body → আগের উত্তর আবার, টাকা কাটে একবারই; ভিন্ন body → 422; প্রথমটি এখনো চলছে → 409.
Trade-off: প্রতি অনুরোধে একটি বাড়তি লেখা; key-এর মেয়াদ ছোট হলে দেরির retry আবার চলে।
নম্বর কোথায়: সংজ্ঞা (১), টেবিল (২), key-এর নকশা (২)। পর্ব ০৮ · পর্ব ৩৪
যেখানে নম্বর কাটে: key সার্ভারে বানানো (তাহলে retry পায় নতুন key); body না মিলিয়ে আগের উত্তর ফেরত দেওয়া।
ক-০৫Short polling, long polling, SSE আর WebSocket-এর তুলনা করুন। ১ লাখ client প্রতি ৫ সেকেন্ডে poll করলে সার্ভারে সেকেন্ডে কত অনুরোধ আসে, আর একটি নতুন খবর গড়ে কত দেরিতে পৌঁছায়? — ৫ নম্বর (মাঝারি)
| পদ্ধতি | দিক | সংযোগ | দাম |
|---|---|---|---|
| Short polling | client প্রশ্ন করে | প্রতিবার নতুন অনুরোধ | বেশিরভাগ উত্তর খালি; গড় দেরি I/২ |
| Long polling | client প্রশ্ন, সার্ভার উত্তর আটকে রাখে | প্রতিটি খবরের পর নতুন অনুরোধ | খোলা অনুরোধ আটকে থাকে |
| SSE | শুধু server → client, text | একটি স্থায়ী HTTP স্রোত | Last-Event-ID দিয়ে নিজেই resume |
| WebSocket | দুই দিকে, text ও binary | একটি স্থায়ী সংযোগ | ack, resume, ক্রম নিজেকে বানাতে হয় |
হিসাব: N ÷ I = ১,০০,০০০ ÷ ৫ = সেকেন্ডে ২০,০০০ অনুরোধ; খবর আসে দুই poll-এর মাঝে যেকোনো সময়ে, তাই গড় দেরি I/২ = ২.৫ সেকেন্ড.
Trade-off: স্থায়ী সংযোগ মানে stateful gateway, load balancer-এ দীর্ঘ বাঁধন আর gateway restart-এ reconnect-এর ঢল — প্রতিকার backoff আর full jitter. উপসংহার: স্কোর বা নোটিশের ধারায় SSE, chat-এ WebSocket, কদাচিৎ হালনাগাদে polling-ই যথেষ্ট।
নম্বর কোথায়: টেবিল (৩), হিসাব (১), trade-off (১)। পর্ব ১০
যেখানে নম্বর কাটে: SSE-কে দুই দিকের বলা; poll-এর গড় দেরি I ধরা।
ক-০৬Load balancer-এর কাজ লিখুন। L4 আর L7 load balancing-এর তুলনা করুন। Round robin, least connections আর power of two choices কখন কোনটি? Health check-এ interval ৫ সেকেন্ড, timeout ২ সেকেন্ড, পরপর ২ বার ব্যর্থ হলে সার্ভার বাদ — সবচেয়ে খারাপ ক্ষেত্রে কত সেকেন্ডে ধরা পড়ে, আর প্রতি সার্ভারে ৩০০ QPS হলে ততক্ষণে প্রায় কতগুলো অনুরোধ ব্যর্থ হতে পারে? — ১০ নম্বর (মাঝারি, ছবিসহ)
সংজ্ঞা ও কাজ: একদল সার্ভারের সামনের প্রবেশপথ, চারটি কাজ — ভার ভাগ, health check দিয়ে বিকল সার্ভার লুকানো, একটিমাত্র ঠিকানা (virtual IP), আর সেবা না থামিয়ে deploy (draining).
ছবি (খাতায়): client → virtual IP → LB জোড়া (active আর standby, মাঝে heartbeat) → তিনটি সার্ভার; একটিতে ক্রস চিহ্ন, LB থেকে প্রতিটি সার্ভারে health check-এর ড্যাশ দাগ।
| মাপকাঠি | L4 | L7 |
|---|---|---|
| যা দেখে | IP, port (TCP/UDP) | HTTP — host, path, header, cookie |
| ভাগের একক | পুরো সংযোগ এক backend-এ | প্রতিটি অনুরোধ আলাদা |
| TLS | সাধারণত খোলে না | শেষ করে |
| ক্ষমতা | কম CPU, খুব দ্রুত | path routing, retry, canary, header বসানো |
| দুর্বলতা | HTTP/2-gRPC-র দীর্ঘ সংযোগে ভার অসম | বেশি CPU, নিজেই ভারী অংশ |
Algorithm: round robin — সার্ভার আর অনুরোধ সমান হলে; weighted — ক্ষমতা বিষম হলে; least connections — অনুরোধের সময় বিষম হলে; power of two choices — দুটি এলোমেলো বেছে কম ব্যস্তটি, অনেক LB আর পুরোনো তথ্যেও ভিড় জমায় না; consistent hashing — একই key একই সার্ভারে দরকার হলে।
হিসাব: ধরা পড়ার সবচেয়ে খারাপ সময় ≈ fall × interval + timeout = ২ × ৫ + ২ = ১২ সেকেন্ড; ততক্ষণে প্রায় ১২ × ৩০০ = ৩,৬০০টি অনুরোধ ব্যর্থ হতে পারে।
LB নিজেই SPOF? active-passive-এ VRRP দিয়ে virtual IP সরে; active-active-এ anycast আর ECMP.
নম্বর কোথায়: চার কাজ (১), ছবি (২), টেবিল (৩), algorithm (২), হিসাব (১), SPOF (১)। পর্ব ১৪ · পর্ব ১১
যেখানে নম্বর কাটে: হিসাবে timeout বাদ দেওয়া; L7-কে “শুধু বেশি দ্রুত” বলা; LB-কে single point of failure হিসেবে না দেখা।
ক-০৭hash(key) mod N-এর সমস্যা কী? Consistent hashing আর virtual node ছবিসহ ব্যাখ্যা করুন। ১ কোটি key ৪টি cache সার্ভারে আছে; ৫ম সার্ভার যোগ করলে দুই পদ্ধতিতে প্রায় কতগুলো key-এর ঠিকানা বদলায়? — ১০ নম্বর (মাঝারি, ছবিসহ)
সমস্যা: N থেকে N + 1 করলে N/(N + 1) ভাগ key সরে। কারণ: প্রতি N(N + 1)টি পরপর মানে k mod N আর k mod (N + 1) সমান হয় মাত্র N টিতে, তাই থাকে 1/(N + 1). ৪ → ৫-এ ৪/৫ = ৮০%, অর্থাৎ ৮০ লাখ key.
Consistent hashing: hash-এর পরিসরকে একটি বৃত্ত (ring) ধরা হয়; সার্ভার আর key একই hash-এ ring-এ বসে; key যায় ঘড়ির কাঁটার দিকে পরের সার্ভারে। নতুন সার্ভার শুধু তার ঠিক আগের অংশটুকু নেয়: গড়ে K/(N + 1) = ১ কোটি ÷ ৫ = ২০ লাখ key (২০%) — নতুন সার্ভারের ন্যায্য ভাগ, এর কম সরিয়ে কাজ হয় না।
ছবি (খাতায়): একটি বৃত্তে চারটি বিন্দু A, B, C, D; B আর C-র মাঝে নতুন E; B থেকে E পর্যন্ত বৃত্তাংশ দাগানো — “শুধু এই key-গুলো C থেকে E-তে যায়”; কয়েকটি key থেকে ঘড়ির কাঁটার দিকে তীর।
Virtual node: অল্প সার্ভারে ring-এর ভাগ খুব অসম। প্রতিটি সার্ভারকে V জায়গায় বসালে ভাগের ছড়ানো মোটামুটি 1/√V — V = ১০০-তে প্রায় ১০%. দাম: ring-এ N·V বিন্দু, lookup O(log(N·V)).
| মাপকাঠি | mod N | Ring + vnode | Rendezvous |
|---|---|---|---|
| সার্ভার যোগে সরে | N/(N + 1) | প্রায় 1/(N + 1) | প্রায় 1/(N + 1) |
| Lookup | O(1) | O(log(N·V)) | O(N) |
| Memory | নেই | N·V বিন্দু | নেই |
সীমা ও উপসংহার: এটি key-এর সংখ্যা সমান করে, চাপ নয় — একটি hot key তবু একটি সার্ভারেই পড়ে; তার প্রতিকার আলাদা (local cache, কপি)।
নম্বর কোথায়: mod N-এর সমস্যা ও ভাগ (২), ring-এর ছবি (২), সরার হিসাব (২), virtual node (২), তুলনা বা সীমা (২)। পর্ব ১৬ · পর্ব ৩০
যেখানে নম্বর কাটে: “consistent hashing-এ কোনো key সরে না”; ছবিতে দিক না দেখানো; hot key সারাতে V বাড়ানোর কথা বলা।
ক-০৮Throughput আর goodput-এর পার্থক্য কী? একটি সার্ভিস সেকেন্ডে ৪০০টি অনুরোধ সামলাতে পারে (μ), আসছে ৫০০টি (λ), client-এর timeout ৩ সেকেন্ড, queue অসীম। কত সেকেন্ড পর থেকে নতুন প্রতিটি অনুরোধ timeout হবে? Backpressure আর load shedding দিয়ে কী বদলাবেন? — ৬ নম্বর (কঠিন)
সংজ্ঞা: throughput = শেষ হওয়া কাজ; goodput = তার মধ্যে সময়মতো, কাজে লাগা উত্তর। Overload-এ প্রথমটি সর্বোচ্চ থাকলেও দ্বিতীয়টি শূন্যের দিকে নামতে পারে।
- Queue বাড়ে λ − μ = সেকেন্ডে ১০০টি করে।
- নতুন অনুরোধের অপেক্ষা = Q ÷ μ; এটি D = ৩ সেকেন্ড ছাড়ায় যখন Q > D·μ = ১,২০০.
- সময় t = D·μ ÷ (λ − μ) = ৩ × ৪০০ ÷ ১০০ = ১২ সেকেন্ড. তারপর সার্ভার পুরো ব্যস্ত, অথচ প্রতিটি উত্তর client ছেড়ে যাওয়ার পরে — goodput প্রায় শূন্য; retry এলে λ আরও বাড়ে।
প্রতিকার: bounded queue আর দ্রুত 503 বা 429 (fail fast); ভেতরের অংশে backpressure — উৎসকে ধীর করা (bounded channel, TCP flow control); দরজায় load shedding — অগ্রাধিকার বুঝে বাড়তি কাজ ফেরানো; মেয়াদ পেরোনো কাজ বাদ; retry budget; কম দিয়ে হলেও চালু থাকা (graceful degradation).
নম্বর কোথায়: দুই সংজ্ঞা (১), হিসাব ও যুক্তি (৩), প্রতিকার (২)। পর্ব ১৮ · পর্ব ৪৮
যেখানে নম্বর কাটে: “autoscaling করব” — তা কয়েক মিনিট দেরিতে আসে; exponential backoff-কেই যথেষ্ট বলা — টানা overload-এ মোট চেষ্টা কমে না।
৩ · অংশ খ — Storage, replication, sharding আর transaction (মডিউল ৪)
রিভিশন: পর্ব ১৯ (B-tree, LSM, WAL), পর্ব ২০, পর্ব ২১ (index), পর্ব ২২ (lag, failover), পর্ব ২৩ (shard key, ID), পর্ব ২৪ (anomaly), পর্ব ২৫ (2PC, saga, outbox), পর্ব ২৬ (erasure coding) আর পর্ব ২৭.
খ-০১B+-tree আর LSM-tree storage engine-এর তুলনা করুন। WAL কেন লাগে? Fan-out ৫০০-র তিন স্তরের B+-tree-তে সর্বোচ্চ কতগুলো key আঁটে? কোন workload-এ কোনটি বাছবেন? — ১০ নম্বর (মাঝারি)
WAL: যেকোনো বদল আগে log-এর শেষে যোগ আর fsync, তারপর আসল কাঠামোয়। Crash হলে log থেকে আবার চালানো (redo).
B+-tree: প্রতিটি node একটি page; leaf জায়গায় বদলায়। ৫০০ × ৫০০ × ৫০০ = ১২.৫ কোটি key তিন স্তরে — যেকোনো key-এ প্রায় ৩টি page, ওপরের স্তর RAM-এ থাকলে আরও কম।
LSM-tree: লেখা যায় RAM-এর memtable-এ → ভরলে সাজানো SSTable ফাইল ডিস্কে → পেছনে compaction মেলায়। পড়ায় কয়েক স্তর দেখতে হয়; Bloom filter অপ্রয়োজনীয় ফাইল বাদ দেয়।
| মাপকাঠি | B+-tree | LSM-tree |
|---|---|---|
| লেখা | প্রতিটিতে একটি random page বদল | ক্রমিক, দ্রুত |
| পড়া | অনুমানযোগ্য, অল্প page | কয়েক স্তর; Bloom filter বাঁচায় |
| পেছনের খরচ | page split, fragmentation | compaction — write amplification |
| উদাহরণ | PostgreSQL, MySQL InnoDB | RocksDB, Cassandra |
Trade-off ও উপসংহার: read, update আর memory-র খরচ একসাথে কমানো যায় না (RUM). পড়া-ভারী লেনদেন আর range query-তে B+-tree; লেখা-ভারী log, metric বা time-series-এ LSM.
নম্বর কোথায়: WAL (২), দুই কাঠামো (৩), হিসাব (১), টেবিল (৩), বাছাই (১)। পর্ব ১৯ · পর্ব ২১
যেখানে নম্বর কাটে: compaction-এর দাম না বলা; WAL-কে backup বলা।
খ-০২Single-leader replication ছবিসহ ব্যাখ্যা করুন। Sync, semi-sync আর async replication-এর trade-off লিখুন। Replication lag ব্যবহারকারীর চোখে কোন তিনটি সমস্যা ঘটায়, আর প্রতিকার কী? Failover-এ কী ভুল হতে পারে? — ১০ নম্বর (মাঝারি, ছবিসহ)
সংজ্ঞা: একই ডেটার কয়েকটি জীবন্ত কপি। Single-leader-এ সব লেখা leader-এ যায়; leader তার log (WAL বা সারিভিত্তিক) follower-দের পাঠায়; পড়া follower থেকেও হয়। লাভ: availability, পড়া ভাগ, কাছের কপি, durability. Replication পড়া বাড়ায়, লেখা নয়।
ছবি (খাতায়): client-এর লেখা → Leader (সিলিন্ডার) → ড্যাশ তীরে Follower ১ আর ২; পড়ার তীর follower-এ; follower-এর পাশে “lag Δt”.
| মোড | “OK” কখন | লাভ | দাম |
|---|---|---|---|
| Sync | follower-দের ack-এর পরে | RPO শূন্য | ধীর; একটি follower বন্ধ হলে লেখা আটকে |
| Semi-sync | অন্তত একটি follower-এর ack-এ | একটি কপি নিশ্চিত | মাঝামাঝি দেরি |
| Async | leader নিজে লিখেই | দ্রুততম | leader মরলে শেষ lag-এর “OK” পাওয়া লেখাও হারাতে পারে |
Lag-এর তিন সমস্যা:
- নিজের লেখা উধাও → read-your-writes: নিজের ডেটা leader থেকে, বা লেখার অবস্থান (LSN) পর্যন্ত পৌঁছানো replica থেকে।
- সময় পেছনে যাওয়া (প্রথমবার নতুন, পরে পুরোনো) → monotonic reads: একজন ব্যবহারকারীকে এক replica-তে বাঁধা।
- প্রশ্নের আগে উত্তর → consistent prefix: সম্পর্কিত লেখা একই partition-এ, একই ক্রমে।
Failover-এর ভুল: async-এ হারানো লেখা; পুরোনো leader ফিরে এসে লিখলে split-brain (প্রতিকার fencing বা epoch); ভুল timeout-এ অকারণ failover.
নম্বর কোথায়: সংজ্ঞা ও ছবি (২), তিন মোড (৩), lag-এর তিন সমস্যা (৩), failover (২)। পর্ব ২২ · পর্ব ৫১ · পর্ব ৪৩
যেখানে নম্বর কাটে: replication-কে backup বলা (ভুল DELETE-ও কপি হয়); “sync হলে সব সমস্যা শেষ” — দামের কথা না বলা।
খ-০৩Partitioning আর replication-এর পার্থক্য কী? Shard key বাছাইয়ের শর্ত লিখুন। Range আর hash partitioning তুলনা করুন। ২৫৬টি নির্দিষ্ট partition ৪টি node থেকে ৫টিতে নিলে কতগুলো partition সরে? কেন্দ্রীয় counter ছাড়া Snowflake-ধাঁচের 64-bit ID-র ক্ষমতা আর আয়ু হিসাব করুন। — ১০ নম্বর (কঠিন)
পার্থক্য: partitioning ডেটা ভাগ করে ক্ষমতা (বিশেষ করে লেখা) বাড়ায়; replication কপি রাখে টিকে থাকা আর পড়ার জন্য। বাস্তবে দুটো একসাথে — প্রতিটি shard-এর তিনটি কপি।
Shard key-এর চার শর্ত: অনেক ভিন্ন মান; সমান ছড়ানো; ঘন query-র ডেটা এক shard-এ; বৃদ্ধির সাথেও টেকে। পরে বদলানো খুব দামি।
| মাপকাঠি | Range | Hash |
|---|---|---|
| ভাগ | key-এর পরিসর ধরে | hash(key) ধরে |
| Range scan | সস্তা | সব shard-এ scatter-gather |
| Hot spot | timestamp-এর মতো ক্রমিক key-এ আজকের সব লেখা এক shard-এ | সমান ছড়ায়; তবু একটি hot key এক shard-এ |
Rebalancing: node-এর চেয়ে অনেক বেশি নির্দিষ্ট partition বানিয়ে পুরো partition সরানো। ৫টি node-এ ন্যায্য ভাগ ২৫৬ ÷ ৫ = ৫১.২, তাই নতুন node অন্যদের থেকে ৫১টি partition নেয় — প্রায় ২০%; hash mod N-এ সরত প্রায় ৮০% key.
Snowflake-ধাঁচের ID: ১ চিহ্ন-bit + ৪১-bit millisecond timestamp + ১০-bit worker + ১২-bit sequence.
- প্রতি worker প্রতি ms-এ ২১২ = ৪,০৯৬টি ID; worker ২১০ = ১,০২৪টি।
- আয়ু ২৪১ ms ≈ ৬৯.৭ বছর, নিজের বেছে নেওয়া epoch থেকে।
নম্বর কোথায়: পার্থক্য (১), শর্ত (২), টেবিল (২), rebalancing (২), ID-র নকশা ও হিসাব (৩)। পর্ব ২৩ · পর্ব ১৬
যেখানে নম্বর কাটে: hot key ভুলে যাওয়া; ID-র আয়ু “চিরকাল” বলা; worker ID কে, কীভাবে পাবে তা না ভাবা।
খ-০৪ACID-এর চারটি অক্ষর ব্যাখ্যা করুন। Dirty read, lost update, read skew আর write skew-এর উদাহরণ দিন, আর কোন isolation level কোনটি ঠেকায় তার টেবিল দিন। একটি ওয়ালেট থেকে একসাথে দুটি টাকা তোলায় lost update কীভাবে ঠেকাবেন? — ১০ নম্বর (কঠিন)
ACID: A — ব্যর্থ হলে সব বা কিছুই না; C — অ্যাপের নিয়ম (invariant) রক্ষা, CAP-এর C নয়; I — একসাথে চলা কাজ একে অপরকে কতটা দেখে; D — commit-এর পরে crash-এও টেকে।
Anomaly:
- Dirty read — অন্যের commit-না-হওয়া বদল পড়া; পরে rollback হলে ভুল তথ্যে সিদ্ধান্ত।
- Lost update — balance ৫০০; দুজন একসাথে পড়েন; একজন ৩০০ তুলে ২০০ লেখেন, অন্যজন ৪০০ তুলে ১০০ লেখেন। প্রথম লেখা হারাল, অথচ ৫০০ টাকার ওয়ালেট থেকে বেরোল ৭০০।
- Read skew — দুটি অ্যাকাউন্ট আলাদা মুহূর্তে পড়ায় রিপোর্টে এমন মোট, যা কখনো ছিল না।
- Write skew — “অন্তত একজন on-call থাকবেন” দেখে দুজন ডাক্তার একসাথে ছুটি নেন; দুজনই আলাদা সারি লেখেন।
| Level | Dirty read | Lost update | Read skew | Write skew |
|---|---|---|---|---|
| READ COMMITTED | ঠেকায় | পারে না | পারে না | পারে না |
| Snapshot isolation | ঠেকায় | ঠেকায় (একটি abort) | ঠেকায় | পারে না |
| SERIALIZABLE | ঠেকায় | ঠেকায় | ঠেকায় | ঠেকায় |
নামের ফাঁদ: PostgreSQL-এর REPEATABLE READ আসলে snapshot isolation, আর MySQL InnoDB-এর একই নামের level আলাদা আচরণ করে — নাম নয়, আচরণ যাচাই করুন।
ওয়ালেটের প্রতিকার: (১) শর্তসহ atomic লেখা — UPDATE wallet SET bal = bal - 300 WHERE id = 7 AND bal >= 300; ০ সারি মানে টাকা নেই। (২) SELECT … FOR UPDATE. (৩) version কলামে optimistic লেখা। (৪) SERIALIZABLE আর retry.
নম্বর কোথায়: ACID (২), চার anomaly (৩), টেবিল (৩), প্রতিকার (২)। পর্ব ২৪ · DBMS কোর্সে MVCC
যেখানে নম্বর কাটে: ACID-এর C-কে CAP-এর C বলা; SERIALIZABLE-এ abort আর retry-র কথা না বলা।
খ-০৫Two-phase commit-এর দুই ধাপ sequence diagram-সহ ব্যাখ্যা করুন; commit point কোনটি, আর coordinator মরলে কী হয়? Saga আর outbox pattern কোন সমস্যার সমাধান? ধরা যাক RTT ১ ms, প্রতিটি fsync ৪ ms, ৩ জন participant — commit point পর্যন্ত কত সময়, কতগুলো বার্তা আর forced write? — ১০ নম্বর (কঠিন, ছবিসহ)
2PC:
- Prepare: coordinator সবাইকে PREPARE পাঠায়; প্রত্যেকে কাজ করে, lock ধরে, PREPARED record ডিস্কে force করে YES (বা NO) বলে।
- Commit: সব YES হলে coordinator COMMIT record force করে — এটিই commit point, এর পরে আর abort নেই; তারপর সবাইকে COMMIT, তারা force করে ack দেয়। একটি NO বা timeout হলে ABORT.
ছবি (খাতায়): চারটি খাড়া সময়রেখা C, P1, P2, P3; PREPARE-এর তীর ডানে, YES বাঁয়ে; C-র রেখায় তারা চিহ্ন “COMMIT force”; তারপর COMMIT আর ACK.
হিসাব: commit point = r + ২f = ১ + ৮ = ৯ ms (এক RTT, participant-এর PREPARED fsync আর coordinator-এর COMMIT fsync); পুরো প্রোটোকল ২r + ৩f = ২ + ১২ = ১৪ ms. বার্তা ৪N = ১২টি; forced write ২N + ১ = ৭টি.
Blocking: coordinator মরলে PREPARED participant নিজে সিদ্ধান্ত নিতে পারে না — lock ধরে অপেক্ষা করে। বাস্তবের প্রতিকার coordinator-এর সিদ্ধান্ত Raft বা Paxos দিয়ে replicated রাখা।
Saga: local transaction-এর শিকল, প্রতিটির একটি compensation; ব্যবসায়িক ব্যর্থতায় উল্টো ক্রমে compensation (টিকিট বাতিল → টাকা ফেরত), ক্ষণিকের ত্রুটিতে retry. Isolation নেই, তাই “pending” অবস্থা লাগে।
Outbox: database-এ লেখা আর broker-এ publish (dual write) মাঝপথে ভাঙে। Event একই local transaction-এ outbox টেবিলে, relay পরে পাঠায় — হারায় না, তবে দুবার যেতে পারে, তাই consumer idempotent.
নম্বর কোথায়: দুই ধাপ ও ছবি (৩), commit point ও blocking (২), হিসাব (২), saga ও outbox (৩)। পর্ব ২৫ · পর্ব ৩৪
যেখানে নম্বর কাটে: 2PC-কে consensus বলা; compensation-এর ক্রম উল্টো না রাখা; outbox-কে exactly-once বলা।
৪ · অংশ গ — Caching (মডিউল ৫)
রিভিশন: পর্ব ২৮ (কৌশল, race), পর্ব ২৯ (LRU, TTL, stampede) আর পর্ব ৩০ (shard, hot key). CDN-এর cache পর্ব ১৭-এ।
গ-০১Cache-aside, read-through, write-through, write-behind আর write-around তুলনা করুন। Cache-এ ০.৫ ms, database-এ ১০ ms লাগে; hit ratio ৮০% থেকে ৯৫% করলে গড় latency আর সেকেন্ডে ১০,০০০ পড়ায় database-এর চাপ কত বদলায়? লেখার পরে cache update না করে delete কেন? — ১০ নম্বর (মাঝারি)
| কৌশল | কে কী করে | লাভ | দাম |
|---|---|---|---|
| Cache-aside | app cache দেখে, miss-এ database থেকে এনে বসায় | সহজ; শুধু চাওয়া ডেটা | প্রথম পড়া ধীর; race |
| Read-through | miss-এ cache-এর loader আনে | app-এর কোড সরল | cache-স্তরকে database চিনতে হয় |
| Write-through | লেখা cache আর database-এ একসাথে | cache টাটকা | প্রতি লেখা ধীর |
| Write-behind | আগে cache, পরে batch-এ database | দ্রুততম লেখা | flush-এর আগে cache বিকল হলে লেখা হারায় |
| Write-around | শুধু database, cache-এ delete | একবার-লেখা ডেটায় cache নষ্ট হয় না | পরের পড়ায় miss |
হিসাব: গড় = tc + (১ − h) × tdb (miss-এও cache দেখার সময় যোগ হয়)। h = ০.৮: ০.৫ + ০.২ × ১০ = ২.৫ ms; h = ০.৯৫: ০.৫ + ০.০৫ × ১০ = ১.০ ms. Database-এর চাপ R(১ − h): সেকেন্ডে ২,০০০ থেকে ৫০০ — চার গুণ কম।
Delete কেন: delete idempotent আর ক্রম-নিরপেক্ষ, retry নিরাপদ; দুই লেখকের update উল্টো ক্রমে পৌঁছালে cache-এ পুরোনো মান থেকে যায়। তবু একটি race থাকে: পুরোনো মান পড়ে রাখা পাঠক লেখকের delete-এর পরে সেটি বসালে cache ভুল — প্রতিকার COMMIT-এর পরে delete, প্রতিটি key-এ TTL, আর lease বা version.
নম্বর কোথায়: টেবিল (৪), হিসাব (২), delete ও race (৪)। পর্ব ২৮
যেখানে নম্বর কাটে: miss-এ cache-এর সময় বাদ দেওয়া; write-behind-এর ক্ষতির জানালা না বলা।
গ-০২O(1)-এ get আর put করে এমন LRU cache কীভাবে বানাবেন? TTL-এ jitter কেন — ১ লাখ key একসাথে ৩,৬০০ সেকেন্ডের TTL পেলে আর ±১০% jitter দিলে কী বদলায়? — ৫ নম্বর (মাঝারি)
LRU-এর কাঠামো: hash map (key → list-এর node) + doubly linked list (মাথায় সবচেয়ে সাম্প্রতিক, লেজে সবচেয়ে পুরোনো)।
- get: map-এ node খোঁজা, list থেকে খুলে মাথায় বসানো — O(1).
- put: নতুন node মাথায়; ভরা হলে লেজের node মোছা, map থেকেও — O(1).
- Doubly কেন: মাঝের node খুলতে আগের node লাগে।
দুর্বলতা: একবার-পড়া বড় scan LRU-কে ধুয়ে দেয় — তখন SLRU, ARC বা W-TinyLFU.
Jitter: একসাথে মেয়াদ মানে এক সেকেন্ডে ১ লাখ miss (avalanche). ±১০%-এ মেয়াদ ৩,২৪০ থেকে ৩,৯৬০ সেকেন্ডে, ৭২০ সেকেন্ডের জানালায় ছড়ায় — গড়ে সেকেন্ডে প্রায় ১৩৯টি।
নম্বর কোথায়: কাঠামো ও O(1)-এর যুক্তি (৩), jitter ও হিসাব (২)। পর্ব ২৯
যেখানে নম্বর কাটে: শুধু linked list (তাহলে খোঁজা O(n)); singly linked list বলা।
গ-০৩Cache stampede, cache penetration আর cache avalanche-এর পার্থক্য আর প্রতিকার লিখুন। সেকেন্ডে ৫,০০০ অনুরোধের একটি hot key-এর মেয়াদ শেষ হলো, database থেকে আবার আনতে ৪০ ms লাগে — কোনো প্রতিকার না থাকলে প্রায় কতগুলো একই query database-এ যায়? — ৫ নম্বর (মাঝারি)
হিসাব: আবার আনার সময়ে আসা অনুরোধ = ৫,০০০ × ০.০৪ = ২০০টি একই query.
| সমস্যা | কী ঘটে | প্রতিকার |
|---|---|---|
| Stampede | একটি hot key-এর মেয়াদ শেষে একসাথে বহু miss | একজনই আনে, বাকিরা অপেক্ষা করে (request coalescing); soft TTL-এ পুরোনো মান দিয়ে পেছনে নবায়ন; আগেভাগে নবায়ন |
| Penetration | অস্তিত্বহীন key-এর ঢল, প্রতিটি সরাসরি database-এ | “নেই” উত্তরও অল্প TTL-এ cache; Bloom filter; ইনপুট যাচাই ও rate limit |
| Avalanche | বহু key একসাথে মেয়াদ শেষ, বা cache node বিকল | TTL jitter, replica, ধীরে warming, database-এর সামনে সীমা |
নম্বর কোথায়: তিন সংজ্ঞা (২), হিসাব (১), প্রতিকার (২)। পর্ব ২৯ · পর্ব ০৬
যেখানে নম্বর কাটে: তিনটিকে এক বলা; Bloom filter-কে stampede-এর প্রতিকার বলা।
গ-০৪৮টি shard-এর একটি distributed cache-এ hit ratio ৯৬%; একটি shard বিকল হলে database-এর চাপ কত গুণ হয়? সূত্র বের করুন, আর এই ঝুঁকি কমানোর তিনটি উপায় লিখুন। Hot key কীভাবে সামলাবেন? — ৫ নম্বর (কঠিন)
সূত্র: স্বাভাবিকে database-এ R(১ − h). একটি shard বিকল হলে তার ভাগ R/N-এর আগের hit-গুলোও miss: নতুন চাপ = R(১ − h) + (R/N)·h. অনুপাত = ১ + h ÷ (N(১ − h)) = ১ + ০.৯৬ ÷ (৮ × ০.০৪) = ১ + ৩ = ৪ গুণ.
তিন উপায়: প্রতিটি shard-এর replica আর দ্রুত failover; gutter pool — বিকল shard-এর key সাময়িক একটি ছোট pool-এ অল্প TTL-এ; database-এর সামনে concurrency সীমা আর request coalescing.
Hot key: sampling বা top-k দিয়ে চেনা; অল্প TTL-এর L1 (app-এর memory-তে); কয়েকটি shard-এ কপি (key#1 … key#k); coalescing. Virtual node বাড়িয়ে লাভ নেই — একটি key ভাগ হয় না।
নম্বর কোথায়: সূত্র ও মান (২), তিন উপায় (২), hot key (১)। পর্ব ৩০
যেখানে নম্বর কাটে: “চাপ ১/N বাড়ে” — hit ratio-র প্রভাব ভুলে যাওয়া।
৫ · অংশ ঘ — Messaging আর stream (মডিউল ৬)
রিভিশন: পর্ব ৩১ (ack, DLQ), পর্ব ৩২ (fan-out), পর্ব ৩৩ (partition, offset), পর্ব ৩৪, পর্ব ৩৫, পর্ব ৩৬ (window, watermark) আর পর্ব ৩৭.
ঘ-০১Point-to-point queue, pub/sub topic আর log-ভিত্তিক stream (Kafka-ধাঁচ)-এর তুলনা করুন। সেকেন্ডে ৫০০টি event, ৬টি subscription, প্রতিটি event ১ KB — সেকেন্ডে কতগুলো delivery আর কত bandwidth? একটি consumer group-এ ১২টি partition আর ১৬ জন consumer থাকলে কী হয়? — ১০ নম্বর (মাঝারি)
| মাপকাঠি | Queue | Pub/sub | Log stream |
|---|---|---|---|
| একটি বার্তা পায় | একজন কর্মী | প্রতিটি subscription নিজের কপি | প্রতিটি consumer group, নিজের offset থেকে |
| পড়ার পরে | ack হলে মোছে | subscription-এর কপি ack-এ মোছে | মোছে না — retention পর্যন্ত থাকে, আবার পড়া যায় |
| ক্রম | সাধারণত নিশ্চিত নয় | সাধারণত নিশ্চিত নয় | শুধু একটি partition-এর ভেতরে |
| ব্যবহার | কাজ ভাগ — email, ছবি ছোট করা | এক ঘটনার বহু শ্রোতা | event history, CDC, replay, stream processing |
হিসাব: delivery = E × N = ৫০০ × ৬ = সেকেন্ডে ৩,০০০; × ১ KB = বাইরে যায় সেকেন্ডে প্রায় ৩ MB. Fan-out গুণফলে বাড়ে — subscription দ্বিগুণ মানে খরচও দ্বিগুণ।
Consumer group: একটি group-এ প্রতিটি partition ঠিক একজন consumer পড়েন — ১২ জন কাজ করেন, ৪ জন অলস। সমান্তরালতার ছাদ partition-এর সংখ্যা; কেউ এলে বা গেলে rebalance. যাদের ক্রম জরুরি, তাদের একই key দিন — একই partition-এ যাবে।
লাভ ও দাম: producer আর consumer সময়, গতি আর ব্যর্থতায় আলাদা; ভিড় শোষণ (load levelling). দাম — eventual consistency, duplicate, ক্রম আর debugging.
নম্বর কোথায়: টেবিল (৪), হিসাব (২), consumer group (২), লাভ-দাম (২)। পর্ব ৩১ · পর্ব ৩২ · পর্ব ৩৩
যেখানে নম্বর কাটে: “Kafka পুরো topic-এ ক্রম দেয়”; partition না বাড়িয়ে consumer বাড়ালেই throughput বাড়বে বলা।
ঘ-০২At-most-once, at-least-once আর exactly-once delivery ব্যাখ্যা করুন। Exactly-once delivery কেন অসম্ভব, আর effectively-once কীভাবে পাওয়া যায়? Offset কাজের আগে না পরে commit করলে কী হয়? সেকেন্ডে ২,০০০ বার্তা, ২৪ ঘণ্টার dedup window আর প্রতি entry ৪০ byte হলে dedup-এর memory কত? — ১০ নম্বর (কঠিন)
মূল সত্য: timeout মানে “জানি না” — বার্তা হারাল, নাকি কাজ হয়ে শুধু ack হারাল, প্রেরক আলাদা করতে পারে না।
| নিশ্চয়তা | কতবার | কীভাবে আসে | ঝুঁকি |
|---|---|---|---|
| At-most-once | ০ বা ১ | কাজের আগে ack বা commit, retry নেই | crash-এ হারায় |
| At-least-once | ১ বা বেশি | কাজের পরে ack, retry | duplicate |
| Effectively-once | প্রভাব ঠিক ১ বার | at-least-once + idempotent প্রক্রিয়া | dedup-এর খরচ |
কেন অসম্ভব: ack না এলে প্রেরকের সামনে দুটিই পথ — আবার পাঠানো (duplicate-এর ঝুঁকি) বা না পাঠানো (হারানোর ঝুঁকি); অজানা অবস্থা থেকে বেরোনোর তৃতীয় পথ নেই। তাই “exactly-once” বাস্তবে মানে প্রভাব একবার।
Effectively-once-এর ধাপ:
- প্রতিটি বার্তায় একটি অনন্য id.
- Consumer effect আর “দেখা হয়েছে” চিহ্ন (inbox টেবিল বা offset) একই local transaction-এ লেখে।
- Duplicate এলে চিহ্ন দেখে বাদ।
- বাইরের সেবায় (payment, email) তাদের নিজস্ব idempotency key.
Offset commit: আগে করলে crash-এ বার্তা হারায় (at-most-once); পরে করলে কয়েকটি দুবার আসে (at-least-once).
হিসাব: ২,০০০ × ৮৬,৪০০ × ৪০ byte = ৬.৯১ × ১০৯ byte ≈ ৬.৯ GB. Window ছোট হলে পুরোনো duplicate (redrive, replay) ঢুকে পড়ে; বিকল্প per-producer sequence number — অনেক সস্তা।
নম্বর কোথায়: টেবিল (৩), অসম্ভবতার যুক্তি (২), effectively-once (২), offset (১), হিসাব (২)। পর্ব ৩৪ · পর্ব ৩৩
যেখানে নম্বর কাটে: “broker exactly-once দেয়, তাই চিন্তা নেই”; dedup window-এর আকার যুক্তি ছাড়া।
ঘ-০৩Event sourcing আর CQRS কী? দুটি কি একই? একটি stream-এ ২,৩৪০টি event, প্রতি ৫০০টিতে একটি snapshot — বর্তমান অবস্থা বানাতে কতগুলো event replay করতে হয়? — ৫ নম্বর (মাঝারি)
Event sourcing: শুধু বর্তমান অবস্থা নয়, প্রতিটি ঘটনা রাখা; অবস্থা = ঘটনাগুলোর fold — মুদি দোকানের খাতার মতো, শেষ লাইনের বাকি নয়, প্রতিটি লেনদেন। Event store শুধু যোগ করে; লেখায় “আমি version ৪ দেখে লিখছি” — optimistic concurrency.
CQRS: লেখার মডেল (নিয়ম যাচাই) আর পড়ার মডেল (প্রতিটি পাতার মাপে সাজানো) আলাদা; projector event পড়ে read model বানায়, যা একটু পিছিয়ে থাকে।
এক নয়: event sourcing ছাড়া CQRS আর CQRS ছাড়া event sourcing — দুটোই সম্ভব।
হিসাব: শেষ snapshot version ২,০০০-এ (৫০০-এর গুণিতক); বাকি ২,৩৪০ − ২,০০০ = ৩৪০টি event replay.
Trade-off: লাভ audit, অতীতের যেকোনো মুহূর্তে ফেরা আর নতুন read model; দাম জটিলতা, event-এর schema চিরকাল বহন (upcasting) আর মুছে ফেলার কঠিন প্রশ্ন। বেশিরভাগ CRUD অংশে লাগে না।
নম্বর কোথায়: দুই সংজ্ঞা (২), পার্থক্য (১), হিসাব (১), trade-off (১)। পর্ব ৩৫
যেখানে নম্বর কাটে: দুটিকে সমার্থক বলা; read model তাৎক্ষণিক ধরে নেওয়া।
ঘ-০৪Batch আর stream processing-এর পার্থক্য লিখুন। Event time আর processing time কী? Watermark আর allowed lateness দিয়ে দেরিতে আসা ডেটা কীভাবে সামলানো হয়? — ৫ নম্বর (মাঝারি)
পার্থক্য: batch সীমিত (bounded) ডেটায় কাজ করে — গতকালের সব log; দাম দেরি। Stream অসীম (unbounded) ধারায় — যা এখনো আসছে; দাম অসম্পূর্ণতা।
দুই সময়: event time = ঘটনা কখন ঘটেছে (ফোনের timestamp); processing time = processor কখন দেখল। নেটওয়ার্কহীন ফোন পরে পাঠালে দুটি অনেক আলাদা; ব্যবসার প্রশ্নে event time.
Watermark: processor-এর অনুমান — “এর চেয়ে পুরোনো ঘটনা আর আসবে না”; তখন window-এর ফল দেওয়া হয়। উদাহরণ: ১০:০০–১০:০১-এর window; watermark ১০:০১ পেরোলে প্রথম ফল; allowed lateness ২ মিনিট হলে watermark ১০:০৩ পেরোনো পর্যন্ত দেরির ঘটনা ফল সংশোধন করে (sink-এ upsert); তারপর আলাদা পথে (side output) বা বাদ।
নম্বর কোথায়: পার্থক্য (১), দুই সময় (১), watermark ও lateness (২), উদাহরণ (১)। পর্ব ৩৬
যেখানে নম্বর কাটে: watermark-কে নিশ্চয়তা বলা — এটি অনুমান; processing time ধরে ব্যবসার হিসাব।
৬ · অংশ ঙ — Distributed systems-এর তত্ত্ব (মডিউল ৭)
রিভিশন: পর্ব ৩৮ (partial failure, system model), পর্ব ৩৯ (clock), পর্ব ৪০ (CAP, PACELC — পূর্ণ ১০ নম্বরের উত্তর অংশ ১-এর stepper-এ), পর্ব ৪১, পর্ব ৪২, পর্ব ৪৩, পর্ব ৪৪, পর্ব ৪৫ আর পর্ব ৪৬. এই অংশে প্রমাণ আর গণনার নম্বর বেশি — ধাপ বাদ দেবেন না।
ঙ-০১Distributed system-এ partial failure কী? Timeout পেরোলে কী সিদ্ধান্ত নেওয়া যায়, আর কী যায় না? সময় আর ব্যর্থতার system model লিখুন। ৫ node-এর একটি cluster ৩ আর ২-এ ভাগ হলে কোন পক্ষ লেখা নেবে? — ৫ নম্বর (মাঝারি)
Partial failure: কিছু অংশ চলে, কিছু থামে, আর একটি call-এর ফল অজানা থাকতে পারে; এক যন্ত্রে সাধারণত সব বা কিছুই না।
Timeout: request হারানো, reply হারানো আর ধীর node — বাইরে থেকে তিনটি এক। বলা যায় শুধু “উত্তর আসেনি”; কাজ হয়েছে কি না অজানা — তাই retry কেবল idempotent কাজে।
| মডেল | ধরন |
|---|---|
| সময় | synchronous (দেরির সীমা জানা) · partially synchronous (বেশিরভাগ সময় সীমার ভেতরে) · asynchronous (কোনো সীমা নেই) |
| ব্যর্থতা | crash-stop · crash-recovery · Byzantine (মিথ্যা বা এলোমেলো আচরণ) |
ডেটা সেন্টারের বেশিরভাগ সিস্টেম ধরে partial synchrony আর crash-recovery (system model).
৩ | ২ partition: majority (৩) পক্ষ এগোয়; ২-এর পক্ষ থামে — নইলে দুই পক্ষই লিখে split-brain.
নম্বর কোথায়: partial failure (১), timeout (১), model (২), partition (১)। পর্ব ৩৮
যেখানে নম্বর কাটে: “timeout মানে node মৃত”।
ঙ-০২আলাদা যন্ত্রের wall clock দিয়ে ঘটনার ক্রম ঠিক করা যায় না কেন? Lamport clock আর vector clock-এর নিয়ম লিখুন। এই তিনটি process-এর ঘটনায় দুটিরই মান বের করুন আর b ও c-র সম্পর্ক বলুন: P1-এ a (local), তারপর b (P2-কে বার্তা পাঠায়); P2-এ c (local), তারপর d (P1-এর বার্তা গ্রহণ), তারপর e (P3-কে বার্তা পাঠায়); P3-এ f (local), তারপর g (P2-এর বার্তা গ্রহণ)। — ১০ নম্বর (মাঝারি, ছবিসহ)
Wall clock-এর সমস্যা: quartz ঘড়ি সরে (২০ ppm মানে দিনে প্রায় ১.৭ সেকেন্ড), NTP-র পরে লাফায়। ঘড়ির পার্থক্যের চেয়ে কাছাকাছি দুটি ঘটনা উল্টো ক্রমে দেখা যায়।
Lamport-এর নিয়ম: প্রতিটি ঘটনায় L = L + ১; পাঠানোর সময় L সাথে যায়; গ্রহণে L = max(L, Lবার্তা) + ১. গুণ: a → b হলে L(a) < L(b); উল্টোটা সত্য নয়।
Vector-এর নিয়ম: প্রতিটি process-এর একটি ঘর; নিজের ঘটনায় নিজের ঘর + ১; পাঠানোয় পুরো vector যায়; গ্রহণে ঘর ধরে max, তারপর নিজের ঘর + ১. সব ঘরে ≤ আর অন্তত একটিতে < হলে আগে; নইলে concurrent.
ছবি (খাতায়): তিনটি আনুভূমিক সময়রেখা P1, P2, P3; b থেকে d-তে আর e থেকে g-তে তির্যক তীর; প্রতিটি বিন্দুর পাশে L আর vector.
| ঘটনা | Lamport | Vector [P1, P2, P3] |
|---|---|---|
| a (P1) | ১ | [1,0,0] |
| b (P1, পাঠায়) | ২ | [2,0,0] |
| c (P2) | ১ | [0,1,0] |
| d (P2, গ্রহণ) | max(১, ২) + ১ = ৩ | [2,2,0] |
| e (P2, পাঠায়) | ৪ | [2,3,0] |
| f (P3) | ১ | [0,0,1] |
| g (P3, গ্রহণ) | max(১, ৪) + ১ = ৫ | [2,3,2] |
b ও c: L(c) = ১ < L(b) = ২, তবু c → b নয়। Vector [0,1,0] আর [2,0,0] — একটির প্রথম ঘর বড়, অন্যটির দ্বিতীয় — তাই concurrent. Lamport একটি ক্রম দেয়, কিন্তু concurrency চেনে না।
নম্বর কোথায়: wall clock-এর সমস্যা (১), দুই নিয়ম (২), ছবি (২), টেবিল (৩), সম্পর্ক ও সীমা (২)। পর্ব ৩৯ · পর্ব ৪৬
যেখানে নম্বর কাটে: গ্রহণের পরে + ১ ভুলে যাওয়া; Lamport-এর মান দেখে concurrency নিয়ে দাবি।
ঙ-০৩Linearizable, sequential, causal আর eventual consistency-র পার্থক্য উদাহরণসহ লিখুন। Serializability আর linearizability কি এক? — ৫ নম্বর (মাঝারি)
| মডেল | প্রতিশ্রুতি | কোথায় |
|---|---|---|
| Linearizable | এক কপির ভ্রম, বাস্তব সময় মেনে: একটি লেখা শেষ হওয়ার পরে শুরু হওয়া প্রতিটি পড়া নতুন মান দেখে | শেষ সিট, টাকা কাটা, leader lock |
| Sequential | সবাই একই একটি ক্রম দেখে, কিন্তু তা বাস্তব সময়ের সাথে মিলতে হবে না | কিছু memory model |
| Causal | কারণ আগে, ফল পরে — প্রশ্নের আগে উত্তর দেখা যাবে না; concurrent লেখার ক্রম যেকোনো | comment thread, chat |
| Eventual | নতুন লেখা থামলে শেষে সব কপি মিলবে; কতক্ষণে, তার কোনো সীমা নেই | like গণনা, view count |
Serializability বনাম linearizability: এক নয়। প্রথমটি বহু object-এর transaction — ফল কোনো একটি ক্রমিক ক্রমের মতো, যেকোনো ক্রম; দ্বিতীয়টি একটি object-এর বাস্তব সময়ের ক্রম। দুটি একসাথে strict serializability.
নম্বর কোথায়: চার মডেল (৩), পার্থক্য (২)। পর্ব ৪০ · পর্ব ২৪
যেখানে নম্বর কাটে: “eventual মানে কয়েক সেকেন্ডে নিশ্চিত”; sequential আর linearizable এক বলা।
ঙ-০৪Leaderless replication-এ R + W > N হলে কেন পড়া সর্বশেষ সম্পন্ন লেখা দেখে — প্রমাণ করুন। N = ৩, (W, R) = (২, ২) আর N = ৫, (W, R) = (৩, ৩)-এ কয়টি replica বিকল সহ্য হয়? Quorum থাকলেও পুরোনো বা হারানো মান আসতে পারে এমন তিনটি ক্ষেত্র লিখুন। Read repair আর hinted handoff কী? — ১০ নম্বর (কঠিন)
প্রমাণ: লেখা পৌঁছায় W টি replica-র সেট SW-এ, পড়া উত্তর নেয় R টির সেট SR থেকে। |SW ∪ SR| ≤ N, তাই |SW ∩ SR| = W + R − |SW ∪ SR| ≥ W + R − N ≥ ১. সেই অন্তত একটি replica সর্বশেষ সম্পন্ন লেখা রাখে, আর পড়া সব উত্তরের মধ্যে সবচেয়ে নতুন version নেয়। ∎
| N | W | R | ন্যূনতম overlap | লেখা টেকে | পড়া টেকে |
|---|---|---|---|---|---|
| ৩ | ২ | ২ | ১ | ১টি বিকলে | ১টি বিকলে |
| ৫ | ৩ | ৩ | ১ | ২টি বিকলে | ২টি বিকলে |
Quorum তবু ঠকায়:
- চলমান লেখা: কিছু replica নতুন, কিছু পুরোনো — পরপর দুটি পড়া উল্টো ফল দেখতে পারে।
- ব্যর্থ আংশিক লেখা: W পূরণ হয়নি, কিন্তু যেখানে পৌঁছেছে সেখানে থেকে যায় — rollback নেই।
- Sloppy quorum: নিজের তালিকার বাইরের node-এর ack W-এ গোনা — overlap হারায়।
- Concurrent লেখা আর LWW: একটি নিঃশব্দে হারায়।
Linearizable পড়া-লেখা দরকার হলে উত্তর ফেরানোর আগে blocking read repair (তবু compare-and-set-এ নয়), নয়তো consensus.
মেরামত: read repair — পড়ায় পুরোনো replica পেলে নতুন মান লিখে দেওয়া; hinted handoff — বন্ধ replica-র লেখা আরেকজন “hint”-সহ রেখে পরে পৌঁছে দেয়; anti-entropy — Merkle tree দিয়ে পেছনে মিলানো।
নম্বর কোথায়: প্রমাণ (৩), টেবিল (২), তিন ক্ষেত্র (৩), মেরামত (২)। পর্ব ৪১ · পর্ব ৬১
যেখানে নম্বর কাটে: প্রমাণের জায়গায় শুধু উদাহরণ; “R + W > N মানেই linearizable”.
ঙ-০৫Raft-এ leader election আর log replication ব্যাখ্যা করুন। ৫টি সার্ভারের cluster কতগুলো crash সহ্য করে? ৪টিতে কি বেশি সহ্য হয়? Randomized election timeout কেন? একটি entry কখন committed? — ১০ নম্বর (মাঝারি, ছবিসহ)
সংজ্ঞা: Consensus মানে কয়েকটি সার্ভারের একটি log-এর ক্রমে একমত হওয়া — agreement, validity আর termination.
State diagram (খাতায়): তিনটি বৃত্ত — follower → (timeout) → candidate → (majority ভোট) → leader; candidate থেকে follower-এ তীর “বড় term বা বৈধ leader দেখলে”; leader থেকে follower-এ “বড় term দেখলে”।
Election:
- Follower নির্দিষ্ট সময়ে heartbeat না পেলে term + ১ করে, নিজে ভোট দেয়, সবাইকে RequestVote পাঠায়।
- প্রতি term-এ প্রত্যেকে একটিই ভোট দেয় — শুধু সেই candidate-কে, যার log অন্তত ভোটদাতার মতো হালনাগাদ (আগে শেষ entry-র term, তারপর দৈর্ঘ্য)।
- Majority পেলে leader. Election timeout এলোমেলো (Raft paper-এর উদাহরণে ১৫০–৩০০ ms), যাতে সবাই একসাথে candidate হয়ে ভোট ভাগ (split vote) না করে।
Log replication: client-এর command leader-এর log-এ; AppendEntries-এ prevLogIndex আর prevLogTerm — না মিললে follower প্রত্যাখ্যান করে, leader পেছনে গিয়ে মেলায়। Entry majority-তে পৌঁছালে committed, তারপর state machine-এ প্রয়োগ আর client-কে উত্তর। Leader কপি গুনে commit করে শুধু নিজের term-এর entry; আগেরগুলো তার সাথে পরোক্ষে।
সহনশীলতা: ২f + ১টি সার্ভার f টি crash সয়। ৫ → majority ৩, সয় ২টি; ৪ → majority ৩, সয় মাত্র ১টি — জোড় সংখ্যায় লাভ নেই। যেকোনো দুটি majority অন্তত একজনে মেলে, তাই committed entry নতুন leader-এর চোখ এড়ায় না।
নম্বর কোথায়: state diagram (২), election (৩), replication ও commit (৩), সহনশীলতা (২)। পর্ব ৪২
যেখানে নম্বর কাটে: “৪টিতে ২টি সয়”; split vote-এর কারণ না বলা; আগের term-এর entry কপি গুনেই commit বলা।
ঙ-০৬Lease-ভিত্তিক distributed lock-এ দুজন একসাথে ধারক কীভাবে হতে পারে? Fencing token দিয়ে কীভাবে ঠেকানো হয় — timeline দিয়ে দেখান। — ৫ নম্বর (মাঝারি, ছবিসহ)
Timeline (খাতায় দুটি সময়রেখা, client A আর B, নিচে storage):
- A lock পায়, token ৩৩, lease ১০ সেকেন্ড।
- A-র process GC-বিরতিতে ১৫ সেকেন্ড থেমে থাকে — নিজে জানে না।
- Lease ফুরায়; B lock পায়, token ৩৪, storage-এ লেখে।
- A জেগে নিজেকে এখনো ধারক ভেবে token ৩৩ নিয়ে লেখে।
- Storage আগেই ৩৪ দেখেছে; ৩৩ < ৩৪ → প্রত্যাখ্যান।
শর্ত: fencing token একঘেয়েভাবে বাড়তে থাকা নম্বর (UUID নয় — তাতে ছোট-বড় নেই), আর যাচাই করে storage নিজে, lock সেবা নয়।
বিকল্প: অনেক সময় lock-ই লাগে না — শর্তসহ লেখা (compare-and-set, version), idempotency, বা প্রতিটি key-এর একজনই লেখক।
নম্বর কোথায়: সমস্যার কারণ (১), timeline (২), শর্ত (১), বিকল্প (১)। পর্ব ৪৩
যেখানে নম্বর কাটে: “TTL বাড়ালেই হবে”; যাচাই lock সেবায় বলা।
ঙ-০৭Bloom filter কীভাবে কাজ করে? False-positive হারের সূত্র লিখে সেরা k বের করুন। ১ কোটি key-এ ১% false positive চাইলে কত memory আর কয়টি hash? ভুল কোন দিকে হয়, আর এটি কোথায় ব্যবহার করা নিরাপদ? — ৬ নম্বর (কঠিন)
কাজ: Bloom filter-এ m bit-এর array আর k টি hash. যোগ: k টি bit ১; খোঁজ: k টির সব ১ হলে “হয়তো আছে”, একটি ০ হলেও “নিশ্চিত নেই”।
সূত্র: n টি key আর k টি hash-এর পরে একটি bit ০ থাকার সম্ভাবনা ≈ e−kn/m; false positive p ≈ (১ − e−kn/m)k. সেরা k = (m/n) ln 2 — তখন অর্ধেক bit ১, আর m/n = −ln p ÷ (ln 2)².
হিসাব: p = ০.০১ → m/n ≈ ৯.৫৯ bit; m ≈ ৯.৫৯ × ১০৭ bit ≈ ১২ MB; k ≈ ৯.৫৯ × ০.৬৯৩ ≈ ৬.৬৪ → ৭টি hash. (০.১%-এ প্রায় ১৪.৪ bit আর ১০টি hash.)
ভুলের দিক: শুধু false positive; false negative নেই, যদি মোছা না হয়। মুছতে হলে counting Bloom বা cuckoo filter. নিরাপদ জায়গা: LSM-এ অপ্রয়োজনীয় SSTable বাদ, cache penetration ঠেকানো — ভুল মানে সামান্য বাড়তি কাজ। চূড়ান্ত সিদ্ধান্তে (বিল, duplicate বাদ) নয়।
নম্বর কোথায়: কাজ (১), সূত্র ও k (২), হিসাব (২), ভুলের দিক ও ব্যবহার (১)। পর্ব ৪৫ · পর্ব ১৯
যেখানে নম্বর কাটে: bit-কে byte ধরে প্রায় ৯৬ MB লেখা; false negative আছে বলা।
৭ · অংশ চ — Architecture, reliability আর operations (মডিউল ৮)
রিভিশন: পর্ব ৪৭, পর্ব ৪৮ (retry, circuit breaker), পর্ব ৪৯, পর্ব ৫০ (SLO, burn rate), পর্ব ৫১ (RPO-RTO), পর্ব ৫২ (OAuth, PKCE) আর পর্ব ৫৩.
চ-০১Monolith, modular monolith আর microservices-এর তুলনা করুন। ৯৯.৯% availability-র ১৫টি সেবা একটি অনুরোধের পথে পরপর লাগলে সম্মিলিত availability কত? Service boundary কীভাবে ঠিক করবেন, আর distributed monolith-এর চিহ্ন কী? — ১০ নম্বর (মাঝারি)
সংজ্ঞা: Monolith — পুরো অ্যাপ একটি প্রোগ্রাম, একসাথে deploy. Microservices-এর দুটি সংজ্ঞাগত শর্ত: প্রতিটি সেবা আলাদাভাবে deploy করা যায়, আর নিজের ডেটার একমাত্র মালিক।
| মাপকাঠি | Monolith | Modular monolith | Microservices |
|---|---|---|---|
| Deploy | একসাথে | একসাথে, ভেতরে কড়া module-সীমা | প্রতিটি আলাদা |
| ডেটা | একটি database | একটি database, module-প্রতি schema | প্রতি সেবায় নিজের |
| Call | function call | function call | network call — latency আর ব্যর্থতা |
| Operations | সরল | সরল | discovery, tracing, mesh, প্রতি সেবায় CI/CD |
হিসাব: ০.৯৯৯১৫ ≈ ৯৮.৫১% — বছরে প্রায় ১৩০ ঘণ্টা কোনো না কোনো সেবা বিকল।
Boundary: ব্যবসার ভাষায় — bounded context আর aggregate (অর্ডার, পেমেন্ট, ক্যাটালগ); টেবিল বা কোডের স্তর (controller, DAO) দিয়ে নয়। যা একসাথে বদলায়, তা একসাথে থাকে।
Distributed monolith-এর চিহ্ন: একটি অনুরোধে ডজনখানেক বাচাল call; কয়েক সেবা একই টেবিলে লেখে; সবাইকে একসাথে deploy করতে হয়।
উপসংহার: নতুন সিস্টেমে modular monolith দিয়ে শুরু; দল আর চাপ বাড়লে মাপা কারণে একটি একটি অংশ কেটে আলাদা (strangler fig).
নম্বর কোথায়: টেবিল (৪), হিসাব (২), boundary (২), distributed monolith (২)। পর্ব ৪৭
যেখানে নম্বর কাটে: “microservices সবসময় বেশি scalable”; network-এর দাম বাদ দেওয়া।
চ-০২ধীর dependency কেন মৃত dependency-র চেয়ে খারাপ? Timeout, retry, exponential backoff ও jitter, circuit breaker আর bulkhead ব্যাখ্যা করুন; circuit breaker-এর state diagram আঁকুন। তিনটি স্তরের প্রতিটি ৩ বার চেষ্টা করলে সবচেয়ে নিচের বিকল সেবা কতগুলো চেষ্টা পায়? — ১০ নম্বর (মাঝারি, ছবিসহ)
ধীর বনাম মৃত: মৃত সেবা ১ ms-এ “না” বলে; ধীর সেবা প্রতিটি thread কয়েক সেকেন্ড আটকে রাখে। Little-এর সূত্রে সেকেন্ডে ২০০টি call-এ W ১০০ ms থেকে ৫ সেকেন্ড হলে একসাথে চলা call ২০ থেকে ১,০০০ — ধরা যাক ২০০-র pool ফুরায়, সুস্থ কাজও থামে: cascading failure.
- Timeout প্রতিটি call-এ, আর পুরো অনুরোধে একটি deadline, যা নিচের সব call-এ পৌঁছায়।
- Retry শুধু ক্ষণিকের ত্রুটিতে আর idempotent কাজে; exponential backoff-এ অপেক্ষা = min(cap, base × ২k), আর full jitter-এ তার ০ থেকে পুরো মানের মধ্যে এলোমেলো — একসাথে ব্যর্থ ক্লায়েন্টদের ঢেউ ভাঙে।
- Circuit breaker: closed (সব যায়, ব্যর্থতা গোনে) → ব্যর্থতার হার সীমা ছাড়ালে open (কিছুই যায় না, সাথে সাথে fallback) → cooldown শেষে half-open (অল্প কয়েকটি পরীক্ষা) → সফলে closed, ব্যর্থে আবার open.
- Bulkhead: প্রতিটি dependency-র আলাদা thread pool বা connection সীমা — জাহাজের খোপের মতো, একটিতে পানি ঢুকলেও বাকিরা ভাসে।
ছবি (খাতায়): তিনটি বৃত্ত closed, open, half-open; তীরে শর্ত — “ব্যর্থতা ≥ সীমা”, “cooldown শেষ”, “পরীক্ষা সফল”, “পরীক্ষা ব্যর্থ”।
হিসাব: ৩ × ৩ × ৩ = ২৭টি চেষ্টা একটি মূল অনুরোধে — retry নিজেই overload. প্রতিকার: শুধু একটি স্তরে retry, আর retry budget.
নম্বর কোথায়: ধীর বনাম মৃত (২), timeout ও retry (৩), state diagram (২), bulkhead (১), হিসাব (২)। পর্ব ৪৮ · পর্ব ১৮
যেখানে নম্বর কাটে: state diagram-এ half-open বাদ; “retry বাড়ালেই reliability বাড়ে”।
চ-০৩Token bucket, leaky bucket, fixed window, sliding window log আর sliding window counter তুলনা করুন। Token bucket-এ r = সেকেন্ডে ১০, b = ৫০ হলে যেকোনো ১০ সেকেন্ডে সর্বোচ্চ কতটি অনুরোধ যায়? মিনিটে ১০০-র sliding window counter-এ আগের মিনিটে ৮০টি, এই মিনিটের ১৫ সেকেন্ডে ৩০টি — আনুমানিক গণনা কত? বহু gateway-তে সীমা ঠিক রাখবেন কীভাবে? — ৬ নম্বর (মাঝারি)
| Algorithm | ধারণা | Burst | দুর্বলতা |
|---|---|---|---|
| Token bucket | r হারে token জমে, সর্বোচ্চ b; প্রতি অনুরোধে একটি | b পর্যন্ত | burst ইচ্ছাকৃত |
| Leaky bucket (queue) | সমান হারে বেরোয় | মসৃণ, বাড়তিটা অপেক্ষায় | অপেক্ষা বাড়ে |
| Fixed window | মিনিট ধরে counter | সীমানায় দ্বিগুণ — ২ সেকেন্ডে ২০০ | সীমানার ফাঁক |
| Sliding log | প্রতিটি অনুরোধের সময় রাখা | নিখুঁত | memory-খেকো |
| Sliding counter | আগের × (১ − f) + এখন | কাছাকাছি | আগের window সমান ছড়ানো ধরে |
হিসাব: token bucket-এ যেকোনো T সেকেন্ডে সর্বোচ্চ b + r·T = ৫০ + ১০ × ১০ = ১৫০. Sliding counter-এ f = ১৫ ÷ ৬০ = ০.২৫, গণনা = ৮০ × ০.৭৫ + ৩০ = ৯০ < ১০০ — অনুরোধ যায়।
বহু gateway: ভাগ করা store-এ atomic INCR বা একটি script — “আগে পড়া, পরে লেখা”-র race-এ সীমা ফুটো হয়; বিকল্প প্রতিটি gateway-তে সীমার একটি ভাগ (অসম ভাগে ভুল)। উত্তরে 429 আর Retry-After; client-এ backoff ও jitter.
নম্বর কোথায়: টেবিল (৩), দুই হিসাব (২), বহু gateway (১)। পর্ব ৪৯ · পর্ব ১১
যেখানে নম্বর কাটে: rate limit আর load shedding এক বলা; burst-এর b বাদ দিয়ে ১০০ লেখা।
চ-০৪SLI, SLO আর SLA-র পার্থক্য লিখুন। ৩০ দিনে ৯৯.৯% SLO-তে error budget কত মিনিট, আর সেকেন্ডে ৫০০ অনুরোধে কতগুলো ব্যর্থ অনুরোধের অনুমতি? Burn rate ১৪.৪-এর alert কেন? — ৫ নম্বর (মাঝারি)
সংজ্ঞা: SLI = মাপা সংকেত (সফল অনুরোধের অনুপাত, p99 latency); SLO = লক্ষ্য (৩০ দিনে ৯৯.৯% সফল); SLA = চুক্তি, ভাঙলে ক্ষতিপূরণ — সাধারণত SLO-র চেয়ে ঢিলা।
Error budget: (১ − ০.৯৯৯) × ৪৩,২০০ মিনিট = ৪৩.২ মিনিট. অনুরোধে: ৫০০ × ২৫,৯২,০০০ সেকেন্ড × ০.০০১ = ১২,৯৬,০০০টি.
Burn rate: এখনকার error ratio ÷ (১ − SLO). ১৪.৪-এ এক ঘণ্টায় বাজেটের ১৪.৪ ÷ ৭২০ = ২% শেষ, আর এই গতিতে ৫০ ঘণ্টায় পুরো মাসের বাজেট — মানুষ জাগানোর মতো জরুরি। দুই জানালা (১ ঘণ্টা আর ৫ মিনিট) দুটিতেই সীমা ছাড়ালে alert — দ্রুত ধরা, আর সমস্যা মিটলে দ্রুত থামা।
নম্বর কোথায়: সংজ্ঞা (২), budget হিসাব (২), burn rate (১)। পর্ব ৫০
যেখানে নম্বর কাটে: SLA আর SLO এক বলা; CPU-র মতো কারণে alert, ব্যবহারকারীর লক্ষণে নয়।
চ-০৫RPO আর RTO কী? Replication থাকলে backup কেন লাগে? চারটি DR কৌশলের তুলনা দিন। প্রতি ৬ ঘণ্টায় একটি পূর্ণ backup, ডেটা ২ TB, restore-এর গতি ২০০ MB/s হলে সবচেয়ে খারাপ RPO আর শুধু কপি ফেরানোর সময় কত? — ৫ নম্বর (মাঝারি)
সংজ্ঞা: RPO — সর্বোচ্চ কত সময়ের ডেটা হারানো চলে (অতীতের দিকে); RTO — সর্বোচ্চ কতক্ষণ বন্ধ থাকা চলে (ভবিষ্যতের দিকে)। Replication ভুল DELETE, corruption আর ransomware-ও কপি করে; backup অতীতের নির্দিষ্ট মুহূর্তে ফেরায়।
| কৌশল | RPO-RTO (মোটামুটি মাত্রা) | খরচ ও জটিলতা |
|---|---|---|
| Backup & restore | ঘণ্টা থেকে দিন | সবচেয়ে কম |
| Pilot light | মিনিট থেকে ঘণ্টা | মূল ডেটা replicate, compute বন্ধ |
| Warm standby | মিনিট | ছোট মাপে সব চালু |
| Active-active | প্রায় শূন্য | সবচেয়ে বেশি; conflict সামলাতে হয় |
হিসাব: backup-এর ঠিক আগে বিপর্যয় হলে RPO = ৬ ঘণ্টা. কপি ফেরানো = ২ × ১০১২ ÷ ২ × ১০৮ = ১০,০০০ সেকেন্ড ≈ ২.৭৮ ঘণ্টা; যাচাই, log replay আর traffic সরানো যোগ হলে আসল RTO আরও বেশি — তা মাপা যায় শুধু restore-মহড়ায়।
নম্বর কোথায়: সংজ্ঞা (১), backup-এর কারণ (১), টেবিল (২), হিসাব (১)। পর্ব ৫১
যেখানে নম্বর কাটে: RPO আর RTO উল্টে বলা; কপি ফেরানোর সময়কেই RTO ধরা।
চ-০৬Authentication আর authorization-এর পার্থক্য লিখুন (401 বনাম 403). ব্রাউজার বা মোবাইল অ্যাপে OAuth 2.0 authorization code flow + PKCE-র ধাপ লিখুন; PKCE কোন সমস্যা মেটায়? Envelope encryption কী? — ৫ নম্বর (মাঝারি)
পার্থক্য: authentication — “আপনি কে” (না পারলে 401); authorization — “এটি পারেন কি না” (না পারলে 403). প্রতিটি সেবা প্রতিটি বস্তুতে মালিকানা যাচাই করে — এর অভাবই BOLA.
- অ্যাপ একটি এলোমেলো code_verifier বানায়, তার SHA-256 hash হলো code_challenge.
- ব্যবহারকারীকে authorization server-এ পাঠায়, challenge-সহ।
- লগইন ও সম্মতির পর redirect-এ একটি অল্পমেয়াদি authorization code.
- অ্যাপ code আর verifier দিয়ে token নেয় — access token (API-র জন্য), আর OIDC-তে ID token (client-এর জন্য)।
- Server verifier-এর hash মিলিয়ে দেখে।
PKCE-এর কাজ: পথে চুরি যাওয়া code, verifier ছাড়া token-এ ভাঙানো যায় না। পুরোনো implicit flow নয়।
Envelope encryption: প্রতিটি ফাইল নিজের DEK দিয়ে encrypt; DEK-কে KMS-এর KEK দিয়ে মুড়ে ফাইলের পাশে রাখা; KEK কখনো KMS-এর বাইরে আসে না। Rotation-এ শুধু ছোট DEK আবার মোড়ানো; ফাঁস হলে ক্ষতি এক ফাইলে সীমিত।
নম্বর কোথায়: পার্থক্য (১), PKCE-র ধাপ (২), envelope (২)। পর্ব ৫২
যেখানে নম্বর কাটে: OAuth 2.0-কে পরিচয় যাচাইয়ের protocol বলা (পরিচয় দেয় OIDC); password encrypt করে রাখা — রাখতে হয় ধীর, salt দেওয়া hash-এ।
৮ · অংশ ছ — Case study ধাঁচের নকশার প্রশ্ন (মডিউল ৯)
লিখিত পরীক্ষায় “নকশা করুন” প্রশ্নে পুরো ইন্টারভিউর মতো আলোচনা হয় না — পরীক্ষক খোঁজেন অনুমান, ছোট হিসাব, আধা পাতার লেবেলসহ ছবি আর দুটি-তিনটি মূল সিদ্ধান্তের যুক্তি। পূর্ণ walkthrough পর্ব ৬৬-এ, বড় হিসাবের অনুশীলন পর্ব ৬২-এ। রিভিশন: পর্ব ৫৪–পর্ব ৬১. সব সেবা কাল্পনিক। Video (পর্ব ৫৯)-এর মূল কথা নিচের ভাইভায় (ভ-৩০); notification (পর্ব ৫৭) আর ride-sharing (পর্ব ৫৮)-এর হিসাব পর্ব ৬৩-এর MCQ-তে।
ছ-০১একটি URL shortener নকশা করুন: ধরা যাক দিনে ১ কোটি নতুন link, পড়া আর লেখার অনুপাত ১০০:১, peak গড়ের ৩ গুণ। Peak QPS হিসাব করুন, ৭ অক্ষরের base62 code কীভাবে বানাবেন, 301 না 302, আর analytics redirect-এর পথ থেকে কেন আলাদা — ছবিসহ লিখুন। — ১০ নম্বর (মাঝারি, ছবিসহ)
পরিধি: লম্বা URL → ছোট code; code → redirect; মেয়াদ; click analytics. NFR: redirect-এর p99 কম, উঁচু availability.
হিসাব: লেখা ১ কোটি ÷ ৮৬,৪০০ ≈ সেকেন্ডে ১১৬, peak ≈ ৩৪৭; পড়া ১০০ কোটি ÷ ৮৬,৪০০ ≈ ১১,৫৭৪, peak ≈ ৩৪,৭২২. চাপ পড়ায়। ৫ বছরে ১,৮২৫ কোটি link; পর্ব ৫৪-এর অনুমানে তিন কপিতে প্রায় ২৭ TB.
API: POST /v1/links → 201 আর code; GET /{code} → 302 আর Location.
ছবি (খাতায়): client → CDN/edge → LB → redirect service → cache → key-value store; লেখার পথে ID generator; redirect service থেকে ড্যাশ তীরে click event → stream → analytics.
Code: (ক) counter বা Snowflake + base62 — collision নেই, কিন্তু code অনুমান করা যায়। (খ) random বা hash-এর ৭ অক্ষর — ৬২৭ ≈ ৩.৫২ লাখ কোটি সম্ভাব্য code, তবু birthday-র অঙ্কে ১ কোটি link-এ গড়ে n² ÷ (২M) ≈ ১৪টি collision — তাই লেখা শর্তসাপেক্ষ (না থাকলে তবেই), collision-এ নতুন code.
301 বনাম 302: 301 browser cache করে — পরের click আর সার্ভারে আসে না; analytics আর খারাপ link বন্ধের ক্ষমতা হারায়। তাই 302 বা 307.
Analytics আলাদা কেন: redirect-এর latency-তে লেখা যোগ না করা; event at-least-once, তাই event id দিয়ে dedup; unique visitor HyperLogLog-এ; analytics ভাঙলেও redirect চলে।
নম্বর কোথায়: পরিধি ও হিসাব (২), API (১), ছবি (২), code ও collision (২), 301/302 (১), analytics ও cache (২)। পর্ব ৫৪ · পর্ব ২৩ · পর্ব ৪৫
যেখানে নম্বর কাটে: “MD5-এর প্রথম ৭ অক্ষর” — collision-এর ব্যবস্থা ছাড়া; 301 লিখে analytics-ও দাবি; সংখ্যা ছাড়া “Kafka, Redis”.
ছ-০২একটি chat সেবায় বার্তার ক্রম, duplicate আর অফলাইন ডিভাইস কীভাবে সামলাবেন? ধরা যাক দিনে ২০০ কোটি বার্তা আর peak গড়ের ৫ গুণ — peak-এ সেকেন্ডে কতটি লেখা? দুই ব্যবহারকারী আলাদা gateway সার্ভারে যুক্ত থাকলে একটি বার্তার পথ sequence আকারে লিখুন। — ১০ নম্বর (কঠিন, ছবিসহ)
হিসাব: ২০০ কোটি ÷ ৮৬,৪০০ ≈ সেকেন্ডে ২৩,১৪৮; peak × ৫ ≈ ১,১৫,৭৪১টি লেখা. ডিভাইসে পৌঁছানো কপি এর বহু গুণ (group আর একাধিক ডিভাইস) — পর্ব ৫৫-এর অনুমানে সেকেন্ডে ১৩ লাখের বেশি।
Sequence (খাতায় চারটি খাড়া রেখা: A-র ফোন, G1, chat service, G2 ও B):
- A-র ফোন বার্তায় নিজের client id দেয় (retry নিরাপদ), WebSocket-এ gateway G1-এ পাঠায়।
- Chat service কথোপকথনের পরের seq (যেমন ১০৪) দিয়ে conversation log-এ একবার লেখে; durable হলে A পায় ack — “sent”.
- Registry দেখে B আছে G2-তে; pub/sub-এ G2-এর channel-এ publish.
- G2 B-র socket-এ পাঠায়; B-র ফোন জানায় delivered_upto = ১০৪.
- B অফলাইন হলে push notification; ফিরলে নিজের cursor (শেষ দেখা seq) থেকে sync.
ক্রম ও duplicate: ক্রম দেয় সার্ভারের প্রতি-কথোপকথন seq, ফোনের ঘড়ি নয়; ফাঁক দেখলে ফোন টেনে আনে। Delivery at-least-once; client id-তে সার্ভার dedup, seq দেখে ফোন duplicate ফেলে — প্রভাব একবার।
ব্যর্থতা ও trade-off: একটি gateway মরলে তার হাজারো client একসাথে ফেরে — backoff, full jitter আর প্রথম চেষ্টাও ছড়ানো; registry-র entry TTL-এ মোছে।
নম্বর কোথায়: হিসাব (১), sequence ও ছবি (৩), ক্রম ও duplicate (৩), অফলাইন (২), ব্যর্থতা (১)। পর্ব ৫৫ · পর্ব ১০ · পর্ব ৩৪
যেখানে নম্বর কাটে: ফোনের ঘড়ি দিয়ে ক্রম; “WebSocket দিলেই delivery নিশ্চিত”; অফলাইন ডিভাইস ভুলে যাওয়া।
ছ-০৩News feed-এ fan-out on write আর fan-out on read-এর তুলনা করুন। ১ কোটি follower-এর একজন লেখক পোস্ট করলে push-এ কতগুলো timeline লেখা, আর fan-out worker-রা মোট সেকেন্ডে ১ লাখ লেখা পারলে কত সময়? Hybrid নকশা লিখুন। — ১০ নম্বর (মাঝারি)
| মাপকাঠি | On write (push) | On read (pull) |
|---|---|---|
| কাজ কখন | পোস্টের সময় প্রত্যেক follower-এর timeline-এ ID বসানো | feed খোলার সময় সবার সাম্প্রতিক পোস্ট টেনে মেলানো |
| পড়া | দ্রুত — একটি তালিকা | ধীর — অনেক উৎস মেলাতে হয় |
| লেখা | follower-সংখ্যার সমান | একটি |
| দুর্বলতা | বিখ্যাত লেখকে বিপুল লেখা; অনুপস্থিতদের জন্য অপচয় | প্রতিটি পড়া ভারী, tail latency |
হিসাব: ১ কোটি timeline লেখা; ১ কোটি ÷ ১ লাখ = ১০০ সেকেন্ড — এই সময়ে অন্যদের পোস্টও সারিতে আটকে থাকে।
Hybrid: follower-এর একটি সীমা (ধরা যাক ১০ হাজার) ছাড়ানো লেখকদের পোস্ট push হয় না; feed খোলার সময় তাঁদের সাম্প্রতিক পোস্ট টেনে এনে নিজের timeline-এর সাথে মেশানো হয়; বাকিদের push. সীমার দাম পড়ার সময়ে, তাই সীমা বাছতে হয় মেপে।
খুঁটিনাটি: timeline-এ শুধু ID, সীমিত দৈর্ঘ্য; লেখা, ছবি আর গণনা আলাদা করে (hydration); অনুপস্থিতদের timeline রাখা হয় না, ফিরলে আবার বানানো; নিজের পোস্ট সাথে সাথে নিজের feed-এ; মোছা আর block পড়ার মুহূর্তে ছাঁকা।
নম্বর কোথায়: টেবিল (৩), হিসাব (২), hybrid (৩), খুঁটিনাটি (২)। পর্ব ৫৬ · পর্ব ৩২
যেখানে নম্বর কাটে: পুরো পোস্ট timeline-এ কপি করা; “push দ্রুত” বলে লম্বা লেজের কথা না তোলা।
ছ-০৪একটি কাল্পনিক বাসের টিকিট বিক্রির সেবায় ঈদের আগের ভিড়ে একই সিট দুজনের কাছে বিক্রি হওয়া কীভাবে ঠেকাবেন? Hold, payment timeout আর ledger-সহ নকশা লিখুন। Database সেকেন্ডে ২,০০০ transaction সামলায় আর প্রতিটি কেনায় ৪টি লাগে — waiting room সেকেন্ডে সর্বোচ্চ কতজনকে ঢোকাবে? — ১০ নম্বর (কঠিন)
Double booking: সত্য এক জায়গায় — seat database-এ শর্তসহ লেখা: UPDATE seats SET status = 'held' … WHERE seat = ? AND status = 'available'; ০ সারি মানে আগেই নেওয়া। বা প্রতি-সিট version কলাম। Redis-lock বা app-এর memory নয় — lock রাখলেও তা শুধু অকারণ চেষ্টা কমায়, সঠিকতা দেয় না।
- Waiting room (edge-এ): স্বাক্ষর-করা token-সহ সারি; ভর্তির হার database-এর সামর্থ্য থেকে — ২,০০০ ÷ ৪ = সেকেন্ডে ৫০০ জন, নিরাপত্তার জন্য আরও কিছু কম।
- Hold: শর্তসহ UPDATE, মেয়াদসহ (ধরা যাক ১০ মিনিট)।
- Payment: idempotency key-সহ; state machine-এ PENDING → SUCCEEDED বা FAILED, আর timeout-এ UNKNOWN — সরাসরি retry নয়, একই key-তে খোঁজ।
- সফল হলে: hold → sold, টিকিট issue (outbox → notification).
- মেয়াদ বা ব্যর্থতায়: hold ছেড়ে দেওয়া — compensation.
- দিনশেষে: payment gateway-এর রিপোর্টের সাথে reconciliation.
Ledger: double-entry — প্রতিটি লেনদেনের লাইনগুলোর যোগফল শূন্য (যাত্রীর হিসাবে −৮০০, কোম্পানির প্রাপ্য হিসাবে +৮০০); entry শুধু যোগ হয়; ভুল শোধরায় উল্টো entry; টাকা পয়সায় পূর্ণসংখ্যা।
Trade-off: hold-এর মেয়াদ ছোট হলে টাকা দেওয়ার মাঝে সিট হারায়; বড় হলে না-কেনা মানুষের hold সিট আটকে রাখে।
নম্বর কোথায়: double booking (৩), প্রবাহ (৩), payment timeout (১), ledger (২), হিসাব (১)। পর্ব ৬০ · পর্ব ২৪ · পর্ব ২৫
যেখানে নম্বর কাটে: “Redis lock দেব”; “autoscaling করব” — database এভাবে বাড়ে না; balance কলাম সরাসরি বদলানো।
ছ-০৫Dynamo-ধাঁচের একটি distributed key-value store-এর মূল অংশগুলো লিখুন। N = ৩, W = ২, R = ২-এ কয়টি বিকল সহ্য হয়? দুটি vector clock {A:2} আর {A:1, B:1}-এর সম্পর্ক কী, store তখন কী করে? Sloppy quorum কী কেনে, কী হারায়? — ১০ নম্বর (কঠিন)
| অংশ | কৌশল | কেন |
|---|---|---|
| Partitioning | consistent hashing + virtual node | node যোগে শুধু নতুন node-এর ন্যায্য অংশ সরে; ভার সমান |
| Replication | N = ৩, preference list-এর পরের তিনটি ভিন্ন node | একটি node হারালেও ডেটা |
| Consistency | প্রতি অনুরোধে R, W বাছাই (QUORUM = ২) | দরকারমতো দ্রুত বা নির্ভুল |
| Versioning | vector clock, sibling | concurrent লেখা হারায় না |
| ক্ষণিকের ব্যর্থতা | sloppy quorum + hinted handoff | লেখা চলতে থাকে |
| স্থায়ী ব্যর্থতা | read repair + Merkle anti-entropy | পেছনে মিলানো |
সহনশীলতা: লেখায় N − W = ১, পড়ায় N − R = ১; একটি বিকলে বাকি দুটিরই অপেক্ষা করতে হয়, তাই p99 বাড়ে (পর্ব ৬১-এর simulator-এ put-এর p99 ৪.৬ থেকে ৬১.৩ ms).
Vector clock: A-ঘরে প্রথমটি বড় (২ > ১), B-ঘরে দ্বিতীয়টি (১ > ০) — কোনোটি অন্যটির সব ঘরে ≥ নয়, তাই concurrent. Store দুটিই sibling হিসেবে রাখে, get দুটিই ফেরত দেয়, client মিলিয়ে নতুন context-সহ put করে (cart-এ union — মোছা জিনিস ফিরে আসতে পারে)। LWW হলে একটি নিঃশব্দে হারাত।
Sloppy quorum: preference list-এর বাইরের node-এর ack W-এ গোনা — লেখার availability কেনে (পর্ব ৬১-এ ৯৩.২৯% থেকে ১০০%), কিন্তু hint পৌঁছানো পর্যন্ত R + W > N-এর overlap হারায় — কিছু stale read. শর্তসাপেক্ষ লেখা বা অনন্যতা লাগলে প্রতি shard-এ Raft.
নম্বর কোথায়: অংশগুলো (৩), সহনশীলতা (১), vector clock ও sibling (৩), sloppy quorum (২), বিকল্প (১)। পর্ব ৬১ · পর্ব ৪১ · পর্ব ৪৬
যেখানে নম্বর কাটে: “একটি তৈরি NoSQL নিন” বলে অংশের নাম না দেওয়া; LWW-কে নিরাপদ default বলা।
৯ · ভাইভা — মুখে উত্তরের কৌশল, নমুনা ভাইভা আর মডিউলভিত্তিক কুইকফায়ার
ভাইভায় পরীক্ষক আপনার উত্তর শুনেই পরের প্রশ্ন বানান (follow-up প্রশ্ন); তাই প্রথম উত্তর এমনভাবে দিন, যাতে পরের প্রশ্ন আপনার চেনা পথে আসে।
তিন বাক্যের কাঠামো
“Circuit breaker কী?” — “বারবার ব্যর্থ হওয়া একটি dependency-কে কিছুক্ষণ ডাকা বন্ধ রাখার সুইচ (কী)। ব্যর্থতার হার সীমা ছাড়ালে open হয়, সব call সাথে সাথে fallback পায়, আর cooldown-এর পরে half-open-এ কয়েকটি পরীক্ষা চলে (কীভাবে)। সীমা খুব নিচু হলে ক্ষণিকের ঝাঁকুনিতেই সেবা বন্ধ হয় (দাম)।” তৃতীয় বাক্যটিই পরের প্রশ্নের দরজা খোলে।
দুটি অভ্যাস যা নম্বর এনে দেয়
- সংখ্যায় কথা বলুন: “দ্রুত” নয়, “cache-এ প্রায় ১ ms, database-এ ১০ ms”; “বেশি” নয়, “৪ থেকে ৫ সার্ভারে ৮০% key সরে”। হিসাবের পথ মুখে বলুন — ছোট ভুলেও পদ্ধতির নম্বর থাকে।
- Trade-off নিজে থেকেই বলুন: প্রতিটি “হ্যাঁ”-র পরে “কিন্তু দাম হলো…”। পরীক্ষক ঠিক এটিই শুনতে চান।
যে প্রশ্নের উত্তর জানেন না — সৎভাবে সামলানো
- স্বীকার করুন: “পুরো নিশ্চিত নই” বলা দুর্বলতা নয়; ভুল কথা জোর দিয়ে বললে বাকি উত্তরেও সন্দেহ জাগে।
- বানাবেন না: কোনো product-এর সীমা, দাম বা সংস্করণ মনে না থাকলে তা বলুন, আর যাচাইয়ের পথ (official documentation, ছোট load test) জানান।
একটি নমুনা ভাইভা — follow-up কীভাবে গভীরে নামে
একটি কাল্পনিক ভাইভা, replication দিয়ে শুরু — প্রতিটি উত্তরের শেষ অংশ থেকেই পরের প্রশ্ন আসে।
| পরীক্ষক | |
| প্রার্থী (মূল কথা) | |
| কেন ভালো উত্তর | |
| জোড়া পর্ব |
- শুরু। চার লাভ আর একটি সীমা — “লেখা বাড়ে না”।
- দুই দিকের দাম। প্রতিটির দাম, আর মাঝামাঝি পথের নাম।
- উপসর্গ থেকে কারণ। replication lag, তারপর প্রতিকার।
- ধাপ গুনে বলা। নিজে থেকে split-brain-এর ঝুঁকি তোলা।
- মডিউল বদল। replication থেকে consensus.
- শেষ ধাপ। fencing token, আর যাচাই করে storage.
ভাইভা কুইকফায়ার — দ্রুত প্রশ্ন, ছোট উত্তর
জোরে উত্তর বলুন, তারপর প্রশ্নে চেপে মেলান — প্রতিটিতে ৩০–৬০ সেকেন্ডের বেশি নয়। “তারপর পরীক্ষক জিজ্ঞেস করতে পারেন…” লাইনে সম্ভাব্য পরের প্রশ্ন আর তার এক লাইনের উত্তর।
মডিউল ১ — ভিত্তি (পর্ব ০১–০৬)
ভ-০১High-level design আর low-level design-এর পার্থক্য কী? (সহজ)
High-level design পুরো সেবার উপাদান, তাদের সংযোগ, ডেটার পথ আর ব্যর্থতায় আচরণ ঠিক করে; low-level design একটি সার্ভিসের ভেতরের class, interface আর pattern. এই কোর্স প্রথমটি নিয়ে।
তারপর পরীক্ষক জিজ্ঞেস করতে পারেন… কোনটি আগে? — high-level; কোন সেবা কোন ডেটার মালিক না জেনে class বানানো অর্থহীন। পর্ব ০১
ভ-০২গড় latency-র বদলে p99 কেন দেখা হয়? (সহজ)
ভ-০৩একটি নকশার প্রশ্নে কোন ক্রমে এগোবেন? (সহজ)
আট ধাপ: পরিধি ও requirement, হিসাব, API, data model, high-level design, deep dive, failure ও trade-off, wrap-up — দরকারে পেছনে ফিরে।
তারপর পরীক্ষক জিজ্ঞেস করতে পারেন… হিসাব কেন API-র আগে? — সংখ্যাই বলে চাপ কোথায় (পড়া না লেখা), তাই কোন অংশে গভীরে যাবেন। পর্ব ০৬
মডিউল ২ — যোগাযোগ আর API (পর্ব ০৭–১২)
ভ-০৪নতুন HTTPS সংযোগে প্রথম উত্তর পেতে কত round trip লাগে? (মাঝারি)
TCP ১ + TLS 1.3 ১ + অনুরোধ ১ = ৩ RTT (TLS 1.2-এ ৪, QUIC-এ ২); DNS আলাদা। RTT ১৫০ ms হলে শুধু এতেই প্রায় ৪৫০ ms.
তারপর পরীক্ষক জিজ্ঞেস করতে পারেন… কমাবেন কীভাবে? — keep-alive আর connection pool, HTTP/2-এর multiplexing, কাছের edge — আলোর গতি কোডে কমে না। পর্ব ০৭
ভ-০৫API gateway আর load balancer কি একই? (সহজ)
Load balancer মূলত ভার ভাগ করে; API gateway L7-এ API-র নীতি প্রয়োগ করে — token যাচাই, quota, transformation, version routing. একই software দুটো কাজই পারে।
তারপর পরীক্ষক জিজ্ঞেস করতে পারেন… gateway নিজেই SPOF হলে? — কয়েকটি stateless instance, কয়েকটি zone, সামনে L4 LB বা anycast. পর্ব ১১
ভ-০৬REST, gRPC আর GraphQL — কখন কোনটি? (মাঝারি)
পাবলিক আর HTTP caching-নির্ভর API-তে REST; ভেতরের দ্রুত, টাইপ-করা call আর streaming-এ gRPC; বহু ক্লায়েন্টের ভিন্ন ভিন্ন ডেটা চাহিদায় GraphQL বা BFF.
তারপর পরীক্ষক জিজ্ঞেস করতে পারেন… GraphQL-এ N+1 কী? — প্রতিটি parent-এর জন্য child-এর আলাদা query; key জমিয়ে এক batch-এ আনা (DataLoader-ধাঁচ)। পর্ব ০৯
ভ-০৭JSON API-তে 64-bit ID কেন string হিসেবে পাঠানো ভালো? (মাঝারি)
JavaScript-এর number একটি double; ২৫৩-এর ওপরে সব পূর্ণসংখ্যা হুবহু রাখতে পারে না, তাই Snowflake-ধাঁচের ID নিঃশব্দে বদলে যায়।
তারপর পরীক্ষক জিজ্ঞেস করতে পারেন… Protobuf-এ মুছে ফেলা field number আবার ব্যবহার করা যায় না কেন? — পুরোনো ডেটা আর পুরোনো কোড সেটিকে আগের অর্থে পড়বে; reserved দিয়ে আটকান। পর্ব ১২
মডিউল ৩ — Scaling (পর্ব ১৩–১৮)
ভ-০৮Vertical আর horizontal scaling-এর পার্থক্য? (সহজ)
Vertical মানে বড় যন্ত্র — সহজ, কিন্তু ছাদ, দামের বাঁক আর single point of failure; horizontal মানে বেশি যন্ত্র — লাগে load balancer, stateless নকশা আর সমন্বয়।
তারপর পরীক্ষক জিজ্ঞেস করতে পারেন… ৫% কাজ serial হলে সর্বোচ্চ কত গুণ? — Amdahl-এ ১ ÷ ০.০৫ = ২০ গুণ, যত যন্ত্রই দিন। পর্ব ১৩
ভ-০৯CDN-এর hit ratio ৯০% থেকে ৯৯% হলে origin-এর চাপ কত কমে? (মাঝারি)
চাপ = R(১ − h); miss ০.১ থেকে ০.০১ — দশ গুণ কম। প্রতিটি বাড়তি “নয়” আবার দশ গুণ।
তারপর পরীক্ষক জিজ্ঞেস করতে পারেন… তাহলে CDN বিকল হলে? — ৯৯% hit-এর সাইটে origin-এ হঠাৎ ১০০ গুণ চাপ; তাই origin shield, request collapsing আর origin-এর সামনে সীমা। পর্ব ১৭
ভ-১০gRPC সার্ভিসে নতুন pod যোগ করেও সেটি ভার পাচ্ছে না — কেন? (কঠিন)
মডিউল ৪ — ডেটা স্টোরেজ (পর্ব ১৯–২৭)
ভ-১১ACID-এর C আর CAP-এর C কি এক? (সহজ)
না। ACID-এর C মানে অ্যাপের নিয়ম আর constraint রক্ষা (“balance শূন্যের নিচে নয়”); CAP-এর C মানে linearizability — সব কপি মিলে যেন একটিই কপি।
তারপর পরীক্ষক জিজ্ঞেস করতে পারেন… ACID-এর I আর CAP-এর C-র সম্পর্ক? — I বহু object-এর transaction-এর ক্রম (serializability), CAP-এর C একটি object-এর বাস্তব সময়ের ক্রম; দুটি মিলে strict serializability. পর্ব ২৪ · পর্ব ৪০
ভ-১২Replication আর partitioning-এর পার্থক্য এক লাইনে? (সহজ)
ভ-১৩Inverted index কী, B-tree index থেকে কোথায় আলাদা? (মাঝারি)
Inverted index হলো শব্দ → ডকুমেন্টের সাজানো তালিকা; লেখার মাঝের শব্দেও দ্রুত খোঁজে আর ranking (BM25) করা যায়। B-tree পুরো মান বা তার শুরু দিয়ে খোঁজে।
তারপর পরীক্ষক জিজ্ঞেস করতে পারেন… LIKE '%x%' কেন সার্চ নয়? — প্রতিটি খোঁজে সব সারি পড়ে, শব্দ বোঝে না, আর কোনটি বেশি মানানসই জানে না। পর্ব ২৭
ভ-১৪Snapshot isolation কোন anomaly ঠেকায় না? (কঠিন)
Write skew — দুটি transaction একই শর্ত পড়ে আলাদা সারি লেখে, যেমন দুজন on-call ডাক্তারই ছুটি নেন। Snapshot isolation শুধু একই সারিতে দুজনের লেখা দেখে।
তারপর পরীক্ষক জিজ্ঞেস করতে পারেন… ঠেকাবেন কীভাবে? — SERIALIZABLE (SSI), শর্তের সারিতে SELECT … FOR UPDATE, বা সংঘাতকে একটি সারিতে আনা। পর্ব ২৪
মডিউল ৫ — Caching (পর্ব ২৮–৩০)
ভ-১৫Write-behind cache-এ ঝুঁকি কী, তবু কোথায় চলে? (মাঝারি)
লেখা আগে cache-এ, পরে batch-এ database-এ; flush-এর আগে cache বিকল হলে সেই লেখা হারায় — ক্ষতির জানালা flush-এর ব্যবধান। View count বা like-এর মতো counter-এ চলে, টাকায় নয়।
তারপর পরীক্ষক জিজ্ঞেস করতে পারেন… ক্ষতি কমাবেন কীভাবে? — ছোট flush ব্যবধান, cache-এ replica বা append-only log. পর্ব ২৮
ভ-১৬কয়েক স্তরের cache-এ (browser → CDN → app-এর L1 → Redis) সবচেয়ে খারাপ staleness কত? (মাঝারি)
Invalidation না থাকলে সব স্তরের TTL-এর যোগফল — প্রতিটি স্তর আগের স্তরের পুরোনো কপি আবার নিজের পুরো TTL ধরে রাখতে পারে।
তারপর পরীক্ষক জিজ্ঞেস করতে পারেন… কমাবেন কীভাবে? — L1-এ pub/sub দিয়ে invalidation আর ছোট TTL; TTL থাকে নিরাপত্তা-জাল হিসেবে। পর্ব ৩০
মডিউল ৬ — Messaging আর stream (পর্ব ৩১–৩৭)
ভ-১৭Visibility timeout কী, ছোট রাখলে কী হয়? (মাঝারি)
ভ-১৮Poison message আর dead letter queue কী? (সহজ)
যে বার্তা বারবার ব্যর্থ হয়, সে poison message; সর্বোচ্চ receive count (যেমন ৩) পেরোলে তাকে DLQ-তে আলাদা করা হয়, যাতে বাকিরা আটকে না থাকে।
তারপর পরীক্ষক জিজ্ঞেস করতে পারেন… DLQ-তে গেলে তারপর? — alert, কারণ ঠিক করে আবার পাঠানো (redrive); alert না থাকলে DLQ একটি কবরস্থান। পর্ব ৩১
ভ-১৯Log compaction কী, কোথায় লাগে? (মাঝারি)
Log compaction-এ log প্রতিটি key-এর শুধু শেষ মান রাখে, offset বদলায় না; CDC বা একটি টেবিলের অবস্থা নতুন consumer-কে শুরু থেকে ফেরাতে কাজে লাগে।
তারপর পরীক্ষক জিজ্ঞেস করতে পারেন… acks=all কি একাই যথেষ্ট? — না; replication factor ৩ আর min.insync.replicas ≥ ২ সাথে লাগে, নইলে ISR ছোট হয়ে একটি কপিতেই “OK”. পর্ব ৩৩
ভ-২০Choreography আর orchestration — কখন কোনটি? (মাঝারি)
মডিউল ৭ — Distributed systems-এর তত্ত্ব (পর্ব ৩৮–৪৬)
ভ-২১FLP কী বলে? (কঠিন)
পুরোপুরি asynchronous model-এ একটি process-ও crash করতে পারলে কোনো deterministic consensus algorithm সব ক্ষেত্রে শেষ হওয়ার নিশ্চয়তা দিতে পারে না (FLP — Fischer, Lynch ও Paterson, ১৯৮৫)।
তারপর পরীক্ষক জিজ্ঞেস করতে পারেন… তাহলে Raft চলে কীভাবে? — safety সবসময় রাখে; liveness পায় partial synchrony আর randomized timeout-এ। পর্ব ৩৮ · পর্ব ৪২
ভ-২২Split-brain কী? (সহজ)
ভ-২৩Timeout বা latency মাপতে কোন ঘড়ি ব্যবহার করবেন? (মাঝারি)
Monotonic clock; wall clock NTP-র সংশোধনে বা leap second-এ পেছাতে বা লাফাতে পারে, তাতে সময়কাল ঋণাত্মকও দেখাতে পারে।
তারপর পরীক্ষক জিজ্ঞেস করতে পারেন… Spanner commit-wait কেন করে? — TrueTime-এর অনিশ্চয়তার সীমা পার হওয়া পর্যন্ত অপেক্ষা, যাতে timestamp-এর ক্রম বাস্তব সময়ের ক্রম মানে। পর্ব ৩৯
ভ-২৪কয়েকটি সার্ভারের HyperLogLog থেকে মোট আলাদা ব্যবহারকারী কীভাবে বের করবেন? (কঠিন)
একই p আর একই hash-এর sketch-গুলোর register ঘর ধরে max, তারপর একবার গণনা; আলাদা অনুমান যোগ করা চলে না — একই মানুষ দুবার গোনা হয়। m = ১৬,৩৮৪-এ ভুল প্রায় ০.৮১%, memory প্রায় ১২ KB.
তারপর পরীক্ষক জিজ্ঞেস করতে পারেন… Count-min sketch কেন কখনো কম দেখায় না? — প্রতিটি ঘরে আসল গণনা আর collision, শুধু যোগ হয়; সর্বনিম্নও তাই আসলের সমান বা বেশি। পর্ব ৪৫
ভ-২৫G-Counter CRDT-তে merge কেন max, যোগ নয়? (কঠিন)
প্রতিটি replica-র ঘর শুধু বাড়ে; max সবচেয়ে নতুন মান দেয়, আর একই অবস্থা দুবার মেলালেও ফল একই (idempotent). যোগ করলে duplicate দুবার গোনা হয়। {A:3, B:1} আর {A:2, B:4} মিলে {A:3, B:4}, মোট ৭.
তারপর পরীক্ষক জিজ্ঞেস করতে পারেন… CRDT দিয়ে ব্যাংক ব্যালান্স রাখবেন? — শুধু CRDT নয়; “শূন্যের নিচে নয়” রক্ষায় coordination লাগে। পর্ব ৪৬
মডিউল ৮ — Architecture, reliability আর operations (পর্ব ৪৭–৫৩)
ভ-২৬Liveness probe-এ database যাচাই কেন ভুল? (মাঝারি)
ভ-২৭Deploy আর release-এর পার্থক্য কী? (সহজ)
Deploy মানে কোড সার্ভারে পৌঁছানো, release মানে ব্যবহারকারীর জন্য feature খোলা; feature flag দুটিকে আলাদা করে আর এক ক্লিকে বন্ধের সুইচ দেয়।
তারপর পরীক্ষক জিজ্ঞেস করতে পারেন… image tag-এর বদলে digest কেন? — tag সরানো যায়, digest বিষয়বস্তুর hash; সব যন্ত্রে আর rollback-এ ঠিক একই bytes. পর্ব ৫৩
ভ-২৮Metric-এ user_id label রাখা যায় না কেন? (মাঝারি)
প্রতিটি মান একটি নতুন time series — cardinality বিস্ফোরণ, memory আর খরচ লাফিয়ে বাড়ে; user_id log বা trace-এর attribute.
তারপর পরীক্ষক জিজ্ঞেস করতে পারেন… head আর tail sampling? — শুরুতেই এলোমেলো বাছাই (সস্তা, বিরল error হারায়) বনাম trace শেষে বাছাই (error রাখে, কিন্তু trace id ধরে collector-এ routing লাগে)। পর্ব ৫০
মডিউল ৯ — Case study (পর্ব ৫৪–৬১)
ভ-২৯URL shortener-এ 301 না 302? (সহজ)
301 স্থায়ী — browser cache করে, পরের click আর সার্ভারে আসে না; analytics আর খারাপ link বন্ধের ক্ষমতা হারায়। তাই সাধারণত 302 বা 307.
তারপর পরীক্ষক জিজ্ঞেস করতে পারেন… ৭ অক্ষরের random code-এ collision কত? — ৬২৭ ≈ ৩.৫২ লাখ কোটি, তবু ১ কোটি link-এ গড়ে প্রায় ১৪টি; তাই শর্তসাপেক্ষ লেখা। পর্ব ৫৪
ভ-৩০Video streaming-এ পুরো MP4 না পাঠিয়ে segment আর manifest কেন? (মাঝারি)
কয়েক সেকেন্ডের ছোট segment CDN-এ cache হয়, দেখা দ্রুত শুরু হয়, আর player গতি দেখে মাঝপথে মান বদলাতে পারে (adaptive bitrate).
তারপর পরীক্ষক জিজ্ঞেস করতে পারেন… transcoding সমান্তরাল কীভাবে? — keyframe-এ টুকরো, প্রতিটি টুকরো প্রতিটি মানে আলাদা কাজ — একটি DAG, প্রতিটি কাজ idempotent. পর্ব ৫৯
ভ-৩১যেকোনো case study-তে পরীক্ষক “এটি দশ গুণ বড় হলে?” জিজ্ঞেস করলে কীভাবে উত্তর দেবেন? (মাঝারি)
আগে সংখ্যাগুলো দশ গুণ করে দেখুন কোন স্তর প্রথম ভাঙে — সাধারণত database-এর লেখা বা একটি hot key; তারপর শুধু সেই স্তরে বদল (sharding, cache, async) — সব একসাথে নয়।
তারপর পরীক্ষক জিজ্ঞেস করতে পারেন… আর একশো গুণ? — একাধিক region, cell-ভিত্তিক ভাগ, আর কোন ডেটায় শক্ত consistency সত্যিই লাগে তা নতুন করে বাছাই। পর্ব ০৬ · পর্ব ০১
১০ · যেসব ভুলে নম্বর কাটে — আর AI-কে কড়া পরীক্ষক বানান
প্রতিটি প্রশ্নের নিচে “যেখানে নম্বর কাটে” আছে; সব অংশে ঘুরে ঘুরে আসা ভুলগুলো এক জায়গায় — জমা দেওয়ার আগের দশ মিনিটে মিলিয়ে নিন।
| ভুল | সঠিক | পর্ব |
|---|---|---|
| প্রযুক্তির নামের তালিকা, সংখ্যা ছাড়া | আগে হিসাব — চাপ কোথায়; তারপর অংশ, ভূমিকা আর বিকল্প | ০৬ |
| NFR-এ “দ্রুত”, “scalable” | মাপা যায় এমন: “p99 < ৫০০ ms” | ০২ |
| bit আর byte, দিন আর সেকেন্ড গুলিয়ে ফেলা; peak ভুলে যাওয়া | প্রথা প্রথম লাইনে; একক সহ প্রতিটি ধাপ | ০৩ |
| ACID-এর C আর CAP-এর C এক বলা; CAP-কে “তিনের দুই” | invariant বনাম linearizability; partition হলে C না A | ২৪, ৪০ |
| “Exactly-once delivery”, “R + W > N মানেই linearizable” | effectively-once; quorum-এর ব্যতিক্রমগুলো বলা | ৩৪, ৪১ |
| Trade-off বা ব্যর্থতার কোনো কথা নেই | প্রতিটি সিদ্ধান্তের দাম, আর কোন অংশ বিকল হলে কী | সব |
| ছবিতে লেবেল, তীরের নম্বর বা legend নেই | নাম + ভূমিকা, ক্রমিক নম্বর, sync আর async আলাদা দাগ | অংশ ১ |
এবার AI. AI-কে উত্তরদাতা নয়, পরীক্ষক বানান: নিজে লিখে নম্বর দিতে বলুন, follow-up-এর উত্তর মুখে দিন। তবে এই বিষয়ে AI-এর সাধারণ ভুলগুলো নিচের টেবিলে — সাথে ছোট সমস্যায় অকারণ বড় নকশা।
একটি prompt, যা AI-কে কড়া পরীক্ষক বানায় আর নিজের হিসাব দেখাতে বাধ্য করে:
System design নিয়ে AI-এর উত্তরে যেসব ভুল প্রায়ই থাকে
| ভুল | ফল | কীভাবে ধরবেন |
|---|---|---|
| সংখ্যা ছাড়া প্রযুক্তির তালিকা | নকশার যুক্তি নেই, নম্বর নেই (ছ-০১) | জিজ্ঞেস করুন: peak QPS কত, কোন স্তরে প্রথম চাপ? |
| হিসাবে × ১,০০০ বা × ৮ হারানো | সার্ভার বা storage হাজার বা আট গুণ ভুল | প্রতিটি ধাপ একক সহ নিজে আবার গুনুন, বা ছোট script-এ |
| Quorum বা Raft-এর সহনশীলতা ভুল | “৪ node ২টি সয়” (ঙ-০৫) | W + R − N আর ২f + ১ নিজে বসান |
| ACID আর CAP-এর consistency মেশানো | ভুল সংজ্ঞা, ভুল তুলনা (ভ-১১) | প্রতিটি “consistency”-র অর্থ লিখিয়ে নিন |
| Product-এর সীমা বা দাম বানানো | ভুল তথ্য মুখস্থ | official documentation; “লেখার সময়ে” বলে hedge |
| ব্যর্থতার কথা নেই | trade-off-এর নম্বর হারানো | প্রতিটি বাক্সে জিজ্ঞেস করুন: এটি মরলে কী হয়? |
AI-এর উত্তর মেনে নেওয়ার আগে — চেকলিস্ট
নিজেকে যাচাই করুন
প্রথমে একটি ক্রম সাজানোর প্রশ্ন, তারপর লিখিত আর ভাইভার মূল তথ্য নিয়ে বারোটি MCQ. ভুল হলে কারণসহ ব্যাখ্যা পাবেন।
ক্রমএকটি ১০ নম্বরের “নকশা করুন” উত্তরের অংশগুলো ঠিক ক্রমে সাজান (▲▼ চেপে সরান)
- পরিধি আর অনুমান লেখা
- ছোট হিসাব — peak QPS, storage
- API আর data model
- লেবেলসহ architecture diagram
- দুটি অংশে deep dive
- ব্যর্থতা, trade-off আর উপসংহার
(সহজ) একটি সেবার availability ৯৯.৯৯%. ৩৬৫ দিনের এক বছরে সর্বোচ্চ downtime প্রায় কত?
- প্রায় ৫২.৬ মিনিট
- প্রায় ৮ ঘণ্টা ৪৫ মিনিট
- প্রায় ৫.২৬ মিনিট
- প্রায় ৪.৩২ মিনিট
(মাঝারি) একটি অনুরোধ ৫০টি backend-এর সবার উত্তরের অপেক্ষা করে; প্রতিটি backend স্বাধীনভাবে ১% সময় ধীর। প্রায় কত শতাংশ অনুরোধ অন্তত একটি ধীর উত্তরে আটকায়?
- ৫০%
- প্রায় ৩৯.৫%
- ১%
- প্রায় ৬৩.৪%
(সহজ) একটি সেবায় সেকেন্ডে ২,০০০ অনুরোধ আসে, প্রতিটির গড় সময় ১৫০ ms. গড়ে কতগুলো অনুরোধ একসাথে চলছে?
- ৩,০০,০০০
- প্রায় ১৩.৩
- ৩০০
- ২,১৫০
(সহজ) ১ কোটি key hash(key) mod N দিয়ে ৪টি সার্ভারে ভাগ করা। ৫ম সার্ভার যোগ করলে মোটামুটি কতগুলো key-এর সার্ভার বদলায়?
- প্রায় ২০ লাখ
- প্রায় ২৫ লাখ
- একটিও নয়
- প্রায় ৮০ লাখ
(মাঝারি) একটি leaderless store-এ N = ৫, W = ৩, R = ৩. লেখা আর পড়া প্রত্যেকে সর্বোচ্চ কয়টি বিকল replica সহ্য করে, আর লেখা ও পড়ার দলের ন্যূনতম overlap কত?
- ২ আর ২, overlap ১
- ৩ আর ৩, overlap ১
- ২ আর ২, overlap ০
- ১ আর ১, overlap ১
(মাঝারি) ৫টি সার্ভারের একটি Raft cluster network partition-এ ৩ আর ২-এ ভাগ হলো; পুরোনো leader ২-এর দিকে। কী ঘটে?
- দুই দিকই লেখা commit করে, পরে মিলিয়ে নেয়
- ৩-এর দিকে নতুন leader বাছাই হয়ে কাজ চলে; ২-এর দিকে কিছুই commit হয় না
- জোড়া লাগা পর্যন্ত পুরো cluster থেমে থাকে
- ২-এর দিকের পুরোনো leader-ই চালিয়ে যায়, কারণ তার log সবচেয়ে নতুন
(মাঝারি) ১ কোটি key-এর জন্য ১% false-positive হারের Bloom filter-এ সেরা নকশায় মোটামুটি কত memory আর কয়টি hash লাগে?
- প্রায় ৯৬ MB, ৭টি hash
- প্রায় ১২ MB, ১টি hash
- প্রায় ১২ MB, ৭টি hash
- প্রায় ১৮ MB, ১০টি hash
(সহজ) ৩০ দিনের জানালায় ৯৯.৯৫% availability SLO-তে error budget কত মিনিট?
- ৪৩.২ মিনিট
- ৪.৩২ মিনিট
- ২৬২.৮ মিনিট
- ২১.৬ মিনিট
(মাঝারি) একটি token bucket-এ refill r = সেকেন্ডে ১০টি token, ধারণক্ষমতা b = ৫০, শুরুতে বালতি ভরা। যেকোনো ১০ সেকেন্ডে সর্বোচ্চ কতটি অনুরোধ ছাড়া পায়?
- ১৫০
- ১০০
- ৫০
- ৫০০
(মাঝারি) Snapshot isolation (যেমন PostgreSQL-এর REPEATABLE READ) কোন anomaly ঠেকায় না?
- Dirty read
- Write skew
- Read skew
- Lost update
(সহজ) একটি consumer প্রতিটি বার্তা প্রক্রিয়া করার আগেই offset commit করে। Crash হলে কোন নিশ্চয়তা মেলে?
- Exactly-once
- At-least-once
- At-most-once
- কোনো বার্তা হারায় না, শুধু ক্রম বদলায়
(মাঝারি) “একটি URL shortener নকশা করুন” — ১০ নম্বরের লিখিত উত্তরে কোনটি পূর্ণ নম্বরের সবচেয়ে কাছে?
- Kafka, Redis আর microservices-এর একটি বড় ছবি, কোনো সংখ্যা ছাড়া
- MD5-এর প্রথম ৭ অক্ষর, 301 redirect, প্রতিটি click-এ database-এ counter
- নিখুঁত হিসাব আর API, কিন্তু ছবি বা ব্যর্থতার কোনো কথা নেই
- হিসাব (peak প্রায় ৩৫ হাজার পড়া), API, লেবেলসহ ছবি, collision-সহ code, 302-এর কারণ আর async analytics
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব শব্দ এখানে একসাথে:
মনে রাখুন
- কাঠামোয় নম্বর: সংজ্ঞা → কীভাবে কাজ করে → ছবি বা টেবিল → সংখ্যা বা উদাহরণ → trade-off ও ব্যর্থতা → উপসংহার; ২ নম্বরে দুই–তিন বাক্য, ৫ নম্বরে একটি ছবি বা টেবিল, ১০ নম্বরে দুটি আর একটি হিসাব।
- ছবিতে প্রথা: ওপর থেকে নিচে অনুরোধের পথ, database সিলিন্ডার, বাক্সে নাম আর ভূমিকা, তীরে ক্রমিক নম্বর, sync কঠিন আর async ড্যাশ দাগ, নিচে legend.
- সংখ্যায় অনুমান আর একক: ১ দিন = ৮৬,৪০০ সেকেন্ড, bit না byte, গড় না peak — প্রশ্নে বা উত্তরের প্রথম লাইনে লিখে দিন; সূত্র → মান → একক → মানে।
- Trade-off ছাড়া পূর্ণ নম্বর নেই: প্রতিটি সিদ্ধান্তের দাম, কখন বেছে নেবেন না, আর কোনো অংশ বিকল হলে কী — আর ACID-এর C বনাম CAP-এর C-র মতো সংজ্ঞার পার্থক্য স্পষ্ট।
- ভাইভায়: তিন বাক্য — কী, কেন বা কীভাবে, দাম; সংখ্যায় কথা, trade-off নিজে থেকে, আর না জানলে সৎ থেকে যাচাইয়ের পথ বলা।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ৬৫ · System design ইন্টারভিউর ধারণাভিত্তিক প্রশ্ন — trade-off আর follow-upপরবর্তী পর্বএকই বিষয়, ইন্টারভিউর ধাঁচে।
- পর্ব ৬২ · Estimation আর trade-off-এর অনুশীলন — পূর্ণ সমাধানসহ হিসাবএকই মডিউললম্বা হিসাবের পূর্ণ সমাধান।
- পর্ব ৬৩ · MCQ প্রশ্নব্যাংক — system designএকই মডিউলপুরো কোর্সের MCQ.
- পর্ব ৬৬ · Mock interview — web crawler, leaderboard, pastebin আর আরও নকশা, পূর্ণ walkthroughএকই মডিউলনকশার প্রশ্নের পূর্ণ আলোচনা।
- পর্ব ৪০ · CAP, PACELC আর consistency model — linearizable থেকে eventualফিরে দেখুনসবচেয়ে বেশি আসা দীর্ঘ প্রশ্নের একটির ভিত্তি।
- সিস্টেম ডিজাইন · কোর্স হোম৬৬টি পর্বপুরো কোর্সের রোডম্যাপ — ১০টি মডিউল।
- DBMS ও SQL · লিখিত ও ভাইভা প্রশ্নসম্পর্কিত কোর্সtransaction, index আর normalization-এর database-দিকের মডেল উত্তর।
- কম্পিউটার নেটওয়ার্ক · লিখিত ও ভাইভা প্রশ্নসম্পর্কিত কোর্সTCP, DNS, HTTP আর CDN-এর মডেল উত্তর।
- অপারেটিং সিস্টেম · লিখিত ও ভাইভা প্রশ্নসম্পর্কিত কোর্সprocess, concurrency আর file system-এর মডেল উত্তর।