سلام
این یه پستی بود یکی از دوستان تو یه انجمن دیگر برای بازی های رایانه ای پرسید به نحوه پردازش اطلاعات سایت های بزرگ از قبیل فیسبوک اشاره داشتم دیگه من تغییرات رو ندادم و کپی و پیست کردم به بزرگواری خودتان ببخشید:
بحث ها بسیار طولانی و فنی بودن با توجه به وقتی که داشتم شاید 4 5 پست اول را خواندم و از بقیه پوزش می طلبمم ممکن است مطالبمم توسط دوستان گفته شده باشد.اما باتوجه به اینکه من پیش زمینه ای در بازی های اجتماعی آنلاین تحت وب دارم مایل دونستم که با شما به این مطلب را به اشتراک بذارم. این گونه بازی ها به دو عنوان خوانده می شوند (MMO) یا (Social Games). این دو عنوان تفاوت آنچنانی ندارند فقط Social Games ها در پلتفرمهایی مانند فیس بوک، تویتر و .. اجرا می شود. بازی های MMO مانند تراوین و جنگ خان ها و Social Games ها مانند Zynga Poker بازی هایی در سایت های اجتماعی. هر دوی این بازی ها دارای کاربران زیادی هستند که همزمان با هم آنلاین هستند و بصورت RealTime در حال کار هستند. در اینگونه بازی ها تحلیلگران و برنامه نویسان سعی می کنند بهینه ترین روش های برنامه نویسی، کوئری ها و ساختار دیتابیس را در نظر بگیرند.
اما مسئله مهم این است آیا با روش های بهینه می شود با یک سرور معمولی بازی راه اندازی کرد؟
با توجه به نظر کارشناسان متخصص و تجربه شخصی بنده خیر. چون هر چقدر هم سیستم بهینه و قوی باشد فشار روی سرورها نبایستی از حدی بیشتر شود. و بازی های امروزی پارامترهای بسیاری را سنجش و پردازش می کنند که همه آن وابسته به دیتابیس هستند بنابراین فشار روی دیتابیس سرور زیاد هستند. بنده با تجربه ای که داشتم متوجه شدم نبایستی سرورها بیش از 60% منابع آن پر شود چون باعث افزایش زمان پردازش می شود.
مثلاً ما در بازی که تست کردیم با 150 کاربر آنلاین سروری با مشخصات قوی ذیل:
CPU: Dual E5-2680v2
RAM: 64GB DDR3
HDD: 120 SSD
سرعت پردازش کلی یک فرآیند بازی از 0.01 ثانیه برای یک بازیکن به 1.9 ثانیه افزایش یافت. این یعنی اینکه کاربری که مثلاً می خواست عملیاتی در بازی انجام دهد بایستی 1.9 ثانیه صبر می کرد این یعنی اگر شما سایت خبری دارید و هر صفحه زیر یک ثانیه بازمی شد حالا بالای 2 یا 3 ثانیه طول می کشد تا باز شود. این یعنی اینکه بازی شما بسیار کند و خسته کننده برای بازیکن ها می شود و مرگ زود رسی برای بازی خود بایستی در نظر بگیرید.
حال دیدم یکی از دوستان گفتند سرورهای 10 12 میلیونی را با سرورها و دیتاسنتر فیس بوک مقایسه می کنید؟ این سوال و مقایسه درست نیست چون در نظر بگیرید اگر بازی های آنلاین به اندازه فیسبوک آنلاین کاربر آنلاین داشته باشند شاید دیتاسنتری چند برابر قوی تر از دیتاسنتر موجود فیس بوک نیازمند بود. چه بسا سیستمی که من در بالا ذکر کردم قیمتی معادل 40 میلیون تومان در ایران دارد و جزء قویترین سیستم های موجود در بازار است.
بگذارید قبل از اینکه به بحث بازی برگردم توضیحاتی در مورد اقدامات فیس بوک در زمینه دیتابیس و وب سرور بپردازیم تا پیش زمینه ای مناسب داشته باشیم. ترجیح می دهم در زمینه فیسبوک با سند بجای حدس و گمان صحبت کنم طبق گفته سخنگوی فیسبوک که در کنفرانسی که چند وقت پیش داشت اعدادی فاش کرد که جای بسی تامل است:
- فیسبوک 800 میلیون یوزر دارد که 500 میلیون آن روزانه فیسبوک خود را چک می کنند.
- 300 میلیون کاربر موبایلی دارند که دائماً در حال دریافت و ارسال اطلاعات است.
- 7 میلیون اپلیکیشن دارد
فیس بوک در هر ثانیه 60 میلیون کوئری را انجام می دهد، 4 میلیون row در هر ثانیه تغییر می کند. اما فیسبوک چگونه این کار را انجام می دهد!!!
دیتابیس فیسبوک چیزی نیست جزء همین MySQL که ما استفاده می کنیم. اما Scale Up شده. Scaling در واژه یعنی بزرگ کردن مقیاس. با دیتابیس بر روی کامپیوتر های مختلف تقسیم شده است.
دیتابیس فیسبوک از 3 لایه: کش ، مدیران دیتابیس ، ذخیره سازها تشکیل شده است. طبق گفته فیسبوک بیش از 90% کوئری ها در لایه کش انجام می شود یعنی اینکه این کوئری ها به لایه استفاده از ذخیره سازها نمی رسند.
فیسبوک از پلاگین نام آشنا Memcache استفاده می کند که سیستم متن-باز برای کش کردن در MySQL استفاده می شود و در کنار آن از ماژول خود ساخته ای با نام FlashCache استفاده می کند تا روی هاردهای SSD کش شوند. که این پلاگین هم فیسبوک بصورت رایگان در github منتشر کرده است.
در مورد لایه های ذخیره ساز هم اگر بخوام توضیح بدهم لایه های ذخیره ساز به دو صورت عمودی و افقی هستند. لایه های عمودی شامل کامپیوترهایی هستند که اطلاعات مشابه به هم در آن ذخیره می شود تا با نابودی هر لایه عمودی ، لایه عمودی دیگر کمک رسانی کند و از دست رفتن اطلاعات جلوگیری شود. چون دیتابیس فیس بوک اینقدر بزرگ است که یک کامپیوتر بعنوان Data Node در زیر مجموعه لایه عمودی توانایی ذخیره این حجم اطلاعات را نداشته باشد. آن ها را با تکنیک Sharding تقسیم می کنند (البته این تکنیک در خود MySQL موجود است فقط بایستی از آن بهره جست). و در هر کامپیوتر مقداری از دیتابیس ذخیره می شود که این روش Horizontal Scaling یا بزرگ کردن افقی دیتابیس گفته می شود.
در کل چند کپی از دیتابیس ذخیره شده و هر کپی هم بخاطر بزرگی آن روی چندین کامپیوتر دیگر ذخیره می شود. با این سبک می توان مطمئن بود که اگر شما کامپیوتری را از مدار خارج کردید سایت شما بدون هیچ مشکل به کار خود ادامه می دهد.
و لایه مدیران هم که توضیح دادم کار آن رسیدگی و پردازش Data Node هاست.
وب سرور فیسبوک هم Tornado نام دارد که در کنار nginx نصب می شود. که توانایی nginx را تا چند برابر افزایش می دهد. ساز و کار وب سرور nginx هم مانند دیتابیس است و قابلیت scaling دارد بگونه ای که 10 ها کامپیوتر بعنوان webserver به کاربران پاسخ می دهند و فشار آن ها را روی هم تقسیم می کنند.
خوب حالا رسیدیم به بحث شیرین بازی. من خودم تا اینجا ذهنم خسته شده اما می خواستم توی یک پست جمعش کنم.
برای یک بازی تحت وب - به وب سرور نیاز دارید و بایستی بدانید یک وب سرور برای فرضاً 3000 بازیکن پاسخگو نخواهد بود.
برای یک بازی تحت وب - به دیتابیس نیاز دارید که شما برای دیتابیس توجه داشته باشید لاگ ها ، جداول و ... همه در آن ذخیره می شوند. و با هر بار لود صفحه چند صد کوئری به سمت دیتابیس سرازیر می شود که اگر می خواهید سرعت پردازش شما که در اول به آن اشاره کردم بالا نرود نیاز به لایه های کش ، مدیریت و ذخیره ساز دارید. البته این لایه ها همگی می توانند روی یک کامپیوتر باشند اما تجربه ما ثابت کرده یک کامپیوتر نمی تواند همه این ها را ساپورت کند. بعد جالبی قضیه این است که دیگر تراوین لازم ندارد برای سرورهای خود سرورهای جداگانه راه اندازی کند فقط کافی است تمامی دنیاهای خود را روی یک دیتابیس با این آرشیتکت نگه دارد. هم تا حتی 40% سیستم کمتر نیاز دارد یعنی فرضاً اگر برای هر دنیا نیاز به 5 تا سرور داشته باشد. حال اگر 3 دنیا را در کنار هم روی یک دیتابیس نصب کند ممکن است بجای 15 سرور بتواند از 12 سرور استفاده کند.
بالتبع برنامه نویسی و تحلیل های خودتان هم برای ساخت شروع بازی باید روی این آرشیتکت های دیتابیس متوجه شده باشد تا بعد از راه اندازی به این تکاپو نیفتید که کد خود را تغییر دهید چون آن موقع برای تجارت شما خیلی دیر است.
ببخشید سرتان را درد آوردم مطلب خیلی گسترده بود سعی کردم خلاصه اش کنم.
در مقاله بالا فکر نکنم به این دو مورد اشاره کرده باشم:
1- هر لایه مانند وب سرور ، کش سرور ، دیتا استور و ... بصورت Cluster کار می کند. یعنی دخیره اطلاعات و پردازش ها از طریق چند صد رایانه انجام می شود.
چینش آرایه ای این نوع کامپیوترها به دو گونه است افقی و عمودی. افقی ها بصورت موازی کار میکنند و عمودی ها برای لایه هاست. موازی ها پردازش یک لایه را بصورت موازی انجام می دهند.
2- Failover این یعنی اینکه هر کامپیوتری از شما از رده لایه های افقی خارج شود کامپیوترهای موجود دیگر فشار این کامپیوتر را به دوش می گیرند. این یعنی اینکه شما هر وقت خواستی برو چندتا کامپیوتر رو از شبکه خارج کنید و باز سایت شما هیچ خدشه ای در عملکردش نداشته باشد.
متاسفانه این بحثی که ارائه دادم همه ساز کار را ارائه نمی دهد و گراف های زیادی نیاز دارد که در دسترس نداشتم. البته اگر این مطلب را خیلی دقیق پیگیری کنید می توانید پایان نامه ای برای ارشد خود ارائه دهید. مطلب بسیار جالب و خیلی خوبی است.
لینک مقاله:
چگونگی پیاده سازی بازی های استراتژیک تحت وب - برگه 2
با تشکر از توجهتون
پژمان