بازگشت به کتابخانهکتابخانه17.3Case Study: رتبه‌بندی بلادرنگ (Leaderboard)
طراحی سیستم نرم‌افزاریSYSTEM DESIGNاز صفر تا تسلط
v1.0.0
01مبانی و تصویر بزرگ
02Scalability و ظرفیت
03لایه داده
04Cache، Queue و جریان
05معماری نرم‌افزار
06قابلیت اطمینان و عملیات
07متد طراحی
08Case Study های واقعی
09سیستم‌های توزیع‌شده عمیق
10مهندسی تولید: داده، امنیت و کارایی
11تمرین پیشرفته و کیس‌استادی‌های مکمل
12زیر کاپوت دیتابیس و معماری داده
13وب بلادرنگ و پروتکل‌های مدرن
14سیستم‌های توزیع‌شده پیشرفته
15SaaS ،SRE ،امنیت و شبکه پیشرفته
16طراحی سیستم در عصر AI
17Case Study های تکمیلی
LESSON 17.3فصل ۱۷Case Study های تکمیلی

Case Study: رتبه‌بندی بلادرنگ (Leaderboard)

  • ~۱۲ دقیقه
  • ۳ پرسش
  • متن را انتخاب کن تا هایلایت شود

مسئله: جدول امتیاز بازی موبایل با ۱۰ میلیون بازیکن — هر باخت، امتیاز عوض می‌شود و هر کاربر می‌خواهد رتبه خودش و ۱۰ نفر برتر را همین الان ببیند. سؤال ظاهراً ساده که یک ساختمان‌داده جادویی را وادارت می‌کند.

۱-۲) نیازمندی و تخمین

  • FR: ثبت امتیاز، رتبه من، top-K ،رتبه‌های اطراف من.
  • NFR: به‌روزرسانی و خواندن هر دو در میلی‌ثانیه؛ ده‌ها هزار آپدیت در ثانیه در پیک مسابقات.
  • چرا نه SQL ساده؟ SELECT COUNT(*) WHERE score > X برای هر نمایش یعنی اسکن میلیون‌ها سطر — ORDER BY + LIMIT هم با ایندکس برای «رتبه من» کافی نیست. نیازمند ساختمان‌داده مرتبِ حافظه‌ای.

۳) طراحی — Skip List در Redis

Redis Sorted Set (ZSET) دقیقاً برای همین است: پیاده‌سازی Skip List — لیست پیوندی چندسطحه که مثل ایندکس بالا می‌پرد. ZADD (به‌روزرسانی امتیاز)، ZREVRANK (رتبه من)، ZRANGE (top-K) همگی O(log N). ده میلیون عضو؟ چند صد مگابایت حافظه و پاسخ میکروثانیه‌ای. یک دستور، یک مسئله کامل.

DIAGRAMجریان Leaderboard
Game Server — نتیجه بازی
ZADD به Redis
خواندن: ZRANGE/ZREVRANK
عکس‌برداری دوره‌ای → DB

۴) عمق و گلوگاه

  • تاریخچه و پایداری: Redis را write-through به DB کن یا دوره‌ای snapshot بگیر؛ رتبه‌بندی فصلی ریست می‌شود ولی تاریخچه ماندگار است.
  • Leaderboard های متعدد (روزانه/هفتگی/دوستان): کلید جدا per دوره؛ «دوستان» = ZSET کوچک per کاربر یا راه‌حل با INTER — حجمش را تخمین بزن قبل از انتخاب.
  • تقلب: امتیاز باید از نتیجه بازیِ اعتبارسنجی‌شده سرور بیاید، نه عددی که کلاینت می‌فرستد — اعتماد به کلاینت یعنی پایان رقابت.
  • شارد: اگر یک ZSET هم دیر شد، تقسیم بر بازه امتیاز یا بازی — ولی با ۱۰M عضو معمولاً همان یک نمونه (با replica برای خواندن) کافی است.

به زبان ساده

رتبه‌بندی زنده یعنی ساختمان‌داده مرتبِ حافظه‌ای (Sorted Set) که آپدیت، «رتبه من» و «۱۰ نفر برتر» را در کسری از میلی‌ثانیه جواب می‌دهد.

مثال واقعی

جدول امتیاز مسابقه: با هر باخت، Redis فقط جای بازیکن را در لیست مرتب جابه‌جا می‌کند؛ نیازی نیست برای هر نمایش، ده میلیون رکورد دوباره مرتب شوند.

دانش‌سنجی

آزمون درس

۳ Q
01
چرا Sorted Set برای leaderboard از SQL بهتر است؟
02
امتیاز از کجا باید بیاید؟
03
تاریخچه فصل‌های قبل کجا نگه داشته شود؟