Resilience4j क्या है और इसकी आवश्यकता क्यों है?
Resilience4j एक हल्की Java लाइब्रेरी है, जो माइक्रोसर्विसेज और डिस्ट्रीब्यूटेड सिस्टम की फॉल्ट टॉलरेंस (resilience) बढ़ाने के लिए डिज़ाइन की गई है। यह रेडी-टू-यूज़ कंपोनेंट्स का एक सेट प्रदान करती है, जो आपके एप्लिकेशन को कैस्केडिंग फेलियर, ओवरलोड और बाहरी सर्विसेज (डेटाबेस, API, मैसेज क्यू आदि) से धीमी प्रतिक्रियाओं से बचाने में मदद करते हैं।
इस लाइब्रेरी का मुख्य उद्देश्य फॉल्ट टॉलरेंस पैटर्न को लागू करना है, जैसे Circuit Breaker (समस्याग्रस्त सर्विस को ऑटोमैटिक डिस्कनेक्ट करना), Rate Limiter (रिक्वेस्ट की फ्रीक्वेंसी सीमित करना), Retry (पुनः प्रयास), Bulkhead (संसाधनों को अलग करना), Time Limiter (एक्ज़ीक्यूशन समय सीमित करना) और Cache (परिणामों को कैश करना)।
यह लाइब्रेरी Spring Boot इकोसिस्टम में पूरी तरह फिट बैठती है, लेकिन किसी भी अन्य Java एप्लिकेशन में भी उपयोग की जा सकती है। Resilience4j को Netflix की पुरानी Hystrix लाइब्रेरी का आधुनिक विकल्प माना जाता है।
इंस्टॉलेशन (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 "डेटा सफलतापूर्वक प्राप्त हुआ";
}
}