Distributed cache ডিজাইন
একটি cache server যথেষ্ট না হলে অনেকগুলো লাগে। Partitioning, replication, eviction ও ব্যর্থতার আচরণ ডিজাইন করি।

লক্ষ্য: একটি দ্রুত, shared cache যা এক মেশিনের চেয়ে বেশি data রাখে ও বেশি request সামলায়, আর node ব্যর্থ হলে শালীনভাবে আচরণ করে।
Requirement
- খুব কম latency (সাব-মিলিসেকেন্ড থেকে কয়েক ms)।
- অনেক node-এ scale; কম ব্যাঘাতে node যোগ-বিয়োগ।
- যুক্তিসঙ্গত eviction সহ গরম data memory-তে রাখা।
- Node ব্যর্থ হলেও database ডুবিয়ে না দেওয়া।
Partitioning
Key-গুলো node-দের মধ্যে ভাগ করুন। সাধারণ hash(key) mod N N বদলালে প্রায় সবকিছু ঘেঁটে দেয়, তাই consistent hashing (virtual node সহ) বা নির্দিষ্ট hash slot (Redis Cluster যেমন ১৬,৩৮৪ slot node-দের ম্যাপ করে) ব্যবহার করুন।
Routing কোথায় হয়
- Smart client: client library নকশা জানে এবং সরাসরি ঠিক node-এ যায়।
- Proxy: client proxy-র সাথে কথা বলে, সে route করে। সহজ client, বাড়তি এক hop।
- Server redirect: node client-কে অন্য node-কে জিজ্ঞেস করতে বলে (Redis Cluster ধাঁচ)।
Replication ও availability
প্রতিটি partition-এর একটি replica রাখুন। Primary মরলে replica-কে promote করুন। নিছক cache-এ data হারানোও মেনে নেওয়া যায়: database-এ সত্য আছে, আর হারানো key পরের read-এ আবার ভরে। ঝুঁকি হলো হঠাৎ miss-এর ঢেউ database-এ আঘাত করা।
Eviction
Memory সীমিত: LRU, LFU বা random eviction সাথে TTL। Memory সীমা ও যুক্তিসঙ্গত policy রাখুন যাতে cache অনির্দিষ্ট বাড়ে না।
Database-এর সাথে consistency
সাধারণত cache-aside: cache থেকে পড়ুন, miss হলে database পড়ে cache ভরুন। আপডেটে আগে database লিখুন, তারপর cache key মুছুন। আপডেটের চেয়ে মোছা নিরাপদ, কারণ race-এ পুরোনো মান দিয়ে overwrite এড়ানো যায়।
যে সমস্যাগুলোর জন্য ডিজাইন করতে হবে
- Hot key: একটি খুব জনপ্রিয় key তার node-কে ডুবায়। অনেক node-এ replicate করুন, সামনে ছোট local in-process cache রাখুন, বা কয়েকটি key-তে ভাগ করুন।
- Cache stampede: মেয়াদ-শেষ key অনেক request একসাথে পুনর্নির্মাণ করে। Lock দিন যাতে একজন ভরে, TTL-এ jitter, আর আগে-ভাগে refresh।
- Cache penetration: যে key-ই নেই তার request সবসময় miss করে। ছোট সময়ের "পাওয়া যায়নি" চিহ্ন cache করুন বা Bloom filter ব্যবহার করুন।
- Cache avalanche: অনেক key একসাথে মেয়াদ শেষ হয়। TTL-এ random jitter দিন।
- Node হারানো: consistent hashing-এ শুধু key-র একটি অংশ হারায়, কিন্তু rate limit ও request coalescing দিয়ে database বাঁচান।
পরিচালনা
Hit হার, memory ব্যবহার, eviction, latency ও network দেখুন। Hit হার কমা আগাম সতর্কতা।
মূল কথা: consistent hashing বা hash slot দিয়ে partition, availability-র জন্য replicate, LRU ও TTL দিয়ে evict, এবং hot key ও stampede-র জন্য স্পষ্টভাবে ডিজাইন করুন।
System Design সিরিজ, পর্ব ৪ (infrastructure ডিজাইন): 2 নম্বর (মোট 4)। আগের লেখা: Distributed unique ID generator ডিজাইন (Snowflake).


