# CircuitBreaker

***

Circuit Breaker là một mẫu thiết kế trong lĩnh vực phần mềm, được sử dụng để quản lý lỗi và tăng độ ổn định của hệ thống phân tán hoặc các dịch vụ microservices. Dưới đây là những điểm quan trọng cần biết về Circuit Breaker:

#### 1. **Khái Niệm Circuit Breaker**

Circuit Breaker hoạt động giống như cầu chì trong hệ thống điện. Khi một phần của hệ thống gặp lỗi hoặc hoạt động không ổn định, Circuit Breaker sẽ "ngắt" kết nối tạm thời để ngăn ngừa lỗi lan rộng và gây ảnh hưởng đến toàn bộ hệ thống.

#### 2. **Lợi Ích của Circuit Breaker**

* **Giảm tải lỗi:** Ngăn chặn sự cố ở một dịch vụ lan truyền đến các dịch vụ khác.
* **Tăng tính ổn định:** Hệ thống tổng thể có thể xử lý lỗi một cách thông minh hơn và giảm nguy cơ gián đoạn toàn hệ thống.
* **Cải thiện trải nghiệm người dùng:** Thay vì để người dùng chờ lâu hoặc gặp lỗi không mong muốn, hệ thống có thể phản hồi nhanh hơn với thông báo lỗi thích hợp.

#### 3. **Trạng Thái của Circuit Breaker**

Circuit Breaker thường có ba trạng thái chính:

* **Closed (Đóng):** Mọi yêu cầu được gửi đi bình thường. Nếu số lượng lỗi vượt ngưỡng định trước, Circuit Breaker sẽ chuyển sang trạng thái Open.
* **Open (Mở):** Các yêu cầu sẽ không được gửi đi mà thay vào đó nhận phản hồi lỗi ngay lập tức. Circuit Breaker sẽ chờ một khoảng thời gian định trước trước khi chuyển sang trạng thái Half-Open.
* **Half-Open (Nửa Mở):** Một số ít yêu cầu được gửi đi để kiểm tra xem lỗi đã được khắc phục hay chưa. Nếu các yêu cầu thành công, Circuit Breaker sẽ chuyển về trạng thái Closed. Nếu không, nó sẽ trở lại trạng thái Open.

#### 4. **Cách Implement Circuit Breaker**

* **Sử dụng thư viện:** Các thư viện như Netflix Hystrix, Resilience4j (Java) hỗ trợ triển khai Circuit Breaker dễ dàng.
* **Cấu hình ngưỡng lỗi:** Định nghĩa số lượng yêu cầu lỗi tối đa trước khi Circuit Breaker chuyển trạng thái.
* **Cấu hình thời gian chờ:** Thời gian Circuit Breaker giữ trạng thái Open trước khi thử lại (Half-Open).

#### 5. **Khi Nào Dùng Circuit Breaker**

* Khi các dịch vụ phụ thuộc lẫn nhau có khả năng gặp lỗi hoặc quá tải.
* Khi hệ thống cần đảm bảo tính liên tục và ổn định, tránh sự cố lan rộng.
* Khi muốn cải thiện khả năng chịu lỗi của hệ thống và tối ưu hóa trải nghiệm người dùng.

#### 6. **Kết Hợp với Các Mẫu Khác**

Circuit Breaker thường được kết hợp với các mẫu thiết kế khác như Retry (thử lại), Fallback (giải pháp thay thế) để tối ưu hóa khả năng phục hồi lỗi.

***

Circuit Breaker là một công cụ quan trọng trong việc xây dựng các hệ thống microservices và ứng dụng phân tán có khả năng chịu lỗi cao. Nó giúp cải thiện sự ổn định và khả năng phản hồi của hệ thống trong các tình huống lỗi hoặc quá tải.

***

Netflix Hystrix và Resilience4j là hai thư viện phổ biến trong Java, được sử dụng để triển khai các mẫu thiết kế chịu lỗi, như Circuit Breaker, nhằm tăng độ ổn định và khả năng phục hồi của hệ thống phân tán hoặc microservices. Dưới đây là chi tiết về từng thư viện:

