Distributed cache ডিজাইন

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

key ভাগ করে নেওয়া কয়েকটি cache node

লক্ষ্য: একটি দ্রুত, 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).

আরও পড়ুন

Recursion ও backtracking সহজ উদাহরণে

Recursion সমস্যার ছোট কপি সমাধান করে সমাধান করে। অনেক interview সমস্যায় ব্যবহৃত চিন্তার ধাপ ও backtracking টেমপ্লেট শিখুন।

Interview ও DSA•৩ মিনিটে পড়া