Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Patrón Bulkhead
Patrón Bulkhead
Producto
Request
Pescados
T < 1s MS
Poveedores T < 2s Postres
MS MS
T > 15s
Bebidas
MS
¿Por que debo saber de este tema?
Producto
Request
Pescados
T < 1s MS
Poveedores T < 2s Postres
MS MS
T > 15s
Bebidas
MS
¿Por que debo saber de este tema?
Producto
Max 20 TPS Request Pescados
Max 20 TPS MS
Poveedores Postres
MS Max 20 TPS MS
Servlet Thread 1
Pescados
Servlet Thread 2
MS
Servlet Thread 3
Servlet Thread 4 Postres
Servlet Thread 5 MS
Servlet Thread 6
Servlet Thread 7 Bebidas
Servlet Thread 8 MS
Resiliencia:
Capacidad de un sistema de continuar
operando aún cuando una parte del
mismo no se encuentre operativa 100%.
Antes de seguir
Evita siempre que se pueda llamadas servicio a servicio,
bulkhead es una solución a un problema muchas veces
generado por un mal diseño.
Tipos de Bulkhead
● Basado en semáforo
Ejecuta las llamadas el hilo actual y controla el grado de
concurrencia basado en un semáforo.
● Basado en un pool de hilos.
● Ejecuta cada llamada en un hilo disponible del pool de hilos
definido.
Enfoque de funcionamiento
Postres
Pool 2
Servlet Thread 1
Servlet Thread 2 MS
Servlet Thread 1
Pool 3
Servlet Thread 2
Servlet Thread 3
Bebidas
MS
Servlet Thread 4
t
Si uno de los pools se satura, el resto no se verá afectado, el problema queda “contenido”.
Si le entra agua a una sección del barco, o se incendia, no se propagará hacia todo el barco.
Resillience4j
● Rate limiter
● Retry
● TimeLimiter
● Cache
Resillience4j / Bulkhead
● Módulo: resilience4j-bulkhead.
● Se basa en el patrón decorator para “decorar” la
función que ejecuta la operación.
● Permite composición con otros patrones de la
biblioteca.
Resillience4j / Bulkhead
Bulkhead ThreadPoolBulkhead
(Semáforo) (Thread Pool)
Resillience4j / Bulkhead
Pasos para trabajar con un Bulkhead en resilience4j
Thread Pool
Bulkhead / Code
ThreadPoolBulkheadRegistry.of(ThreadPoolBulkheadConfig.custom()
.maxThreadPoolSize(1) //The maximum number threads in the pool
.coreThreadPoolSize(1) //The core number of threads in the pool
.queueCapacity(3) //The capacity of the queue (in wait)
.build());
ThreadPoolBulkhead th = [ANTERIOR].bulkhead("mi-primer-bulkhead");
th.getEventPublisher()
.onCallPermitted(e -> {
log.info("Event " + e.getEventType());
})
.onCallFinished(e -> {
log.info("Event " + e.getEventType());
})
.onCallRejected(e -> {
log.info("Event " + e.getEventType());
});
Bulkhead / Code
Decorators
.ofSupplier([SUPPLIER]) // pass a Supplier
.withThreadPoolBulkhead(th) // set bulkhead instance to use
.withFallback(Arrays.asList(RuntimeException.class), [FALLBACK FUNCTION]) // fallback
.get() // Completable Stage
.toCompletableFuture()
.get(); // Block future for non async ops
Más para estudiar
● Módulo de métricas y monitoreo integrado con
micrometer. (+spring actuator)
● Otros patrones de resiliencia disponibles