State مشترک در بک اند

با سلام و درود

فرض مثال من پروژه ای دارم که در اون کاربرها چند وضعیت مختلف دارند که قراره همه اینها به صورت state در مموری ذخیره بشن . حالا اگر چند نمونه phoenix داشته باشم که پشت load balance باشن دقیقا چطوری باید state رو بین این چند نمونه share کنم تا همشون دسترسی داشته باشن ؟ چه راهکاری وجود داره که در صورت از بین رفتن state ها در مموری بتونم دوباره بدستشون بیارم ؟ آیا باید از دیتابیس استفاده کنم تا بعد هر آپدیت یک بارم در دیتابیس ذخیره کنه ؟ یا راهکار بهتری هم وجود داره ؟
هدف اصلی من از یادگیری elixir پرداختن به این مسائل و سیستم های توزیع شده بود اما الان احساس میکنم الکسیر به تنهایی اصلا کافی نیست و باید تسلط خیلی خوبی هم در ارلنگ داشته باشم تا بتونم از پس همچین کارهایی بربیام .
otp بسیار قدرتمند هست اما متاسفانه هیچ اموزش خوبی فعلا نتونستم برای توزیع پذیر کردن یا کلاستر کردن mnesia یا حتی GenServer و Agent پیدا کنم و تمام آموزش های موجود به :

iex --name [email protected] --cookie chocolate

ختم میشن و هنوز نمیدونم در عمل این جور مسائل جواب میدن یا نه ؟ یک سری توابع وجود دارند که میشه مثلا یک Task رو به صورت global ذخیره کرد و از طریق نود های دیگه فراخوانی کرد یا به state در یک نود دیگه دسترسی پیدا کرد اما آیا این کارها مناسبند یا باید از ابزارهای واسط استفاده کرد و از طریق اونها مثلا بین چند تا نود ارتباط برقرار کرد ؟ در کل برای اینکه در سیستم های توزیع شده و مقوله scale به تسلط برسم باید چیکار کنم ؟ با چه تکنولوژی ها و ابزارهایی باید کار کنم ؟ مثلا اگر بخوام از چنل های phoenix استفاده کنم طوری که بین چندتا سرور به خوبی و هماهنگی با هم کار کنند باید به چه چیزهایی تسلط پیدا کنم ؟

Actor model مدل ارتقا پذیری ارلنگ برای برنامه های stateful بیشتر به کار میره که اکثر state در نود ها نگه میدارند و طبق یک زمان بندی یا بعد مثلا 100 تغییر دیتابیس به روز می‌کنند

actor model و stateful service ها فقط یک نحوه ارتقا پذیری هستش چرا این مدل میخواهی استفاده کنی ؟
من همیشه این مدل رو برای گزینه آخر در نظر میگیرم و سرویس stateless را ترجیح میدم

2 Likes

با درود سام عزیز
قبلا اگر یادتون باشه یه مدت خیلی پیش هم همچین سوالهایی داشتم چون در حال طراحی یک بازی آنلاین ( تخته نرد ) بودم . الان دانشم خیلی کمه اما اون زمون از اینی هم که داشتم کمتر بود و بالاخره تونستم پروژه رو تموم کنم و تحویل بدم اما بعد متوجه شدم به هیچ وجه نه تنها معماری من صحیح نبوده حتی شیوه کد نویسی من هم صحیح نبوده ( با بررسی چندتا مقاله و نوشته متوجه شدم حتی تغییر یک خط کد ساده میتونه تاثیرات خیلی بالایی در مصرف رم یا حتی بهینه سازی انجام بده ) .
الان هم قصد دارم دوباره همچین سناریویی رو پیاده کنم و احساس میکنم به realtime و state احتیاج دارم با این تفاوت که اینبار صرفا برای خودم میخوام این کار رو به اصولی ترین نحو و شکل ممکن انجام بدم . قصد دارم یک گیم سرور آنلاین طراحی کنم که در اون کاربرهای مختلف میتونند به یک بازی جوین بشن . با توجه به نوع بازی هر کاربر ممکنه هر سه الی ده ثانیه یکبار درخواست بفرسته و از طرفی احتیاج دارم وضعیت کاربر رو نگه داری کنم که تمام اینها باعث میشه من اینطوری احساس کنم که به یک سرور stateful احتیاج دارم . اگر اشتباه میکنم خوشحال میشم بیشتر منو راهنمایی کنید تا از این سردرگمی که توش گیر افتادم نجات پیدا کنم چون بیشتر از سه هفته میشه که هر کتاب و نوشته ای دستم میافته میخونم اما هنوزم نتونستم راه حل مناسبتری برای خودم پیدا کنم ( مثلا یک ماشین state که بین همه نودها قابل دسترسی باشه ) و …
از طرفی احساس میکنم تمام این کارها به نحو احسنت با هر زبون دیگه ای شدنی بود و بهتر بود بجای این کارها تمرکز خودم رو بیشتر رو ابزارهایی مثل kafka , rabbitMQ , redis و … میزاشتم و لازم نبود صرفا برای یادگیری مقوله distributed systems , scale خودمو درگیر الکسیر کنم و ای کاش همون اسکالا رو حرفه ای تر ادامه میدادم بخصوص که با جی وی ام و جاوا هم آشنایی قبلی هرچند کم اما داشتم . نمیدونم درست فکر میکنم یا نه اما تو این موردم خوشحال میشم کمکم کنید که صرف زبان در مقیاس پذیری مهم تره یا ابزار ؟
من با این هدف به الکسیر وارد شدم که OTP رو کامل یاد بگیرم و پروژه های توزیع پذیر و خفن بزنم و به نظرم اگر هدفم صرفا ساخت فروشگاه و وبلاگ و … بود گزینه های خیلی بهتر و راحتتری وجود داشتند که علاوه بر راحتی گزینه مهم تری به نام سرعت توسعه رو هم بهم هدیه میدادند .
به هرحال بزارید سوال رو کلی تر بپرسم : من برای اینکه سیستم های توزیع پذیر و مقوله scale رو کامل درک کنم باید چیکار کنم ؟ چطور میشه برای مثال گیم سروری ساخت که براحتی کلاستر بشه و با افزایش کاربر از کار نیافته ؟ سیستم هایی مثل fireBase چطور میتونند این حجم دیوانه وار از پیامها رو بررسی و ذخیره کنند ؟

برای game سرور actor مدل گزینه خوبیه ولی برای اکثر سیستم های دیگه مدل های stateless بهترند
firebase برای مثال نسبتا ساده هست
برای یادگیری ارتقا پذیری باید با تکنولوژی های big data آشنا شوید و کتاب بخوانید و talk های این قضیه رو ببینید

2 Likes