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 সিস্টেম ডিজাইন.


