لما السيرفر يصرخ "كفاية!".. لازم Rate Limiting

٢٠ أبريل ٢٠٢٥

صممت موقع ، وعلى غير المتوقع وكعادة شغلك حصل على الموقع ضغط بشري او بوتات وكله بضغط على السيرفر. حصل؟

هان كان لازم اتدخل، واستخدم تقنية بنحكيلها Rate Limiting.
Rate Limiting طريقة بتخلي السيرفر يقول:
"ارجع ورا لو سمحت، وحعطيك ليميت محدد خلال مدة زمنية محددة". حددتها؟
يعني مثلاً: "أكتر من 5 طلبات خلال 10 ثواني مرفوض ومش هتعدي".

بهيك تقنية بتحمي موقعك او API من الضغط الزايد، و كل شيء يشتغل بسلاسة.
وخلينا نقول، ليش بنحتاج Rate Limiting في مواقعنا؟
اولا التنظيم لأنه في ناس أو سكربتات ممكن يستمروا في ارسال طلبات بسرعة خيالية.

  • كمان بنوزّع الحمل على السيرفر وبنحميه من العطل.
  • وبهيك بنقدر نحسن تجربة المستخدمين الحقيقيين، مش المشبوهين او الي بتسلوا سبام.

    حكينا كتير ويلا على العملي ..

كيف بنفع نستخدمه في ASP.NET Core؟
فتح عقلك وروح على Program.cs واكتب الكود التالي:

builder.Services.AddRateLimiter(options=>
{options.AddFixedWindowLimiter("fixed", config=>
{
config.Window = TimeSpan.FromSeconds(10);
config.PermitLimit = 5;
config.QueueProcessingOrder = QueueProcessingOrder.OldestFirst
;
config.QueueLimit = 2;
});
});

شو أنواع الـ Rate Limiting؟
في كذا نوع، بس خليني أحكيهم ببساطة:

  1. Fixed Window: يعني عدد محدد من الطلبات خلال وقت معين (مثلاً 5 كل 10) ثواني .
  2. Sliding Window: نفس الفكرة بس بحساب مختلف شوي (كل مرة بنحسب من آخر) طلب .
  3. Token Bucket: كل فترة بيجي رمز، والطلب بيحتاج رمز ليمشي.
  4. Concurrency Limiter: بيحدد كم طلب ممكن يشتغلوا بنفس اللحظة.

ممكن أغير طريقة الرد لما حدا يتجاوز الحد؟
أكيد، تقدر تخلي السيرفر يرد برسالة خاصة، هيك مثلاً

options.OnRejected = async (context, token)=>
{
context.HttpContext.Response.StatusCode = 429;
await context.HttpContext.Response.WriteAsync ("أرسلت طلبات كتير بسرعة!");
};

خلاصة الموضوع
Rate Limiting زي الحارس الشخصي للسيرفر تبعك.
بيقول للناس: "أهلاً وسهلاً، بس واحد واحد لو سمحتوا".
ومش بس للسيكيوريتي، كمان عشان يظل الأداء ثابت وما يصير ضغط غير طبيعي

Mutasem Alsallout

Software Engineer || Asp.net core developer