وبلاگ برنامهنویس: چه اتفاقی در زیر کاپوت gamer.ru میافتد
یک مروری تاریخی کوتاه
وبسایت gamer.ru در حال حاضر در حال تجربه سومین (و شاید حتی چهارمین) بازنویسی کامل کد است. این پروژه در ابتدا با Ruby-on-Rails در دهه 2000 نوشته شده بود. معماری این سیستم مونوگرافیک بود، بنابراین هر درخواست کاربر «عملیات» بسیار زیادی را به همراه داشت که شامل درخواستهای اضافی به پایگاه داده و بارگذاری تمام کتابخانههای ممکن بود. برای تأمین نیازهای 100 هزار بازدیدکننده روزانه، مجبور شدیم از پنج سرور قدرتمند استفاده کنیم، از memcache، Redis استفاده کنیم و پایگاه دادهها را در چندین سرور تکرار کنیم. این امکان را فراهم آورد که تا سال 2018 دوام بیاوریم، تا اینکه مشکلات مالی در شرکت آغاز شد و تیم توسعهدهندگان پراکنده شد.
حدود سال 2020 وبسایت SSL-گواهی خود را از دست داد. بهروزرسانی آن غیرممکن شد، زیرا نسخه قدیمی Ruby-on-Rails به نسخه قدیمی openssl وابسته بود و گواهیهای جدید به نسخه جدیدتری نیاز داشتند. هیچکس خیلی نگران نبود - وبسایت به طور ناقص به کار خود ادامه داد. در دوره 2015 تا 2025، ترافیک به تدریج از 100 هزار به 1 هزار کاربر در روز کاهش یافت. در وبلاگهای پنهانی و نظرات، مقدار زیادی هرزنامه، از جمله محتوای نه چندان مناسب، شروع به ظهور کرد. یاندکس کاملاً به ما بیعلاقه شد و در وب مستر، یک بوم قرمز از خطاهای بحرانی وجود داشت.
چه کارهایی انجام دادیم تا همه چیز را درست کنیم
وبسایت به بهینهسازی جدی نیاز داشت، زیرا معماری قدیمی دیگر با واقعیتها سازگار نبود. در پایگاه داده حدود 100 هزار پست و 1.6 میلیون نظر جمع شده بود که باید با دقت به موتور جدید منتقل میشد. ما تصمیم گرفتیم به معماری میکروسرویس بهعنوان پشتصحنه و جلو منتقل شویم و در عین حال فنآوریهای مدرن، از جمله HTMLElementهای جالب را درگیر کنیم.
پروژه بهطور کامل از ابتدا در NodeJS نوشته شد بدون استفاده از کتابخانههای شخص ثالث، که به ما زندگی آرامی را در 10-20 سال آینده تضمین میکند. اکنون میتوان از بهروزرسانی هر کتابخانه مد روز مانند ExpressJS یا React نترسید که ممکن است کل وبسایت را خراب کند و به تغییرات جدیدی نیاز داشته باشد. حتی ویرایشگر بصری پستها را مجبور شدیم خودمان بنویسیم، زیرا هیچ چیز از آنچه که درخواستی ساده داشتید، پیدا نشد. اکنون موتور صفحات HTML را برای دستگاههای قدیمی و موتورهای جستجو رندر میکند و محتوى را از طریق AJAX به کاربران ارائه میدهد.
در حال حاضر وبسایت بهخوبی بار متوسط حدود 150 درخواست در ثانیه را تحمل میکند، و سهم غالب ترافیک را رباتهای جستجو و سایر خزندهها تشکیل میدهند. بخصوص رباتهای semrush و openai به طور فعال عمل میکنند و بهنظر میرسد که در تلاشند تا کل وبسایت را در یک روز بارگذاری کنند. اگر یاندکس به آرامی ما را ایندکس کند و با سرعت 1-2 درخواست در ثانیه پیش برود، این دوستان ممکن است 50 درخواست کنند.
اما موتور آنقدر بهینهسازی شده است که این ارتش ربات به راحتی با یک ماشین مجازی ارزان به قیمت حدود 500 روبل در ماه قابل مدیریت است.
قطعاً، وبسایت بهطور دورهای با خطاهای 502 و 504 به یاد ما میآورد، که به تدریج شناسایی و رفع میشوند. گاهی اوقات مشخص میشود که کسی فراموش کرده است که ایندکس را به پایگاه داده اضافه کند، گاهی اوقات یک درخواست بسیار پیچیده به چندین درخواست ساده تقسیم میشود، و گاهی اوقات فضای سرور به سادگی تمام میشود. اما ما تسلیم نمیشویم - کار ادامه دارد و فرآیند، همانطور که گفته میشود، "زیر کنترل است".