تحديد معدل الطلبات في TypeScript: المكتبات والأدوات وأمثلة التنفيذ

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

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

ابدأ الدورة

تحديد معدل الطلبات في TypeScript: دليل شامل للأدوات والتنفيذ



تحديد معدل الطلبات (Rate limiting) هو أحد التقنيات الأساسية لحماية تطبيقات الويب وواجهات API من سوء الاستخدام وهجمات DDoS والتحميل الزائد. في TypeScript، بفضل الكتابة الصارمة والإمكانيات الحديثة، يصبح تنفيذ تحديد معدل الطلبات أنيقًا وموثوقًا بشكل خاص. في هذه المقالة، سنستعرض أفضل المكتبات والخوارزميات وأمثلة الكود لـ TypeScript.



لماذا نحتاج إلى تحديد معدل الطلبات؟

بدون تحديد معدل الطلبات، قد يواجه تطبيقك:

  • تحميل زائد على الخادم — يمكن لعميل واحد إرسال آلاف الطلبات في الثانية
  • هجمات القوة العمياء — تخمين كلمات المرور أو الرموز
  • خسائر مالية — إذا كان كل طلب يتطلب موارد مدفوعة (مثل API OpenAI)
  • توزيع غير متساوٍ للموارد — يمكن لمستخدم واحد استهلاك كل سعة النطاق الترددي


المكتبات الشائعة لتحديد معدل الطلبات في TypeScript



1. bottleneck — أداة تحديد عالمية

واحدة من أشهر المكتبات لتحديد معدل الطلبات في JavaScript/TypeScript. تدعم التقييد بعدد الطلبات في الثانية/الدقيقة، بالإضافة إلى "تعليق" (تراكم) الطلبات في قائمة الانتظار.

import Bottleneck from 'bottleneck';

const limiter = new Bottleneck({ maxConcurrent: 2, // الحد الأقصى 2 طلب متزامن minTime: 1000, // الحد الأدنى ثانية واحدة بين الطلبات reservoir: 10, // الحد الإجمالي للفترة reservoirRefreshAmount: 10, reservoirRefreshInterval: 60 * 1000 // التحديث كل دقيقة});

async function fetchData(url: string): Promise<any> { return limiter.schedule(() => fetch(url));}

// الاستخدامconst users = await Promise.all([ fetchData('/api/users/1'), fetchData('/api/users/2'), fetchData('/api/users/3'), // هذا الطلب سينتظر]);


2. express-rate-limit — لتطبيقات Express.js

الحل القياسي لتقييد الطلبات في تطبيقات Express. يعمل بشكل ممتاز مع TypeScript.

import express from 'express';import rateLimit from 'express-rate-limit';

const app = express();

const apiLimiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15 دقيقة max: 100, // الحد الأقصى 100 طلب standardHeaders: true, // إرجاع رؤوس RateLimit-* legacyHeaders: false, message: { status: 429, message: 'عدد الطلبات كبير جدًا، حاول لاحقًا' }});

app.use('/api/', apiLimiter);

app.listen(3000);


3. rate-limiter-flexible — حل مرن لـ Redis والذاكرة المدمجة

مكتبة تدعم مخازن متنوعة (Redis, Memory, MongoDB, Postgres) وخوارزميات (Token Bucket, Sliding Window).

import { RateLimiterMemory } from 'rate-limiter-flexible';

const rateLimiter = new RateLimiterMemory({ points: 5, // 5 طلبات duration: 1, // خلال ثانية واحدة});

async function checkRateLimit(key: string): Promise<boolean> { try { await rateLimiter.consume(key); return true; // الطلب مسموح } catch (error) { return false; // تجاوز الحد }}

// مثال الاستخدام في Expressapp.post('/api/login', async (req, res) => { const allowed = await checkRateLimit(req.ip); if (!allowed) { return res.status(429).json({ error: 'Too Many Requests' }); } // معالجة تسجيل الدخول...});


خوارزميات تحديد معدل الطلبات

  • Token Bucket — "دلو" من الرموز يتم تجديده بمعدل ثابت. كل طلب يستهلك رمزًا واحدًا. يسمح باندفاعات قصيرة.
  • Sliding Window — نافذة زمنية منزلقة (مثل دقيقة واحدة). تأخذ في الاعتبار الطلبات ليس على فترات زمنية ثابتة، بل على الفترة الأخيرة المحددة.

توصيات