PDA

View Full Version : آپدیت مقادیر در هنگام آفلاین



master_pro
شنبه 09 شهریور 1398, 13:22 عصر
سلام به همگی
یک موضوعی که باهاش برخورد کردم اینه که امتیازات کاربر در هنگامی که حضور نداره داخل جدولش تغییر کنه
به این صورت که کاربر فعالیت هائی را اکتیو می کند که به طور مثال 8 ساعت بعد, آن فعالیت باید نسبت به مقادیر فیلدهای X (مقادیر فیلدهای X در همان زمان) از وی امتیاز کم کند یا به وی امتیاز دهد و در آن زمان وی آنلاین نیست لذا رکورد مربوط به این فعالیت دی اکتیو داخل دیتابیس نشسته و قادر به تغییر امتیاز نیست
توضیح تکمیلی : فیلدهای X , فیلدهای متفاوتی از جداول متفاوتی هستند که مقدارشان با فعالیت کاربران در حال تغییر است و لازمه در همان زمان پایان رکورد ها مقدارشان چک شود و نسبت به این مقدار به کاربر امتیاز دهیم یا از وی امتیاز کم کنیم

مثال :
الان ساعت 8 صبح است
رکورد A اکتیو شده و در ساعت 4 پایان می پذیرد , لذا بسته به اینکه مقادیر X در ساعت 4 مقدارشان چقدر باشد باید محاسباتی انجام شود و امتیازاتی به کاربر اضافه و یا کم کند
رکورد B ...
رکورد C ...
رکورد D ...
..............
این رکوردها از تمام کاربران در این جدول در زمان های متفاوت ایجاد می شوند و تعدادشان بسیار زیاد است

plague
شنبه 09 شهریور 1398, 20:25 عصر
درست متوجه نشدم چی گفتی
ولی با cronjob میتونی اسکریپت های php رو اجرا کنی حتی وقتی کاربری وجود نداره

master_pro
شنبه 09 شهریور 1398, 21:45 عصر
توضیح خیلی شفاف و ساده بیان کردم کجاشو متوجه نشدین؟
بله cronjob میشه اما چون سرور درگیر میشه و روی هاست اشتراکی هم معمولا نیست می خوام اینکار انجام بدم ببینید چطوره
هرکاربری که لاگین میکنه کله رکوردهائی که زمان پایانشون از زمان فعلی گذشته به ترتیب اجرا میکنه و امتیاز میده
اینجوری وقتی کاربری نیست کسی دیگه هست و اون چرخه اجرارو میچرخونه
اگرم هیچکس آنلاین نشه سیستم در اصل به خواب میره و چون کسی آنلاین نیست اطلاعات ناصحیح اما غیرفعال به داده ای آسیب نمیتونه بزنه و هنگامی که اولین نفر لاگین کنه همش اجرا میشه و اطلاعات ناصحیح رو با از سر گیری پردازش ها به اطلاعات صحیح تبدیل میکنه
یعنی یا کسی اطلاعات ناصحیح را نمیبینه یا اگر ببینه اطلاعات صحیح رو میبینه

لطفا دوستان مسلط به این بحث مشارکت رو بالا ببرن ممنون

master_pro
یک شنبه 10 شهریور 1398, 16:43 عصر
دوستان کسی مشارکت نمیکنه ؟!
الان سوال مهم برام 2 تا چیزه
1-اگر این رکورد فعالیتها در مواقع آفلاین کاربران محاسبه نشوند و جمع شوند بعدا با ورود اولین کاربر همرو بخواهم محاسبه کنم سرور سنگین نمیشه؟
مثلا 1 میلیون کاربر هرکدام 1000 رکورد فعالیت ایجاد می کنند و از سیستم می روند , رکورد آنها مثلا 4 ساعت بعد زمانش پایان می یابد و اولین کاربر 5 ساعت بعد لاگین میکنه و سرور باید 1 میلیارد رکورد را محاسبه کند , به ازای هر رکورد احتمال داره چندین کوئری از دیتابیس لازم باشه گرفته شه

