تحديد المعدل في C# (.NET): دليل شامل لمكتبة System.Threading.RateLimiting

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

تحديد المعدل في C# (.NET): مكتبة System.Threading.RateLimiting



تحديد المعدل (Rate Limiting) هو آلية بالغة الأهمية لحماية واجهات برمجة التطبيقات (API) والخدمات المصغرة وتطبيقات الويب من الأحمال الزائدة وهجمات حجب الخدمة (DDoS) والاستهلاك غير المنضبط للموارد. في نظام .NET البيئي، بدءًا من .NET 7، ظهرت مكتبة مدمجة System.Threading.RateLimiting توفر أدوات مرنة وعالية الأداء لتنفيذ استراتيجيات تحديد مختلفة.



ما هو تحديد المعدل ولماذا هو مطلوب؟

يسمح تحديد المعدل بالتحكم في عدد العمليات (الطلبات، استدعاءات الدوال، المعاملات) خلال فترة زمنية محددة. حالات الاستخدام الرئيسية:

  • حماية واجهات برمجة التطبيقات العامة — منع إساءة الاستخدام من قبل العملاء.
  • استقرار النظام الخلفي — توزيع متساوٍ للحمل على قواعد البيانات والخدمات الخارجية.
  • توفير الموارد — الحد من استدعاءات واجهات برمجة التطبيقات الخارجية المدفوعة.
  • ضمان اتفاقيات مستوى الخدمة (SLA) — ضمان وصول متساوٍ لجميع المستخدمين.


المكونات الرئيسية لمكتبة System.Threading.RateLimiting

تم بناء المكتبة حول الفئة المجردة RateLimiter والعديد من التطبيقات الجاهزة:



1. TokenBucketRateLimiter (خوارزمية "دلو الرموز")

خوارزمية كلاسيكية تقوم بتجميع الرموز بمعدل محدد (معدل إعادة التعبئة) وتسمح باستخدامها حسب الحاجة. مناسبة لتنعيم الأحمال الذروة.

using System.Threading.RateLimiting;

var limiter = new TokenBucketRateLimiter(new TokenBucketRateLimiterOptions{ TokenLimit = 100, // الحد الأقصى لعدد الرموز TokensPerPeriod = 20, // عدد الرموز المضافة لكل فترة ReplenishmentPeriod = TimeSpan.FromSeconds(1), // فترة إعادة التعبئة QueueLimit = 10, // الحد الأقصى لحجم قائمة الانتظار QueueProcessingOrder = QueueProcessingOrder.OldestFirst});

// مثال على الاستخدامusing var lease = await limiter.AcquireAsync(cancellationToken: CancellationToken.None);if (lease.IsAcquired){ // تنفيذ العملية Console.WriteLine("تم الحصول على الرمز");}else{ // معالجة الرفض Console.WriteLine("تم تجاوز الحد، حاول لاحقًا");}


2. ConcurrencyLimiter (تحديد التزامن)

يحد من عدد العمليات المتزامنة. مثالي للتحكم في الوصول إلى الموارد المحدودة (مجموعات الاتصالات، واصفات الملفات).

var concurrencyLimiter = new ConcurrencyLimiter(new ConcurrencyLimiterOptions{    PermitLimit = 10,           // الحد الأقصى 10 طلبات متزامنة    QueueLimit = 5,             // قائمة انتظار تصل إلى 5 طلبات    QueueProcessingOrder = QueueProcessingOrder.NewestFirst});

// الاستخدام في سياق غير متزامنasync Task ProcessRequestAsync(){ using var lease = await concurrencyLimiter.AcquireAsync(); if (lease.IsAcquired) { // تنفيذ مهمة تستهلك موارد await Task.Delay(1000); }}


3. FixedWindowRateLimiter (نافذة ثابتة)

أبسط خوارزمية: تسمح بـ N عملية خلال فترة زمنية ثابتة (مثل 100 طلب في الدقيقة). بعد انتهاء النافذة، يتم إعادة تعيين العداد.

var fixedWindow = new FixedWindowRateLimiter(new FixedWindowRateLimiterOptions{    PermitLimit = 60,               // 60 طلبًا    Window = TimeSpan.FromMinutes(1), // خلال دقيقة واحدة    QueueLimit = 0,                 // بدون قائمة انتظار    AutoReplenishment = true        // إعادة تعيين تلقائي للنافذة});

// التحقق من الحدRateLimitLease lease = fixedWindow.AttemptAcquire();if (lease.IsAcquired){ Console.WriteLine($"المحاولات المتبقية: {lease.GetAllMetadata()}");}


4. SlidingWindowRateLimiter (نافذة منزلقة)

أك

توصيات