
Circuit Breaker Pattern: Giải Pháp Cho Hệ Thống Phân Tán
Table Of Content
- Giới Thiệu
- Circuit Breaker Pattern Là Gì?
- Các Trạng Thái Của Circuit Breaker
- 1. Closed (Đóng)
- 2. Open (Mở)
- 3. Half-Open (Bán Mở)
- Lợi Ích Của Circuit Breaker
- Cách Triển Khai Circuit Breaker
- Sử dụng Polly trong ASP.NET Core
- 1. Cấu hình Circuit Breaker
- 2. Áp dụng Circuit Breaker vào HTTP Request
- 3. Tích hợp với HttpClient Factory trong ASP.NET Core
- Các Trường Hợp Sử Dụng Circuit Breaker
- Các Thông Số Cần Cấu Hình
- Kết Luận
Giới Thiệu
Trong hệ thống phân tán, một service có thể phụ thuộc vào nhiều service khác. Khi một trong các service bị sự cố, việc gửi request liên tục đến service đang lỗi sẽ dẫn đến timeout, overload, và làm giảm hiệu suất của hệ thống. Circuit Breaker Pattern là giải pháp giúp ngăn chặn tình trạng này, bằng cách giảm thiểu request đến service bị lỗi và từ đó bảo vệ hệ thống.
Circuit Breaker giúp tránh việc tiêu tốn tài nguyên vào các request thất bại, đồng thời cung cấp cơ chế phục hồi thông minh để đảm bảo hệ thống không bị sập do các lỗi liên tiếp. Nó đặc biệt quan trọng trong các hệ thống microservices, nơi mà một lỗi nhỏ trong một service có thể gây ảnh hưởng dây chuyền đến toàn bộ hệ thống.
Circuit Breaker Pattern Là Gì?
Circuit Breaker Pattern hoạt động giống như một cầu dao điện. Khi hệ thống hoạt động bình thường, nó cho phép tất cả các request đi qua. Nhưng nếu hệ thống phát hiện quá nhiều lỗi, nó sẽ tự động “ngắt điện”, chặn các request tiếp theo trong một khoảng thời gian nhất định để tránh gây quá tải.
Ba trạng thái chính của Circuit Breaker:
- Closed (Đóng): Hệ thống hoạt động bình thường, tất cả request đều được gửi đi.
- Open (Mở): Khi số lượng request thất bại vượt quá ngưỡng cho phép, Circuit Breaker sẽ chuyển sang trạng thái Open và từ chối mọi request mới trong một khoảng thời gian nhất định.
- Half-Open (Bán Mở): Sau một khoảng thời gian, hệ thống sẽ thử gửi một số request để kiểm tra xem service có hoạt động trở lại hay không.
Các Trạng Thái Của Circuit Breaker
1. Closed (Đóng)
- Request được gửi bình thường.
- Nếu số lần lỗi vượt quá ngưỡng, chuyển sang trạng thái Open.
2. Open (Mở)
- Tất cả request tiếp theo bị từ chối ngay lập tức.
- Hệ thống sẽ không thử lại trong khoảng thời gian được định trước.
3. Half-Open (Bán Mở)
- Một số request thử nghiệm được gửi đi.
- Nếu request thành công, chuyển lại trạng thái Closed.
- Nếu thất bại, trở lại trạng thái Open.
Lợi Ích Của Circuit Breaker
- Bảo vệ hệ thống khỏi lỗi lan truyền: Khi một service bị lỗi, nó không làm sập các service khác.
- Tối ưu hiệu suất hệ thống: Tránh việc gửi request liên tục đến một service không hoạt động.
- Giúp hệ thống phục hồi tự động: Sau một khoảng thời gian, Circuit Breaker sẽ tự động kiểm tra lại service.
Cách Triển Khai Circuit Breaker
Sử dụng Polly trong ASP.NET Core
Polly là một thư viện mạnh mẽ giúp triển khai Circuit Breaker dễ dàng trong .NET. Nó cho phép bạn cấu hình linh hoạt các chính sách retry, timeout, và Circuit Breaker để cải thiện độ bền vững của hệ thống.
1. Cấu hình Circuit Breaker
Dưới đây là cách cấu hình Circuit Breaker với Polly để chặn request sau một số lần lỗi nhất định:
var circuitBreakerPolicy = Policy
.Handle<HttpRequestException>() // Bắt lỗi HTTP request
.Or<TaskCanceledException>() // Xử lý lỗi timeout
.CircuitBreakerAsync(
exceptionsAllowedBeforeBreaking: 3, // Số lần lỗi trước khi chuyển sang Open
durationOfBreak: TimeSpan.FromSeconds(30), // Thời gian giữ trạng thái Open
onBreak: (exception, timespan) =>
{
Console.WriteLine($"Circuit Breaker Open. Lỗi: {exception.Message}. Sẽ thử lại sau {timespan}.");
},
onReset: () =>
{
Console.WriteLine("Circuit Breaker Reset. Hệ thống hoạt động bình thường trở lại.");
},
onHalfOpen: () =>
{
Console.WriteLine("Circuit Breaker Half-Open. Kiểm tra lại hệ thống...");
});
2. Áp dụng Circuit Breaker vào HTTP Request
public async Task<string> CallExternalServiceAsync()
{
return await circuitBreakerPolicy.ExecuteAsync(async () =>
{
using var httpClient = new HttpClient();
var response = await httpClient.GetAsync("https://example.com/api/data");
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
});
}
3. Tích hợp với HttpClient Factory trong ASP.NET Core
Bạn có thể tích hợp Polly vào HttpClient Factory để áp dụng Circuit Breaker tự động cho các request mà không cần thay đổi code trong từng phương thức riêng lẻ.
services.AddHttpClient<IMyService, MyService>()
.AddPolicyHandler(Policy
.Handle<HttpRequestException>()
.Or<TaskCanceledException>()
.CircuitBreakerAsync(3, TimeSpan.FromSeconds(30)));
Với cách này, mọi request HTTP được thực hiện bởi IMyService
sẽ được bảo vệ bằng Circuit Breaker mà không cần thêm logic vào từng phương thức gọi API.
Các Trường Hợp Sử Dụng Circuit Breaker
Circuit Breaker được sử dụng trong nhiều tình huống thực tế, bao gồm:
- Gọi API bên ngoài: Khi hệ thống cần gọi các API bên ngoài mà không kiểm soát được thời gian phản hồi.
- Dữ liệu không nhất quán: Khi một database hoặc cache server đang bị quá tải và cần thời gian phục hồi.
- Các hệ thống microservices: Khi một service A phụ thuộc vào service B và cần tránh việc service A bị ảnh hưởng bởi lỗi của service B.
Các Thông Số Cần Cấu Hình
Khi triển khai Circuit Breaker, có một số thông số quan trọng bạn cần cấu hình:
- Số lần lỗi cho phép trước khi mở Circuit Breaker (exceptionsAllowedBeforeBreaking)
- Thời gian giữ trạng thái Open (durationOfBreak)
- Hành vi khi Circuit Breaker chuyển sang Open (onBreak)
- Cách hệ thống thử lại khi chuyển sang Half-Open (onHalfOpen)
Kết Luận
Circuit Breaker Pattern là một giải pháp quan trọng trong hệ thống phân tán, giúp tăng độ bền vững và hiệu suất. Polly là một thư viện mạnh mẽ trong .NET giúp triển khai Circuit Breaker dễ dàng trong các ứng dụng ASP.NET Core. Khi thiết kế hệ thống, việc sử dụng Circuit Breaker sẽ góp phần giảm thiểu downtime và đảm bảo trải nghiệm người dùng tốt hơn.
Bằng cách triển khai Circuit Breaker, bạn có thể kiểm soát tốt hơn cách hệ thống phản ứng với lỗi và tránh việc làm sập toàn bộ ứng dụng do một service duy nhất gặp sự cố. Nếu bạn đang phát triển một hệ thống microservices hoặc có nhiều dịch vụ phụ thuộc vào nhau, đây là một pattern không thể thiếu để giữ cho hệ thống của bạn luôn ổn định và mạnh mẽ.
No Comment! Be the first one.