لطفا راهنمائی بفرمائید ممنون

ali_sed
یک شنبه 10 شهریور 1398, 21:55 عصر
دوستان کسی مشارکت نمیکنه ؟!
الان سوال مهم برام 2 تا چیزه
1-اگر این رکورد فعالیتها در مواقع آفلاین کاربران محاسبه نشوند و جمع شوند بعدا با ورود اولین کاربر همرو بخواهم محاسبه کنم سرور سنگین نمیشه؟
مثلا 1 میلیون کاربر هرکدام 1000 رکورد فعالیت ایجاد می کنند و از سیستم می روند , رکورد آنها مثلا 4 ساعت بعد زمانش پایان می یابد و اولین کاربر 5 ساعت بعد لاگین میکنه و سرور باید 1 میلیارد رکورد را محاسبه کند , به ازای هر رکورد احتمال داره چندین کوئری از دیتابیس لازم باشه گرفته شه

لطفا راهنمائی بفرمائید ممنون

سلام

بهترین راه حل همان استفاده از کرون جاب است. همان طور که خودتان توضیح دادید اولین مشکل حجم کوئری های زیادی است که با ورود اولین کاربر باید اجرا شوند.

یک ملیون کاربر هر کدام 1000 رکورد فعالیت طی 4 ساعت ایجاد کردند یعنی 1 ملیارد رکورد طی 4 ساعت. برای پردازش این حجم از اطلاعات نیاز به سرور اختصاصی دارید و هاست اشتراکی پاسخ گو نیست.

پردازش 1 ملیارد رکورد با فرض اینکه هر کدام 1 صدم ثانیه فقط زمان ببرد هم نزدیک به 10 هزار ثانیه است. حال اگر کاربر دوم و سوم و ... قبل از پایان پردازش ها وارد سایت شوند باید چکار کرد؟ در ضمن این هنر شماست که با انتخاب یک استراتژی مناسب این زمان را کاهش دهید.

اگر وابستگی بین امتیاز کاربران وجود ندارد میتوانید هر وقت کاربری لاگین کرد تنها داده های مربوط به همان کاربر را پردازش کنید.

اگر هاست اشتراکی شما کرون جاب ندارد از شرکت معتبرتری هاست تهیه کنید.

plague
یک شنبه 10 شهریور 1398, 22:51 عصر
این مسئله رو زیاد دیدم خیلی وقتا دوستان روی یک سیستمی کار میکنن و عملکرد سیستم رو کاملا از حفظ هستن یجا گیر میکنن میان یجوری سوال میپرسن انگار همه مثل خودشون زیر و بم سیستم رو میدنن
وقتی هم بهشون میگیم که سوالت گنگه حالت دفاعی میگیرن و فکر میکنن پاسخ دهنده ها خنگ هستن


شما نه ساختار درست دیتابیس و روش ارتباط تیبل ها و نوع داده های توی دیتبایس رو توضیح دادی , نه در مورد شیوه محاسبه امتیاز ها که بر اساس چی هستن و چجوری بوجود میان و چجوری محاسبه میشن چیزی گفتی
شما کلی گویی میکنی که باعث میشه بیشتر سوال پیش بیاد برای بیننده و گیج کننده کننده بشه سوالت

مثلا گفتی


یک موضوعی که باهاش برخورد کردم اینه که امتیازات کاربر در هنگامی که حضور نداره داخل جدولش تغییر کنه


بعد گفتی


X , فیلدهای متفاوتی از جداول متفاوتی هستند که مقدارشان با فعالیت کاربران در حال تغییر است و لازمه در همان زمان پایان رکورد ها مقدارشان چک شود




خب این 2 خط به نظر من متناقض هستن و بیشتر سوال پیش میاره که اگه مقادیر فیلد x با فعالیت کاربر تغییر میکنه
چجوری قراره وقتی کاربر لاگین نیست و طبیعتا فعالیتی نداره امیازات تو جدولش تغیر کنه ؟
مطئن هستم که شما برای این جوابی منطقی داری و الان میای میگی ... اگه درست و با جزئیات توضیح داده بودی من هم اون جواب رو میداشتم و گیج کننده نبود سوالت برای من



