Câu trả lời:
Nói chung, mục tiêu của mẫu vách ngăn là tránh những lỗi xảy ra ở một bộ phận của hệ thống để đưa toàn bộ hệ thống xuống. Thuật ngữ này xuất phát từ những con tàu mà tàu được chia thành các khoang kín nước riêng biệt để tránh một vết thủng thân tàu gây ngập toàn bộ tàu; nó sẽ chỉ làm ngập một vách ngăn.
Việc triển khai mô hình vách ngăn có thể có nhiều dạng tùy thuộc vào loại lỗi nào bạn muốn bảo vệ hệ thống. Tôi sẽ chỉ thảo luận về các loại lỗi mà Hystrix xử lý trong câu trả lời này.
Tôi nghĩ rằng mẫu vách ngăn đã được phổ biến bởi cuốn sách Release It! của Michael T. Nygard.
Việc triển khai vách ngăn trong Hystrix giới hạn số lượng cuộc gọi đồng thời đến một thành phần . Bằng cách này, số lượng tài nguyên (thường là các luồng) đang chờ phản hồi từ thành phần bị giới hạn.
Giả sử bạn có một yêu cầu có trụ sở, đa ứng dụng ren (ví dụ như một ứng dụng web điển hình) mà sử dụng ba thành phần khác nhau, Một , B , và C . Nếu yêu cầu thành phần C bắt đầu treo, cuối cùng tất cả các xử lý yêu cầu đề sẽ treo trên chờ đợi một câu trả lời từ C . Điều này sẽ làm cho ứng dụng hoàn toàn không phản hồi. Nếu các yêu cầu tới C được xử lý chậm, chúng ta sẽ gặp sự cố tương tự nếu tải đủ cao.
Việc triển khai mẫu vách ngăn của Hystrix giới hạn số lượng lệnh gọi đồng thời đến một thành phần và có thể đã lưu ứng dụng trong trường hợp này. Giả sử chúng ta có 30 chủ đề yêu cầu xử lý và có một giới hạn của 10 cuộc gọi đồng thời để C . Sau đó, tại hầu hết các đề xử lý 10 yêu cầu có thể treo khi gọi C , 20 chủ đề khác vẫn có thể xử lý các yêu cầu và các thành phần sử dụng Một và B .
Hystrix 'có hai cách tiếp cận khác nhau đối với vách ngăn, cách ly luồng và cách ly semaphore.
Cách tiếp cận tiêu chuẩn là chuyển giao tất cả các yêu cầu đến thành phần C đến một nhóm luồng riêng biệt với một số luồng cố định và không có (hoặc một số ít) hàng đợi yêu cầu.
Cách tiếp cận khác là phải có tất cả những người gọi có được một giấy phép (với 0 timeout) trước khi yêu cầu C . Nếu không thể lấy được giấy phép từ semaphore, các lệnh gọi tới C sẽ không được chuyển qua.
Ưu điểm của cách tiếp cận nhóm luồng là các yêu cầu được chuyển đến C có thể hết thời gian chờ, điều không thể xảy ra khi sử dụng semaphores.
Đây là một ví dụ điển hình với giải thích thời gian chạy cho vách ngăn trong Resilience4j được lấy cảm hứng từ Netflix Hystrix.
Các cấu hình ví dụ dưới đây có thể cung cấp một số cách sử dụng rõ ràng.
Cấu hình ví dụ: Cho phép tối đa 5 cuộc gọi đồng thời tại bất kỳ thời điểm nào. Giữ các cuộc gọi khác chờ cho đến khi một trong 5 cuộc gọi đồng thời trong quá trình kết thúc hoặc cho đến khi tối đa là 2 giây.
Ý tưởng là không tạo gánh nặng cho bất kỳ hệ thống nào có tải nhiều hơn mức chúng có thể tiêu thụ. Nếu tải đến lớn hơn mức tiêu thụ, thì hãy đợi thời gian hợp lý hoặc chỉ hết thời gian chờ và chuyển sang đường dẫn thay thế.