Documentation for a newer release is available. View Latest

Resilience

El envío de mensajes siempre es un proceso delicado, ya que las redes y los sistemas remotos no están disponibles el 100% del tiempo. La biblioteca de connector incorpora una serie de estrategias para afrontar fallos transitorios en sistemas externos. Las estrategias incluidas son reintentos, circuit breaking y re-enrutamiento. Como otras funcionalidades del connector, la resiliencia es configurable; por lo tanto, puede usarse en mayor o menor medida según la situación.

Retry

Una de las estrategias de resiliencia más simples es reintentar la operación fallida. Esto puede resolver fallos transitorios que hayan causado que un envío anterior fallara o hiciera timeout.

Los reintentos pueden configurarse tanto para el envío como para la recepción de mensajes. Para el envío, el retry decora el mensaje enviado sobre el transport. Al recibir mensajes, la función receiver proporcionada por el cliente se decora con el retry. La configuración se explica aquí

Circuit Breaking

Analogía electrónica

Los circuit breakers se basan en el término homónimo en electrónica. En electrónica, un circuit breaker es efectivamente un fusible rearmable que corta la energía cuando pasan cantidades peligrosas de corriente. El circuit breaker mantiene la alimentación apagada hasta que el problema se resuelve, momento en el que puede rearmarse.

Circuit breakers en Connectors

Los circuit breakers utilizados en sistemas de mensajería, como la biblioteca de connector, funcionan de manera muy similar. Su propósito es proteger sistemas de ser bombardeados con mensajes mientras intentan recuperarse.

Si un connector transport falla durante un período prolongado, el circuit breaker puede considerarlo no saludable y evitar que se envíen mensajes hacia él. En términos de circuit breaking, esto se denomina circuito OPEN, es decir, rechaza mensajes de forma rápida, sin enviar nada al sistema aguas abajo. Esto da al sistema remoto algo de tiempo para volver, y también evita que el emisor pierda tiempo intentando enviar mensajes que probablemente fallarán.

Después de un tiempo, el circuit breaker puede permitir que algunos mensajes pasen al transport. El circuit breaker ahora se considera HALF OPEN. Si el transport continúa fallando, entonces el circuit breaker vuelve a OPEN y esperará de nuevo antes de intentar cerrar otra vez.

Mientras está en estado HALF OPEN, si los mensajes reciben respuesta con éxito, entonces el circuit breaker cambiará de estado a CLOSED y volverá a funcionar con normalidad.

La configuración del circuit breaker forma parte de la configuración de resiliencia y se puede encontrar aquí

Dead Letter Appender

Al recibir mensajes, los reintentos pueden agotarse debido a que el mensaje es inválido para la lógica de procesamiento, o a que un fallo temporal puede impedir el procesamiento dentro del tiempo asignado.

Cuando se agotan los reintentos, el mensaje fallido se enruta al DeadLetterAppender configurado. Enrutar estos mensajes al appender permite manejar patrones de fallos comunes y posibles bugs de software, a la vez que desbloquea el connector y permite manejar nuevos mensajes. Un DeadLetterAppeder es una abstracción de los patrones Invalid Message Channel y Dead Letter Channel.

Los usuarios de la biblioteca de connector pueden crear lógica de appender arbitraria, enviando mensajes fallidos a distintos destinos según el error encontrado — por ejemplo, separando errores de formato de mensaje de posibles errores de transport transitorios y construyendo lógica adicional de reintentos alrededor de los mensajes contenidos en el destino de errores de transport. Los appenders de dead letter pueden usar los send connectors para publicar mensajes a sus destinos, pero también es posible usar cualquier librería Java para enviar mensajes, permitiendo integrar con destinos y tecnologías no soportadas actualmente por el framework de connector.

Para un ejemplo de código, consulte esta página.

Lógica de enrutamiento

La lógica de enrutamiento es otro mecanismo de resiliencia específico de los sending connectors. Los sending connectors pueden configurarse para enviar usando uno o más transports y la lógica de enrutamiento determina la estrategia usada para seleccionar el transport a utilizar al enviar un mensaje.

La lógica de enrutamiento se integra bien con el circuit breaking y, típicamente, las estrategias evitarán seleccionar transports cuyo circuit breaker no esté cerrado.

Para configurar la estrategia de enrutamiento, debe proporcionarse una implementación de la interfaz RoutingLogic al construir un sending connector.

RoutingLogic.java
@FunctionalInterface
public interface RoutingLogic<T> {
    CircuitBreakerTransport<T> select(List<CircuitBreakerTransport<T>> transports);
}

La biblioteca de connector proporciona tres implementaciones de RoutingLogic: Failover, Round Robin y Weighted Round Robin. Si no se proporciona RoutingLogic, se utilizará por defecto la estrategia round-robin.

Failover

La estrategia de failover se usa con dos transports, donde uno es el primario y el otro un failover. El transport de failover se selecciona cuando el transport primario está fallando, es decir, tiene un circuit breaker no cerrado.

Round Robin

La estrategia round-robin puede usarse con uno o más transports; cada mensaje enviado usará el siguiente transport, balanceando la carga equitativamente entre transports.

Weighted Round Robin

Weighted round-robin es similar a la estrategia round-robin estándar. La diferencia principal es que a cada transport se le asigna un peso que hará que se le envíen más o menos mensajes en relación con los demás.