Circuit Breaker Pattern একটি ডিজাইন প্যাটার্ন যা মাইক্রোসার্ভিস বা ডিসট্রিবিউটেড সিস্টেমে ব্যবহৃত হয়। এর প্রধান উদ্দেশ্য হলো নির্ভরশীল সিস্টেম বা সার্ভিসে ব্যর্থতার কারণে অ্যাপ্লিকেশনের বাকি অংশে প্রভাব পড়া থেকে রক্ষা করা। এটি এমন একটি প্রক্রিয়া যেখানে সার্ভিসে সমস্যা হলে ঐ সার্ভিসের প্রতি রিকোয়েস্ট সাময়িকভাবে বন্ধ (open) করে রাখা হয় এবং সময়মতো পুনরায় পরীক্ষা (retry) করে দেখা হয়।
Circuit Breaker Pattern এর কাজের মূলনীতি
Circuit Breaker তিনটি স্টেটে কাজ করে:
- Closed State:
সার্ভিসে সব রিকোয়েস্ট স্বাভাবিকভাবে প্রসেস হয়। যদি রিকোয়েস্টের ব্যর্থতার হার একটি নির্দিষ্ট সীমা অতিক্রম করে, সার্কিট "Open" হয়। - Open State:
রিকোয়েস্ট সরাসরি ব্যর্থ হয় এবং নির্ধারিত সময় পর্যন্ত সার্ভিসে আর কোনো রিকোয়েস্ট পাঠানো হয় না। - Half-Open State:
একটি নির্ধারিত সময় পর সার্কিট কিছু রিকোয়েস্ট পাঠানোর অনুমতি দেয়। যদি রিকোয়েস্ট সফল হয়, সার্কিট "Closed" অবস্থায় ফিরে আসে; অন্যথায় "Open" অবস্থায় থাকে।
কেন Circuit Breaker প্রয়োজন?
- সার্ভিস ব্যর্থতা হ্রাস করা:
নির্ভরশীল সার্ভিসের ব্যর্থতার কারণে অ্যাপ্লিকেশনকে পুরোপুরি ভেঙে পড়া থেকে রক্ষা করা। - সিস্টেম স্থিতিশীল রাখা:
সার্ভিসের ওভারলোড এড়ানো এবং ফেইল্ড রিকোয়েস্টের চাপ হ্রাস করা। - রিকভারি সহজ করা:
সার্ভিস স্বাভাবিক অবস্থায় ফিরে এলে পুনরায় স্বয়ংক্রিয়ভাবে সার্ভিসের সাথে সংযোগ স্থাপন। - Latency হ্রাস:
বারবার ব্যর্থ রিকোয়েস্টের কারণে দেরি হওয়া থেকে বাঁচানো।
Spring Boot এ Circuit Breaker Pattern ইমপ্লিমেন্ট করা
Spring Boot এ Circuit Breaker ইমপ্লিমেন্ট করতে Resilience4j বা Spring Cloud Circuit Breaker ব্যবহার করা হয়।
১. Maven Dependency:
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-spring-boot2</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
২. Configuration
application.yml এ Circuit Breaker কনফিগার করুন:
resilience4j:
circuitbreaker:
configs:
default:
slidingWindowSize: 10
failureRateThreshold: 50
waitDurationInOpenState: 5000ms
permittedNumberOfCallsInHalfOpenState: 3
instances:
myCircuitBreaker:
baseConfig: default
৩. Circuit Breaker ব্যবহার করা
API কল সার্ভিস তৈরি করুন:
import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class ApiService {
private final RestTemplate restTemplate = new RestTemplate();
@CircuitBreaker(name = "myCircuitBreaker", fallbackMethod = "fallbackResponse")
public String fetchData() {
String url = "https://api.example.com/data";
return restTemplate.getForObject(url, String.class);
}
// Fallback Method
public String fallbackResponse(Throwable t) {
return "Default Response: Service is temporarily unavailable.";
}
}
৪. Circuit Breaker Monitor করা
Actuator ব্যবহার করে Circuit Breaker এর স্টেট মনিটর করতে পারেন।
Actuator Dependency:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
application.yml এ Actuator Enable করুন:
management:
endpoints:
web:
exposure:
include: resilience4j.circuitbreakers
Actuator Endpoint চেক করুন:
GET http://localhost:8080/actuator/resilience4j/circuitbreakers
উদাহরণ রেসপন্স
Success Response:
{
"data": "Successfully fetched data from the API."
}
Fallback Response:
{
"data": "Default Response: Service is temporarily unavailable."
}
Circuit Breaker এর Best Practices
- Fallback ব্যবহার করুন:
ব্যর্থ হলে ডিফল্ট বা ক্যাশড রেসপন্স প্রদান করুন। - Timeout কনফিগার করুন:
সার্ভিসের টাইমআউট সঠিকভাবে নির্ধারণ করুন। - Monitor এবং Log:
সার্কিটের ওপেন এবং ক্লোজড স্টেট মনিটর করুন এবং ব্যর্থতার কারণ লগ করুন। - Combine with Retry:
Circuit Breaker এর সাথে Retry Pattern ব্যবহার করুন।
Circuit Breaker এর সুবিধা:
- সার্ভিস স্থিতিশীল রাখে।
- মাইক্রোসার্ভিস আর্কিটেকচারে নির্ভরযোগ্যতা বৃদ্ধি করে।
- ব্যর্থ রিকোয়েস্টের কারণে ওভারলোডিং এড়ায়।
এইভাবে, Circuit Breaker Pattern ইমপ্লিমেন্ট করে আপনি আপনার অ্যাপ্লিকেশনকে আরও স্থিতিশীল এবং নির্ভরযোগ্য করে তুলতে পারবেন।
Read more