بله cronjob میشه اما چون سرور درگیر میشه و روی هاست اشتراکی هم معمولا نیست می خوام اینکار انجام بدم ببینید چطوره

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


هرکاربری که لاگین میکنه کله رکوردهائی که زمان پایانشون از زمان فعلی گذشته به ترتیب اجرا میکنه و امتیاز میده

این اصلا منطقی نیست
اول اینکه ممکنه 100 تا کاربر با هم لاگین باشن ... ممکنه 1 روز هیچ کاربری لاگین نکنه چیزیه که شما روش کنترلی نداری
دوم اینکه کاربر لاگین هم بشه باید یه درخواست بفرسته به سرور که اسکریپت محاسبه امتیاز مثلا point.php اجرا و امتیازات محاسبه بشه و کاربر باید متظر بمونه تا اسکریپت اجزا بشه
چجوری میخای کاربر رو مجبور کنی به این اسکریپت درخواست بفرسته و منتظر اجراش بمونه که ممکنه چندین دقیقه و یا حتی ساعت طول بکشه بمونه ؟
میدونی که یه اسکریپت به صورت دیفالت حداکثر 30 ثاینه وقت داره که اجرا بشه وبیشتر از اون بشه سرور قطعش میکنه
اصلا یه محاسبه سنگین که طولانیه رو نمیتونی توی 1 رکوئست اجرا کنی باید صف بندیشون کنی و با چندین درخواست اجراشون کنی تک تک





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

اینجا به نظر منی که از جزئیات سیستم اطلاع ندارم داری چینی حرف میزنی


امیدوارم متوجه شده باشی مشکل چیه وقتی جوری سوال کنی که برای من بیننده بیشتر سوال پیش بیاد همش سوال میشه و از پاسخ خبری نیست


من دیگه اینجا چیزی نمیگم که تاپیک رو مشغول نکنم
فقط به عنوان آخرین راهنمایی برای موارد اینجوری یا باید از کرون جاب استفاده کنی
یا trigger و stored procedure که چون از جزئیات سیستم اطلاع ندارم نمیدونم اینجا به کارت میان یا نه

master_pro
چهارشنبه 13 شهریور 1398, 02:22 صبح
سلام به همگی دوستان و ممنون از مشارکتشون

plague :
نه دوست عزیز بحث دفاع و جبهه گیری و اینها نیست 😊 خیلی ساده پرسیدم کجاشو متوجه نشدین که براتون بیشتر توضیح بدم 👍
حتما بازم مشارکت کنید ممنون


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

از توضیحات همگی ممنون

plague
چهارشنبه 13 شهریور 1398, 18:49 عصر
در مورد trigger هم تحقیق کن
میتونی به محظ update شدن یا insert شدن دیتا در یک تیبل محتویات تیبل دیگه رو تغییر بده به تناسبش
خیلی محاسبات رو میتونی اینجوری به صورت آنی انجام بدی و سرور هم درگیر نمیشه

master_pro
چهارشنبه 13 شهریور 1398, 20:07 عصر
درسته اما اینجا رکوردهای فعالیتی که ایجاد میشن برای اینکه فعالیت محاسباتیشون استارت بخوره یک فیلد زمان دارند که باید با توجه به گذشتن زمان فعلی از اون زمان محاسبه روشون انجام شه
نکته دیگه اینه که پس از یکبار محاسبه روی رکورد احتمال داره شرایط فعالیت برقرار نباشه و لازم باشه مثلا 5 دقیقه دیگه روی همین رکورد مجددا محاسبه انجام شه - همینطور...تا وقتی که شرایط برقرار شن و در نهایت محاسبه امتیاز انجام شه و این رکورد از جدول حذف شه

master_pro
چهارشنبه 13 شهریور 1398, 20:09 عصر
با تشکر از دوستان گرامی