Resilience4j في Java: دليل شامل مع أمثلة عملية

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

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

ابدأ الدورة

ما هو Resilience4j ولماذا تحتاجه؟

Resilience4j هي مكتبة خفيفة الوزن للغة Java، مصممة لتحسين تحمل الأخطاء (resilience) في الخدمات المصغرة والأنظمة الموزعة. توفر مجموعة من المكونات الجاهزة التي تساعد في حماية تطبيقك من الأعطال المتسلسلة، والتحميل الزائد، والاستجابات البطيئة من الخدمات الخارجية (قواعد البيانات، واجهات API، قوائم انتظار الرسائل، إلخ).

المهمة الأساسية للمكتبة هي تنفيذ أنماط تحمل الأخطاء، مثل Circuit Breaker (فصل الخدمة المعطلة تلقائيًا)، Rate Limiter (تحديد معدل الطلبات)، Retry (إعادة المحاولة)، Bulkhead (عزل الموارد)، Time Limiter (تحديد وقت التنفيذ)، وCache (تخزين النتائج مؤقتًا).

تتكامل المكتبة بشكل مثالي مع نظام Spring Boot، ولكن يمكن استخدامها أيضًا في أي تطبيق Java آخر. تعتبر Resilience4j البديل الحديث للمكتبة القديمة Hystrix من Netflix.

التثبيت (Maven/Gradle)

Resilience4j هي مكتبة Java، لذا يتم تثبيتها عبر أنظمة البناء Maven أو Gradle. على عكس Python، لا يتم استخدام أمر pip install هنا.

Maven (pom.xml)

<dependency>
    <groupId>io.github.resilience4j</groupId>
    <artifactId>resilience4j-all</artifactId>
    <version>2.2.0</version>
</dependency>

<!-- إضافي لـ Spring Boot -->
<dependency>
    <groupId>io.github.resilience4j</groupId>
    <artifactId>resilience4j-spring-boot3</artifactId>
    <version>2.2.0</version>
</dependency>

Gradle (build.gradle)

implementation 'io.github.resilience4j:resilience4j-all:2.2.0'
implementation 'io.github.resilience4j:resilience4j-spring-boot3:2.2.0'

بداية سريعة مع مثال كود

لننشئ مثالًا بسيطًا لاستخدام Circuit Breaker. افترض أن لدينا دالة تستدعي واجهة API خارجية. نريد أنه إذا استجابت الـ API بخطأ 5 مرات متتالية، فإن الاستدعاءات التالية تعيد قيمة احتياطية (fallback) فورًا، دون تحميل الخدمة المعطلة.

import io.github.resilience4j.circuitbreaker.CircuitBreaker;
import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;
import io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry;
import java.time.Duration;
import java.util.function.Supplier;

public class QuickStartExample {

    public static void main(String[] args) {
        // 1. إنشاء إعدادات Circuit Breaker
        CircuitBreakerConfig config = CircuitBreakerConfig.custom()
                .failureRateThreshold(50) // نسبة الأخطاء المسموحة
                .waitDurationInOpenState(Duration.ofMillis(1000)) // مدة البقاء في الحالة المفتوحة
                .slidingWindowSize(5) // حجم النافذة المنزلقة لحساب الأخطاء
                .build();

        // 2. إنشاء السجل و Circuit Breaker
        CircuitBreakerRegistry registry = CircuitBreakerRegistry.of(config);
        CircuitBreaker circuitBreaker = registry.circuitBreaker("myService");

        // 3. تغليف الاستدعاء الخطير
        Supplier<String> decoratedSupplier = CircuitBreaker
                .decorateSupplier(circuitBreaker, QuickStartExample::riskyOperation);

        // 4. التنفيذ عدة مرات
        for (int i = 0; i < 10; i++) {
            try {
                String result = decoratedSupplier.get();
                System.out.println("نجاح: " + result);
            } catch (Exception e) {
                System.out.println("خطأ: " + e.getMessage());
            }
        }
    }

    // محاكاة خدمة خارجية غير موثوقة
    public static String riskyOperation() {
        if (Math.random() > 0.3) {
            throw new RuntimeException("الخدمة غير متاحة مؤقتًا!");
        }
        return "بيانات                    

توصيات