مدیریت درخواست های زیاد به برنامه در Entity Framework
سلام دوستان
من در صفحات view برنامه ام، برای مدیریت دسترسی به اجزای مختلف صفحه از Razor استفاده کردم و امکان دسترسی به اونها رو بر اساس جدولی در دیتابیس چک میکنم.
مشکل اینجاست که اگر همزمان تعداد زیادی صفحه (مثلا 10 صفحه) با هم باز بشن برنامه کلا به خطا می خوره و با خطاهای Connection state is open یا Connection state is connecting روبرو میشم.
طبیعتا این تعداد صفحه زیاد نیست و برنامه باید بتونه این حجم درخواست رو مدیریت کنه اما نمی دونم چطوری باید این کار رو انجام بدم.
اصل مشکل هم در تابعی هست که همین دسترسی ها رو در چندتا جدول DB که یکی از جداول اونها تقریبا 2000 ردیف داده داره، داره چک میکنه.
داده ها هم به کمک LINQ در حال فراخوانی هستند. میشه منو راهنمایی کنید چطور جلوی این کندی و بروز خطا رو بگیرم؟ :اشتباه:
نقل قول: مدیریت درخواست های زیاد به برنامه در Entity Framework
دوستان کسی هست که بتونه راهنمایی کنه؟
نقل قول: مدیریت درخواست های زیاد به برنامه در Entity Framework
من هم سیستم مشابهی (کنترل دسترسی بر اساس پرمیشن های ثبت شده در دیتابیس) در پروژه هام پیاده سازی کرده ام.
برای بررسی پرمیشن های کار نیاز نیست هر بار به دیتابیس مراجعه کنید. من هنگامی که کاربر لاگین میکنه و یا به عنوان یک کاربر لاگین شده به سایت وارد میشه در متد Session_Start در Global.asax دسترسی های کاربر رو تبدیل به یک لیست می کنم و داخل Session قرار میدم. هر بار نیاز به بررسی دسترسی است روی اون لیست کوئری میزنم. این طوری سرعت کار خیلی بالا میره.
نقل قول: مدیریت درخواست های زیاد به برنامه در Entity Framework
نقل قول:
نوشته شده توسط
مهدی کرامتی
من هم سیستم مشابهی (کنترل دسترسی بر اساس پرمیشن های ثبت شده در دیتابیس) در پروژه هام پیاده سازی کرده ام.
برای بررسی پرمیشن های کار نیاز نیست هر بار به دیتابیس مراجعه کنید. من هنگامی که کاربر لاگین میکنه و یا به عنوان یک کاربر لاگین شده به سایت وارد میشه در متد Session_Start در Global.asax دسترسی های کاربر رو تبدیل به یک لیست می کنم و داخل Session قرار میدم. هر بار نیاز به بررسی دسترسی است روی اون لیست کوئری میزنم. این طوری سرعت کار خیلی بالا میره.
خیلی ممنون از راهنمایی ارزشمندتون، فقط یه نکته، این موضوع از لحاظ امنیتی مساله ساز نیست؟ چون بحث امنیت در این سامانه مون خیلی مهمه و قرار تست امنیتی بشه. در چنین حالتی امکان جعل سشن برای کاربر دیگه ای وجود نداره؟
نقل قول: مدیریت درخواست های زیاد به برنامه در Entity Framework
برای انجام جعل سشن، فرد مهاجم میبایست از یکی از امکانات زیر برخوردار باشد:
- به سیستم کاربر صاحب سشن دسترسی داشته باشد.
- به روتر شبکه دسترسی ادمین داشته باشد.
- از طریق Script Injection در سایت شما بتواند کوکی ها و دیگر شناسه های مدیریت کننده سشن را بخواند و در سرور/سایت خودش Save کند.
برخورداری از مورد 1 و 2 کار راحتی نیست.
و اما برای مقابله با Script Injection (معروف به XSS Attack):
اگر شما در جاهایی که مقادیری را از کاربران سایت در Input ها دریافت می کنید (منوط به اینکه با استفاده از صفتی مانند AllowHtml اجازه وارد کردن کد Html/Javascript را در آن Input داده باشید) با استفاده از امکانی مانند HtmlSanitizer ورودی را از کدهای آلوده تصفیه کنید هیچ گاه مشکل Script Injection را در سایت تان نخواهید داشت.
نقل قول: مدیریت درخواست های زیاد به برنامه در Entity Framework
واقعا ازتون ممنونم که با حوصله و دقیق جوابم رو دادید.
من از روشی که گفته بودید هم استفاده کردم و لیست دسترسی های کاربر رو به صفحات مختلف در داخل یک لیست در داخل سشن نگهداری کردم و بعد در بخش های مربوطه از این لیست استفاده کردم. اما همچنان وقتی که چند درخواست همزمان به سمت سرور ارسال میشه برنامه قفل می کنه و تمام صفحات با کمی تاخیر به خطا می خورند. امکان استفاده از رویکرد غیرهمزمان (Async) هم متاسفانه وجود نداشت (چون به خروجی این متدها برای ادامه کار نیاز هست). به نظرم مشکل باید از جای دیگه ای باشه چون این خیلی طبیعی هست که همزمان تعداد زیادی درخواست برای باز کردن صفحه به سرور ارسال بشه.
یه نکته هم در مورد نحوه انجام تست بگم که شاید به اون ایراد وارد باشه، من و چند کاربر دیگه همزمان از روی سیستم های مختلف یک صفحه مشخص رو در چندین تب باز می کنیم تا اینطوری تا حدی تست فشار رو روی سامانه انجام بدیم، آیا رویکرد تست مون اشتباه هست که نتیجه ی درستی نمی گیریم؟
نقل قول: مدیریت درخواست های زیاد به برنامه در Entity Framework
سروری که در موردش صحبت می کنید یک وب سرور هست که از جایی تهیه کرده اید و یا یک سرور در شبکه محلی؟
نقل قول: مدیریت درخواست های زیاد به برنامه در Entity Framework
بله یک سرور اختصاصی مربوط به شهرداری هست که ما در قالب یک VPS به اون دسترسی داریم. الان با ورود دو یا سه کاربر خیلی این احتمال وجود داره که خیلی زود با خطا مواجه بشیم. در حال حاضر با ورود دو یا سه کاربر دائما با خطای Connection state is open و connection state is connectiong و یا خطاهای مشابه اون که به کانکشن دیتابیس مربوط هست مواجه میشیم.
نقل قول: مدیریت درخواست های زیاد به برنامه در Entity Framework
1- کانکشن به دیتابیس رو خودتون دستی باز یا بسته می کنید؟
2- آیا از آبجکت DbContect متغیر استاتیک ساخته اید و از آن استفاده می کنید؟
نقل قول: مدیریت درخواست های زیاد به برنامه در Entity Framework
نقل قول:
نوشته شده توسط
مهدی کرامتی
1- کانکشن به دیتابیس رو خودتون دستی باز یا بسته می کنید؟
نه کانکشن ها رو به صورت دستی باز و بسته نمی کنیم.
نقل قول:
نوشته شده توسط
مهدی کرامتی
2- آیا از آبجکت DbContect متغیر استاتیک ساخته اید و از آن استفاده می کنید؟
بله. از db در ابتدای هر کلاس یا کنترلر یک شی ساخته شده و از اون استفاده میشه
نقل قول: مدیریت درخواست های زیاد به برنامه در Entity Framework
ممکنه ورژنی از SQL Server که روی سرور شما نصبه نگارش پایین (مثلا Developer Edition) است و تعداد کانکشن های زیادی رو پشتیبانی نمی کنه.
همچنین، می توانید به صورت دستی کانکشن ها رو قبل از Query باز و بسته کنید:
context.Database.Connection.Open();
...
...
context.Database.Connection.Close();
نقل قول: مدیریت درخواست های زیاد به برنامه در Entity Framework
نقل قول:
نوشته شده توسط
مهدی کرامتی
ممکنه ورژنی از SQL Server که روی سرور شما نصبه نگارش پایین (مثلا Developer Edition) است و تعداد کانکشن های زیادی رو پشتیبانی نمی کنه.
نسخه ی روی سرور Enterprise هست و از اون جهت مشکلی نیست.
نقل قول:
نوشته شده توسط
مهدی کرامتی
همچنین، می توانید به صورت دستی کانکشن ها رو قبل از Query باز و بسته کنید:
context.Database.Connection.Open();
...
...
context.Database.Connection.Close();
ممنون این رو هم امتحان میکنم.
مشکل با سوالی که از من پرسیدید حل شد. برای توابعی که در صفحاتم تعداد دفعات زیادی فراخوانی می شدند با استفاده از using یک Context جدید ساختم. هم سرعت بارگذاری صفحات خیلی خوب شد و هم تعداد خطاهای وابسته به این موضوع به صفر رسید. امیدوارم که راه درستی رو برای تست تحمل بار انتخاب کرده باشم.
از راهنمایی و حوصله ی شما در پاسخگویی تون خیلی متشکرم :قلب::قلب::قلب:
نقل قول: مدیریت درخواست های زیاد به برنامه در Entity Framework
خوشحالم که مشکلت حل شد :قلب: