تحديد معدل الطلبات في Java: المكتبات والأدوات للتحكم في الطلبات (Bucket4j, Resilience4j)

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

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

ابدأ الدورة

تحديد معدل الطلبات (Rate Limiting) في Java: نظرة عامة على المكتبات والأدوات

\n\n

تحديد معدل الطلبات (Rate limiting) هو آلية بالغة الأهمية لحماية خدمات الويب وواجهات API والخدمات المصغرة من الأحمال الزائدة وهجمات حجب الخدمة (DDoS) وسوء الاستخدام العشوائي. في Java، توجد العديد من المكتبات الناضجة التي تنفذ خوارزميات مختلفة: من العداد البسيط إلى الأنظمة الموزعة المعقدة. في هذه المقالة، سننظر في ثلاثة أساليب رئيسية: Guava RateLimiter وBucket4j وResilience4j، بالإضافة إلى مناقشة تطبيقاتها.

\n\n

1. Guava RateLimiter (بسيط وخفيف الوزن)

\n\n

توفر مكتبة Google Guava الفئة RateLimiter، التي تنفذ خوارزمية Token Bucket (سلة الرموز) في وضع أحادي الخيط. وهي مثالية للاستخدام المحلي داخل عملية JVM واحدة.

\n\n

مبدأ العمل: تمتلئ السلة بالرموز بمعدل معين. كل طلب يأخذ رمزًا واحدًا أو أكثر. إذا لم تكن الرموز كافية، يتم حظر الخيط أو رفض الطلب.

\n\n

مثال على استخدام Guava RateLimiter:

\n\n
import com.google.common.util.concurrent.RateLimiter;\n\npublic class GuavaRateLimiterExample {\n    public static void main(String[] args) {\n        // إنشاء RateLimiter بمعدل 10 طلبات في الثانية\n        RateLimiter rateLimiter = RateLimiter.create(10.0);\n\n        // محاكاة الطلبات الواردة\n        for (int i = 0; i < 20; i++) {\n            // tryAcquire() ترجع true إذا تم الحصول على رمز\n            if (rateLimiter.tryAcquire()) {\n                System.out.println("تم تنفيذ الطلب " + i);\n            } else {\n                System.out.println("تم رفض الطلب " + i + " (تم تجاوز الحد)");\n            }\n        }\n    }\n}\n
\n\n

الإيجابيات: اعتماديات ضئيلة، بساطة، استهلاك منخفض للذاكرة.
\nالسلبيات: غير مناسب للأنظمة الموزعة (لا تتم المزامنة بين النسخ).

\n\n

2. Bucket4j (Token Bucket متقدم مع دعم Redis)

\n\n

Bucket4j هي مكتبة تنفذ خوارزمية Token Bucket مع إمكانيات موسعة: دعم العديد من موفري تخزين الحالة (in-memory، Redis، Hazelcast، Infinispan)، مما يسمح باستخدامها في السيناريوهات الموزعة.

\n\n

الميزات الرئيسية:

\n
    \n
  • دعم أوضاع greedy و interval-based.
  • \n
  • إمكانية تعيين حدود لنوافذ زمنية مختلفة (مثل 100 طلب في الدقيقة + 10 طلبات في الثانية).
  • \n
  • التكامل مع Jakarta EE / Spring Boot من خلال عوامل تصفية (filters) ووسوم (annotations) جاهزة.
  • \n
\n\n

مثال مع تخزين in-memory:

\n\n
import io.github.bucket4j.Bandwidth;\nimport io.github.bucket4j.Bucket;\nimport io.github.bucket4j.Refill;\n\nimport java.time.Duration;\n\npublic class Bucket4jExample {\n    public static void main(String[] args) {\n        // الحد: 5 طلبات في 10 ثوانٍ\n        Bandwidth limit = Bandwidth.classic(5, Refill.intervally(5, Duration.ofSeconds(10)));\n        Bucket bucket = Bucket.builder()\n                .addLimit(limit)\n                .build();\n\n        for (int i = 0; i < 10; i++) {\n            if (bucket.tryConsume(1)) {\n                System.out.println("الطلب " + i + " مسموح به");\n            } else {\n                System.out.println("الطلب " + i + " محظور");\n            }\n        }\n    }\n}\n
\n\n

الإيجابيات: إعدادات مرنة، دعم موزع، أداء عالٍ.
\nالسلبيات: اعتماديات أكثر من Guava.

\n\n

3. Resilience4j RateLimiter (لهندسة الخدمات المصغرة)

\n\n

Resilience4j هي مكتبة لضمان تحمل الأخطاء، تتضمن وحدة RateLimiter. تم تطويرها مع مراعاة

توصيات