Flash sale সিস্টেম ডিজাইন: ভিড়ে টিকে থাকা

গরম কোনো পণ্যের sale শুরু হলে হাজারো user একসাথে একটি পণ্যে আঘাত করে। অতিরিক্ত বিক্রি বা বসে যাওয়া ছাড়া spike সামলানো ডিজাইন করি।

একটি পণ্যে মিলিত হওয়া তীরের ঝাঁক

লক্ষ্য: নির্দিষ্ট সময়ে সীমিত সংখ্যক পণ্য বিক্রি করা, যখন traffic হঠাৎ ১০০ গুণ বাড়ে, অতিরিক্ত বিক্রি ও বসে যাওয়া ছাড়া।

কেন কঠিন

  • বিশাল, অল্প সময়ের spike, প্রায়ই ঠিক নির্দিষ্ট সময়ে।
  • সবাই একই কয়েকটি পণ্য চায়, তাই একটি database row গরম জায়গা হয়ে যায়।
  • Bot ও script-ও যোগ দেয়।
  • অতিরিক্ত বিক্রি বা ক্র্যাশ বিশ্বাস ও টাকার ক্ষতি করে।

কৌশল: প্রতিটি স্তরে কাজ কমানো

১. Static কনটেন্ট CDN-এ। পণ্যের পেজ, ছবি ও script edge-এ cache থাকুক, যাতে শুধু "কিনুন" কাজটি আপনার server-এ পৌঁছায়।

২. আগে গরম করা। শুরুর আগে cache গরম করুন ও server বাড়ান।

৩. Waiting room / traffic shaping। User-দের নিয়ন্ত্রিত ভাগে কেনার প্রবাহে ঢোকান। অবস্থান-নম্বরসহ queue বেশি ন্যায্য এবং backend বাঁচায়।

৪. Rate limiting ও bot প্রতিরক্ষা। User, IP ও device অনুযায়ী সীমা, সন্দেহজনক traffic-এ CAPTCHA বা proof-of-work, এবং sale-এর আগে login আবশ্যিক।

৫. Redis-এ স্টক। উপলব্ধ সংখ্যা Redis-এ রাখুন ও atomically কমান (DECR, বা যাচাই-ও-কমানোর Lua script)। ফল ঋণাত্মক হলে পণ্য শেষ, এবং request database না ছুঁয়েই সাথে সাথে প্রত্যাখ্যাত।

৬. Order queue-তে। সফল decrement একটি message queue-তে order request পাঠায়। Worker database-এর সামলানো স্থির গতিতে order বানায়। User দেখে "প্রক্রিয়াধীন", তারপর নিশ্চিতকরণ।

৭. Payment-এর সময়। পণ্যটি অল্প সময় (যেমন ১০ মিনিট) ধরে রাখুন। Payment ব্যর্থ হলে একক স্টকে ফিরিয়ে দিন।

গরম row এড়ানো

একটি স্টক row-এর বদলে স্টককে কয়েকটি bucket-এ ভাগ করুন (যেমন ১০০ করে ১০টি counter) এবং এলোমেলোভাবে একটি বাছুন। এতে contention ছড়ায়।

Consistency ও নিরাপত্তা

  • Redis দ্রুত কিন্তু crash-এ data হারাতে পারে, তাই database-এর সাথে মেলান এবং আসল স্টকের বেশি কখনো বিক্রি করবেন না। Database চূড়ান্ত কর্তৃপক্ষ।
  • Order তৈরি idempotent রাখুন যাতে retry ডুপ্লিকেট না বানায়।
  • Unique key দিয়ে প্রতি user-এ একটি কেনা নিশ্চিত করুন।

শালীনভাবে নামুন

Load বেশি হলে timeout-এর বদলে দ্রুত "শেষ" বা "আবার চেষ্টা করুন" উত্তর দিন। আগেভাগে load ফেলে দিন।

Observability

ইভেন্টের সময় queue-র দৈর্ঘ্য, error হার, Redis latency ও database load দেখুন, এবং একটি kill switch রাখুন।

মূল কথা: কাজ edge-এ ঠেলে দিন, waiting room দিয়ে traffic আকার দিন, Redis-এ atomically স্টক কমান, order queue-তে তুলুন, আর দ্রুত ব্যর্থ হোন।


System Design সিরিজ, পর্ব ৩ (case study): 14 নম্বর (মোট 16)। আগের লেখা: E-commerce checkout সিস্টেম ডিজাইন.

আরও পড়ুন

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

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

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