چک کردن فضای رم به ازای هر درخواست


#1

سلام
یک پروژه ای دارم که stateful هست و به ازای هر کاربر حدود 60 کیلوبایت از حافظه اشغال میشه ، بعضی از کاربرها چون قراره state با همدیگه share کنن باید در یک نود باشند . حالا مشکلی که برام پیش اومده اینه که چطور باید بتونم فضای حافظه رو کنترل کنم تا اگر فضای کافی نبود درخواست کاربر جدید رو هندل نکنه و …
به نظر شما آیا کار عاقلانه ای هست که به ازای هر درخواست جدید برای جوین شدن فضای حافظه رو چک کنم و مثلا حافظه کافی وجود نداشت درخواست رو پاسخ نده ؟ مثلا اگر 5 کاربر باهم ارتباط دارند و یک کاربر دیگه میخواد وارد بشه با درخواستش حافظه چک بشه و اگر فضا کافی نبود قبول نکنه .
آیا راه حل بهتری میدونید ؟


#2

راه مناسبی نیست. شاید بهتر باشه دقیق تر بگید که چه کاری می خواین انجام بدید


#3

خب یک گیم سرور هست که چند کاربر میتونن باهم همزمان یک بازی رو شروع کنند یا بعدا به بازی جوین بشن . اطلاعات لازم هر کاربر به صورت state در حافظه ذخیره میشه و هر از گاهی در دیتابیس(هنوز در انتخاب بین Redis یا Cassandra مردد هستم ) ذخیره میشه تا اگر نود کرش کرد داده ها از دست نرن . قبلا مشکلم این بود که چطوری state رو بین نودهای مختلف share کنم که دوستان گوشزد کردند که در سرورهای stateful بهتره که کاربر رو به نودی که کاربر مورد نظر اونجاست هدایت کنم و state بین نودهای مختلف share نشه . خب این کار رو به سختی انجام دادم و الان مشکلی که دارم اینه که از کجا باید فضای حافظه رو بفهمم تا نود کرش نکنه ؟ مثلا اگر نودی فضای کافی در رم نداره و با پذیرش کاربر جدید ممکنه از کار بیافته چطوری باید اینو بدونم تا نزارم کاربر جدید جوین بشه ؟
کاری که من کردم اینه که کاربرهایی که در یک بازی هستند باید در یک نود باشند تا بتونند به state همدیگه دسترسی داشته باشند . مثلا کاربر 1 و 2 در حال بازی ان و کاربر 3 هم میخواد وارد بازی بشه ، اگر فضای کافی تو نودی که کاربر 1 و 2 در اون هستند وجود نداشته باشه چجوری بفهمم این رو تا نزارم کاربر 3 وارد بازی بشه ؟
اصلاً راه حل خوبتری وجود نداره که بتونم این اطلاعات رو بین نودهای مختلف share کنم تا لازم نباشه انقدر دردسر بکشم ؟ چون واقعا سخت و اعصاب خراب کن هست و مشکلات زیادی داره مثلا یکی اینکه بعضی از کاربرها صرفا بخاطر اینکه منابع یک نود جا نداره نمیتونن وارد بازی که دوست دارند بشن و …
نظر شما در مورد این چیه که بیخیال state بشم و همه چیز رو به دیتابیس بسپارم ؟


#4

و ما هم چنان منتظر جوابیم :sweat_smile:
سرت خلوت شد یه کمکی بکنید خیلی ممنون میشم


#5

شرمنده فراموش کردم.
عرضم به خضورتون که Redis انتخاب مناسبی هست و اگر از redis استفاده کنین دیگه نیازی نیست که همه رو یه نود باشن مگر اینکه state های همدیگه رو بخوان دستکاری کنن. این که شما چقدر منابع allocate کنین کلا روش مناسبی نیست چون مطمئنم که نمی تونین این کار رو درست انجام بدید ( البته منظورم این نیست که شما توانایی ندارید، منظور اینه که این کار بسیار پیچیده هست و از توانایی یک نفر و از صفر نوشتن خارج هست ) . برای همین من پیشنهاد می کنم از یه مموری منیجمنت استفاده کنین. یه سیستمی مثل buffer pool منیجر که بافر ها رو براتون مدیریت کنه و در صورتی که نتونه بافر برای یه کاربر جدید allocate کنه همون کاربر رو فقط با خطا مواجه کنین


#6

اتفاقا این مورد رو باهاتون موافقم و تا همین الانش کلی وقت و انرژی بیهوده صرف کردم

واقعا دستتون درد نکنه ، گاهی اوقات آدم میدونه دنبال چیه فقط اصطلاحش رو نمیدونه و سردرگم میشه .
بازم خیلی ممنون