ASP.NET Core / المتقدم: التحقق والتشغيل الموثوق / الدرس 15
الأداء والتخزين المؤقت وحدود الطلبات
حسن حملا متحققا منه مع الحفاظ على التفويض وعزل المستأجرين وحداثة البيانات واستخدام الموارد المحدود.
في هذه الصفحة
أهداف الدرس
- اختر القياسات قبل ضبط تفاصيل التنفيذ.
- حدد هوية التخزين المؤقت وانتهاءه وإبطاله وخصوصيته.
- ميز حدود المعدل والتزامن من الانتظار غير المحدود.
يحتاج ادعاء الأداء إلى حمل عمل مكافئ
ابدأ بسؤال المورد: توزيع الكمون أو الإنتاجية أو CPU أو التخصيص أو الذاكرة المحتفظ بها أو الضغط على الاعتماديات. سجل إصدارات البناء والتشغيل والإحماء وتوزيع المدخلات والتزامن. لا تمثل نقطة أسرع تتخطى التفويض أو تعيد بيانات متقادمة خارج العقد أو تحمل سجلات مطلوبة أقل تحسنا مكافئا. استخدم التنميط قبل تخمين سطر المصدر المكلف.
تجنب الحجب المتزامن والتخزين الوسيط غير المحدود في مسارات الطلب، لكن لا تضف تجميع الموارد أو التوازي دون تمييز. قد يزيد تقليل عدد التخصيصات الاحتفاظ وتعقيد العمر. أبق اختبارات الصحة والإلغاء والملكية بجانب قياس الأداء. لا يجري المقرر تجربة حمل أو أداء إنتاجي.
مفتاح التخزين المؤقت جزء من عقد الأمان والبيانات
اختر نطاق التخزين وأبعاد المفتاح مما يجعل الرد قابلا لإعادة الاستخدام: المستأجر، والهوية أو الصلاحيات عند الصلة، والمورد وإصداره، والإعداد المحلي، والاستعلام، والتمثيل. قد يسرب مفتاح يغفل المستأجر نتيجة مستأجر لآخر. لا تمنع واجهة للقراءة فقط فوق بيانات مخزنة قابلة للتعديل مرجعا آخر من تغييرها. حدد القيم غير القابلة للتعديل أو النسخ والملكية صراحة.
يستخدم البرنامج الأول MemoryCache محلية حقيقية بمفتاحين مختلفين للمستأجرين عن قصد. يفحص فقط عدم تصادمهما في هذه العينة. ليس اختبار وسيط output cache أو تفويض مستأجر. يحدد التطبيق وحدات حجم MemoryCache، ولا يشكل الإخلاء أو الانتهاء سقفا عاما لذاكرة العملية.
using System;
using Microsoft.Extensions.Caching.Memory;
using var cache = new MemoryCache(new MemoryCacheOptions { SizeLimit = 2 });
cache.Set("tenant-a:report:7", "synthetic-report", new MemoryCacheEntryOptions().SetSize(1));
bool same = cache.TryGetValue("tenant-a:report:7", out string? _);
bool other = cache.TryGetValue("tenant-b:report:7", out string? _);
Console.WriteLine($"sameTenant={same} otherTenant={other}");
sameTenant=True otherTenant=False
تختلف المفاتيح المحلية؛ ولا يجري التحقق من تخزين مخرجات HTTP مؤقتا أو حد مستأجر إنتاجي.
لتخزين الردود وتخزين المخرجات عقدان مختلفان
تصف ترويسات تخزين HTTP سلوك العميل والوسيط، بينما يطبق تخزين مخرجات ASP.NET Core سياسات الخادم المهيأة. لا تعني إضافة الخدمات والوسيط وحدها تخزين كل رد. يجب مراجعة الحمايات الافتراضية واختيارات السياسة المخصصة للمصادقة وملفات الارتباط والحالة وأبعاد التنويع والإبطال. لا تتجاوز السلوك المحافظ ثم تفترض بقاء الردود الخاصة آمنة تلقائيا.
خطط للحداثة والتعامل مع اندفاع الطلبات عند فقدان القيمة المخزنة وتغير الاعتماديات وملكية الإبطال. قد تكون النتيجة السريعة المتقادمة خاطئة حتى لو كانت حالتها 200. اختبر تغير المستخدم والمستأجر وتنويعات الاستعلام والإبطال والردود غير المأذونة عبر مسار الوسيط المهيأ فعليا قبل تقديم ادعاء عن تخزين HTTP.
يحد محدد التزامن التصاريح المتزامنة
يكتسب البرنامج الثاني تصريحين من ConcurrencyLimiter محلي ويتحقق من رفض محاولة اكتساب ثالثة فورية. يختبر مكون المحدد بسعة طابور صفرية، لا تقسيم HTTP أو فرض معدل موزع. يختلف حد التزامن من معدل طلبات لكل نافذة زمنية. ويحتاج كلاهما سياسة رفض وحالة مقصودة.
اختر مفاتيح التقسيم من هوية موثوقة محدودة أو أبعاد مسار، لا سلاسل عميل اعتباطية غير محدودة. قد تتضاعف الحدود المحلية للعملية عبر النسخ، لذا يحتاج الضمان على مستوى الأسطول إلى تصميم مناسب. راجع الطوابير والمهل والإلغاء وسعة الأنظمة اللاحقة معا.
using System;
using System.Threading.RateLimiting;
using var limiter = new ConcurrencyLimiter(new ConcurrencyLimiterOptions { PermitLimit = 2, QueueLimit = 0 });
using var first = limiter.AttemptAcquire();
using var second = limiter.AttemptAcquire();
using var third = limiter.AttemptAcquire();
Console.WriteLine($"first={first.IsAcquired} second={second.IsAcquired} third={third.IsAcquired}");
first=True second=True third=False
يكتسب تصريحين ويرفض الثالث دون انتظار في طابور أو توليد أي حركة طلبات.
احفظ دلالات محدودة عبر المسار كله
راجع حجم الطلب والجسم والترقيم وتخزين الرد وسيطا أو تدفقه والضغط والتسلسل واختيار أعمدة الاستعلام ومجمعات الاتصال والإعادات تحت الحمل الفعلي. لا يقدم توقيت محلي صغير دليلا على كمون الذيل أو السلامة عند فرط الحمل. قد يتفاعل الضغط والتخزين مع الأسرار والتمثيل؛ فتحقق من الخصوصية والصحة بدلا من مطاردة رقم أصغر واحد.
احتفظ بحالات صحة ممثلة وظروف القياس وسبب قبول المفاضلة. أعد الفحص عندما يتغير التشغيل أو الحمل أو سلوك الاعتماد بصورة جوهرية. كل الأمثلة هنا فحوص مكونات محدودة؛ ولا ينفذ إطار قياس أو مولد حمل أو خلفية تخزين مؤقت مهيأة أو خادم تطبيق.
الأخطاء الشائعة وإصلاحها
تعبر نتيجة مخزنة مؤقتا بين مستأجرين.
- لماذا يحدث؟
- يغفل المفتاح أو السياسة بعدا يؤثر في التفويض.
- كيف تصلحه؟
- أعد تصميم هوية التخزين وتحقق من المسار المحمي.
- كيف تتجنب تكراره؟
- اختبر مستخدمين ومستأجرين مختلفين وتغير الصلاحيات.
يوصف حد داخل عملية بأنه سقف للأسطول كله.
- لماذا يحدث؟
- أُغفل تضاعف السعة عبر النسخ.
- كيف تصلحه؟
- حدد نطاق الفرض وتصميما عاما مناسبا إن كان مطلوبا.
- كيف تتجنب تكراره؟
- سجل افتراضات التقسيم والنشر.
يغير تنفيذ أسرع حداثة البيانات أو التحقق.
- لماذا يحدث؟
- لم تحافظ مقارنة الأداء على العقد.
- كيف تصلحه؟
- استعد السلوك المكافئ قبل القياس.
- كيف تتجنب تكراره؟
- أبق فحوص الصحة والخصوصية بجوار دليل الأداء.
اختبر فهمك
1. لماذا لا تثبت إصابة تخزين للمستأجر tenant-a وإخفاق للمستأجر tenant-b أن نقطة عامة آمنة بين المستأجرين؟
اعرض الحل المشروح
يتحكم الاختبار في المفاتيح مباشرة ولا يشمل اشتقاق هوية المستأجر الموثوق أو التفويض أو سياسة تخزين المخرجات أو التسلسل أو الإبطال أو الطلبات المتزامنة. إنه دليل مفيد عن هذه العينة المحلية فقط. اختبر النقطة المحمية الفعلية بهويات متحققة متميزة وملكية موارد، وتحقق من عدم إعادة استخدام بيانات خاصة خارج نطاقها المسموح.
2. يضع المحدد كل طلب زائد في طابور إلى أجل غير مسمى. ما مشكلات الموارد والسلوك المتبقية؟
اعرض الحل المشروح
قد تحتفظ الطلبات المنتظرة بالذاكرة والاتصالات والخدمات محدودة النطاق وتوقعات المستخدم دون عقد اكتمال محدود. حدد سعة الطابور ومهلة الانتظار والإلغاء وحالة الرفض وما يحدث بعد انقطاع العميل. حد العمل اللاحق أيضا. ليس حد التصاريح وحده سياسة فرط حمل كاملة، خاصة مع النسخ أو الإعادات.
أهم ما تعلمته
- حسن سلوكا مكافئا متحققا منه تحت حمل ممثل.
- هوية التخزين المؤقت وسياساته جزء من التفويض والحداثة.
- التصاريح النشطة والطوابير والمعدلات ونطاق النسخ حدود منفصلة.