Gəminin sualtı bölmələri kimi, Thread Pool-ları ayırmaq — bir servis çöksə belə digərlərini təsirlənməyə qoymamaq.
Bir servisə gedən istəklər bütün Thread Pool-u tutarsa, digər yaxşı işləyən servislər üçün thread qalmaz — Cascading Failure olur.
Hər downstream servisi üçün ayrıca izolə olunmuş Thread Pool / Semaphore yaradılır. Birinin bitməsi digərinə təsir etmir.
Resilience4j Bulkhead, Hystrix (Thread Pool Isolation), Kubernetes Resource Limits.
@Service
public class ProductService {
// Payment üçün maks 5 paralel thread
@Bulkhead(name = "paymentPool", fallbackMethod = "paymentBusy")
public String callPaymentService(Long orderId) {
return paymentClient.process(orderId);
}
// Inventory üçün maks 10 paralel thread
@Bulkhead(name = "inventoryPool", fallbackMethod = "inventoryBusy")
public String callInventoryService(Long productId) {
return inventoryClient.checkStock(productId);
}
// Thread bitəndə burası çağırılır
public String paymentBusy(Long orderId, Throwable t) {
return "Payment servisi məşğuldur. Sifariş növbəyə alındı.";
}
}
resilience4j:
bulkhead:
instances:
paymentPool:
maxConcurrentCalls: 5 # Maks 5 paralel zəng
maxWaitDuration: 500ms # 500ms gözlər, sonra rədd edər
inventoryPool:
maxConcurrentCalls: 10
maxWaitDuration: 1s