Resiliencia
La mensajería siempre es un proceso complicado, ya que las redes y los sistemas remotos no están disponibles el 100% del tiempo. La biblioteca de conectores incorpora una serie de estrategias para hacer frente a fallos transitorios en sistemas externos. Las estrategias incluidas son reintentos, ruptura de circuito y reenvío. Al igual que con otras características de conectores, la resiliencia es configurable; por lo tanto, se puede utilizar tanto como se desee, o tan poco, dependiendo de la situación.
Reintentar
Una de las estrategias de resiliencia más simples es volver a intentar el failed operación. Esto puede resolver fallos transitorios que pueden haber causado que el envío de un mensaje anterior fallara o se agotara el tiempo de espera.
Se pueden configurar reintentos tanto para el envío como para la recepción de mensajes. Para enviar, el reintento decora el mensaje enviado a través del transporte. Al recibir mensajes, la función de receptor suministrada por el cliente está decorada con el reintento. La configuración se explica.aquí
Interrupción de Circuito
Analogía Electrónica
Los interruptores automáticos se basan en el mismo término nombrado en electrónica. En electrónica, un interruptor automático es efectivamente un fusible reiniciable que corta la energía siempre que cantidades peligrosas de corriente fluyan a través de él. El interruptor automático mantiene la energía apagada hasta que se resuelva el problema, momento en el cual puede ser reiniciado.
Interruptores automáticos en conectores
Los interruptores automáticos utilizados en el sistema de mensajería, como la biblioteca de conectores, funcionan de manera muy similar. Su propósito es proteger los sistemas de ser bombardeados con mensajes mientras intentan recuperarse.
Si un connector transport si falla durante un período prolongado, el interruptor de circuito puede considerarlo poco saludable y evitará que se envíen mensajes a él.
En términos de interrupción de circuitos, esto se refiere a un OPEN circuito, es decir, rechaza mensajes rápidamente, sin enviar nada al sistema descendente.
Esto le da al sistema remoto algo de tiempo para regresar, y también evita que el remitente pierda tiempo intentando enviar mensajes que probablemente fallarán.
Después de un tiempo, el interruptor de circuito puede permitir que algunos mensajes sean enviados a través del transporte.
El interruptor automático ahora se considera que es HALF OPEN.
Si el transporte continúa fallando, entonces el interruptor de circuito regresa a OPEN y el interruptor de circuito esperará nuevamente antes de intentar cerrar de nuevo.
Mientras se encuentra en el HALF OPEN state; si los mensajes se responden con éxito, entonces el interruptor de circuito cambiará state to CLOSED y comenzará a funcionar normalmente.
La configuración del interruptor de circuito forma parte de la configuración de resiliencia y se puede encontrar aquí
Appender de Carta Muerta
Al recibir mensajes, los reintentos pueden agotarse ya sea debido a que el mensaje es inválido para la lógica de procesamiento, o una falla temporal puede estar impidiendo el procesamiento dentro del plazo establecido.
Al agotarse los reintentos, el failed el mensaje será dirigido al configurado DeadLetterAppender.
El enrutamiento de estos mensajes al appender permite el manejo de patrones de fallos comunes y posibles errores de software, al tiempo que desbloquea el conector y permite el manejo de nuevos mensajes.
A DeadLetterAppeder es una abstracción de
Canal de Mensaje Inválido y Canal de Cartas Muertas patrones.
Los usuarios de la biblioteca de conectores pueden crear lógica de appender arbitraria, enviando failed mensajes a diferentes destinos basados en el error encontrado — por ejemplo, separando los errores de formato de mensaje de los errores de transporte potencialmente transitorios y construyendo lógica de reintento adicional en torno a los mensajes contenidos en el destino del error de transporte. Los apéndices de cartas muertas pueden utilizar el send connector s para publicar mensajes en sus destinos, pero es posible utilizar cualquier Java biblioteca para enviar mensajes, permitiéndole integrarse con destinos y tecnologías que actualmente no son compatibles con el marco de conectores.
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 para sending connector s. Sending connector s puede configurar para enviar utilizando uno o más transportes y la lógica de enrutamiento determina la estrategia utilizada para seleccionar el transporte a utilizar al enviar un mensaje.
La lógica de enrutamiento se integra bien con el cortocircuito y, por lo general, las estrategias evitarán seleccionar transportes cuyo cortocircuito no esté cerrado.
Para configurar la estrategia de enrutamiento, se debe proporcionar una implementación de la interfaz RoutingLogic al construir un sending connector.
@FunctionalInterface
public interface RoutingLogic<T> {
/**
* Select the next {@link CircuitBreakerTransport} based on the implemented routing strategy.
*
* @param transports the list of {@link CircuitBreakerTransport}'s to select from
* @return the selected {@link CircuitBreakerTransport}
*/
CircuitBreakerTransport<T> select(List<CircuitBreakerTransport<T>> transports);
}
La biblioteca de conectores proporciona tres implementaciones de RoutingLogic, estas son [Failover],[Round Robin] y [Weighted Round Robin]. Si no se proporciona RoutingLogic, entonces se utilizará la estrategia de round-robin por defecto.
Conmutación por error
La estrategia de conmutación por error se utiliza con dos transportes, donde uno es el primario y el otro es un respaldo. El transporte de conmutación por error se selecciona cuando el transporte primario está fallando, es decir, tiene un interruptor de circuito no cerrado.