نمایش کوچک هفت درس از بنیانگذار سایت Reddit
گروه آموزشی مجموعه تدبیر
ستیو هافمن بنیانگذار سایت Reddit در یک ارائه هفت درس که باید یاد بگیریم تا بتوانیم سایتی مانند Reddit را -با بازدید ماهانه ۷.۵ میلیون کاربر و تعداد مشاهده صفحه ۲۷۰ میلیون صفحه در ماه- مدیریت کنیم.
درس یک: سیستم بیشتر مواقع کرش میکند.
هافمن معتقد است با توجه به اینکه سیستم با مشکل موجه خواهد شد بهتر است بصورت خودکار پروسسها و سرویسهایی که باعث خطا شدهاند را ریاستارت کنیم. هافمن استفاده از برنامه supervise را برای مدیرت سرویسها پیشنهاد میکند.
درس دو: سرویسها را از هم جدا کنید.
باید سعی کنید تا حد ممکن هر سرویس را روی سرور جداگانه اجرا کنید. حتی در صورتی که بیشتر از یک سرور پایگاه داده دارید دیتاهای مشابه را روی یک سرور ذخیره کنید.
درس ۳: اسکیماآزاد!
نگران اسکیما (Schema و یا طرحواره) نباشید! کاربران پایگاه داده بشتر زمان انجام پروژه را صرف طراحی و نرمال سازی دیتابیس میکنند. در حالی که وقتی پایگاه داده بزرگ میشود و یا زمانی که تعداد جدولها افزایش مییابد تغییر در اسکیما و طرحواره پایگاه داده سختتر و حتی غیر ممکن میشود. فرض کنید جدول کاربران پایگاه داده شما شامل صد میلیون کاربر است و شما میخواهید مشخصه جدیدی مانند شماره مبایل را به جدول اضافه کنید! اضافه کردن یک ستون جدید (آپدیت کردن) به صد میلیون سطر بسیار زمانبر و حتی غیر ممکن است! طراحان Reddit پایگاه داده سایت را با دو جدول طراحی کردهاند. جدول Thing و جدول data. همه چیز در سایت Thing است: کاربران، لینکها، کامنتها و … Thing ها صفتهای عمومی مثل رای مثبت رای منفی، تاریخ ایجاد و نوع را نگهداری میکند. جدول Data سه ستون دارد: thing id و key و value. برای هر سطر یک مقدار وجود دارد. در نتیجه هر گاه نیاز به افزودن ویژگی جدیدی باشد نیاز به افزودن ستون جدید یا جدول جدید نیست.
تنها اشکال این روش این است که از امکانات پایگاههای داده رابطهای مانند join نمیتوانید استفاده کنید.
درس ۴: بیوضعیت
هر سرور برنامه به هر درخواستی پاسخگو است!
درس ۵: memcached
همه جا از memchached استفاده کنید!
در سایت reddit همه چیز در ممکشد ذخیره میشود.
- اطلاعات پایگاه داده
- سشنها
- صفحات رندر شده
- نتایج توابع داخلی (نتیجه محاسبه شده در توابع داخلی در دفعات قبل!)
- لیستها وصفحات از پیش محاسبه شده
- و …
همه چیز (صفحه اصلی و ..) در سایت از قبل ساخته شده و در کش دخیره شده. هر تکه کد اچتیامال در کش دخیره میشود در نتیجه نیازی نیست در هر بار درخواست بوسیله سیپییو رندر شود.
درس ۶:اطلاعات زائد را ذخیره کنید.
راز سرعت این است که همهچیز را از قبل رندر کنید و در کش دخیره کنید.
بهترین راه برای اینکه سایت کندی داشته باشید این است که پایگاه داده را به بهترین شکل نرمال کنید!
اگر اطلاعات به شکل متفاوت باید نشان داده شود همه این حالتها را تولید و ذخیره کنید تا درصورت درخواست کاربر همه چیز آماده باشد!
در سایت Reddit ۱۵ روش مرتب سازی متفاوت داریم (داغ، جدید، بالا، قدیمی، هفته) که همه این حالتها برای لینکها از قبل محاسبه شده و پس از درخواست کاربر این صفحات از قبل آماده شده از کش به کاربر تحویل داده میشود.
بهتر است باعث اتلاف حافظه و دیسک شویم تا اینکه کاربر را معطل کنیم!
درس ۷: به صورت آفلاین کار کنید.
وقتی نیاز است کاری را انجام دهید این کار به شکلی انجام دهید که کاربر منتظر شما نباشد. کار را در صف انجام قرار دهید و به کاربر بگویید که کار انجام شده.
به عنوان مثال وقتی کاربر به لینکی رای میدهد درخواست افزودن رای را برای انجام به صف بفرستید و تنها در صفحه کاربر یک امتیاز به لینک اضافه کنید و تغییرات را بر اساس صف در دیتابیس اعمال کنید.