#### 1. **Netflix Hystrix**

**Hystrix** là một thư viện của Netflix, được thiết kế để giúp các ứng dụng microservices ngăn ngừa các lỗi lan rộng, giảm thiểu ảnh hưởng của lỗi, và tăng cường khả năng chịu lỗi.

**Các Tính Năng Chính:**

* **Circuit Breaker:** Ngăn chặn lỗi lan rộng bằng cách "ngắt" các kết nối không ổn định.
* **Timeout:** Đặt thời gian chờ tối đa cho các yêu cầu, giúp tránh việc chờ đợi vô thời hạn.
* **Fallback:** Cung cấp một phương án thay thế khi một dịch vụ không khả dụng.
* **Bulkhead Isolation:** Giới hạn số lượng luồng sử dụng một dịch vụ cụ thể để tránh quá tải toàn bộ hệ thống.
* **Metrics & Monitoring:** Cung cấp các thông số giám sát và theo dõi hiệu suất của các dịch vụ.

**Lý Do Sử Dụng Hystrix:**

* Được sử dụng rộng rãi trong các hệ thống lớn.
* Tích hợp dễ dàng với các công cụ giám sát như Netflix's Turbine, giúp theo dõi trạng thái của các Circuit Breaker.

**Lưu Ý:**

Netflix đã ngừng phát triển Hystrix vào cuối năm 2018, khuyến nghị sử dụng các giải pháp hiện đại hơn như Resilience4j.

***

#### 2. **Resilience4j**

**Resilience4j** là một thư viện nhẹ, hiện đại và linh hoạt hơn, được xây dựng để thay thế Netflix Hystrix, cung cấp các tính năng tương tự nhưng với hiệu suất tốt hơn và hỗ trợ cho lập trình phản ứng (Reactive programming).

**Các Tính Năng Chính:**

* **Circuit Breaker:** Tương tự Hystrix, cho phép kiểm soát trạng thái của các kết nối không ổn định.
* **Retry:** Tự động thử lại các yêu cầu thất bại theo một số lần nhất định.
* **Rate Limiter:** Hạn chế số lượng yêu cầu trong một khoảng thời gian cụ thể để tránh quá tải.
* **Bulkhead:** Cô lập tài nguyên giữa các dịch vụ để ngăn chặn một dịch vụ quá tải ảnh hưởng đến toàn bộ hệ thống.
* **Timeout:** Giới hạn thời gian chờ của các yêu cầu.
* **Fallback:** Cung cấp giải pháp thay thế khi dịch vụ chính không khả dụng.

**Lợi Ích của Resilience4j:**

* **Nhẹ và Linh Hoạt:** Thiết kế module, bạn chỉ cần thêm các tính năng bạn cần.
* **Tích Hợp với Spring Boot:** Dễ dàng tích hợp với Spring Boot, đặc biệt khi sử dụng Spring Cloud.
* **Hỗ Trợ Reactive:** Tích hợp tốt với các hệ thống reactive như Project Reactor.
* **Hiệu Suất Cao:** Tối ưu hóa cho các ứng dụng hiện đại, sử dụng ít tài nguyên hơn so với Hystrix.

**Lý Do Chọn Resilience4j:**

* Được hỗ trợ và phát triển tích cực.
* Hỗ trợ nhiều mô hình lập trình khác nhau, bao gồm cả lập trình phản ứng.
* Thích hợp cho các ứng dụng microservices hiện đại.

***

#### Tóm Tắt:

* **Netflix Hystrix**: Là thư viện đầu tiên giúp phổ biến mô hình Circuit Breaker, nhưng đã ngừng phát triển.
* **Resilience4j**: Là thư viện hiện đại, nhẹ, hiệu suất cao, và là lựa chọn thay thế chính thức cho Hystrix.

Nếu bạn đang xây dựng một ứng dụng mới hoặc cần một giải pháp tối ưu cho hệ thống microservices, **Resilience4j** là lựa chọn được khuyến nghị.
