Lo siento si esta pregunta no es adecuada para SO.

Pero intenté buscar muchas respuestas.

Estaba estudiando el patrón de diseño del disyuntor, ya que entiendo que se usa para hacerle tolerancia a fallas API. Ahora lo que me confunde es,

Digamos que tengo una API que llama a la API de pago, y digamos que configuré mi circuito para que se abra si fallan continuamente 5 llamadas.

Ahora, según el diseño del disyuntor, enrutaré las llamadas posteriores después de abrir el circuito al método de retroceso. digamos las siguientes 5 llamadas, y en la 6ta llamada haré una llamada al API de pago si la API está en línea, cerraré el circuito.

Pero no encuentro ninguna ventaja de este patrón, como cuál es la diferencia entre el bloque de captura y el disyuntor.

¿Y qué podemos hacer en el método alternativo? ¿Cómo puede ayudar esto?

4
VdeX 15 sep. 2018 a las 13:15

3 respuestas

La mejor respuesta

Nuestros colegas ya han demostrado las ventajas de un interruptor automático, por lo que me concentraré en ejemplos prácticos.

Entonces, mirando su ejemplo, tiene un flujo que debe llamar a una API de pago> Supongamos que es un componente "externo". Sin esta llamada, todo el flujo probablemente no puede considerarse como "completado con éxito" (entiendo que tiene algún proceso en línea que tiene un pago como uno de sus pasos esenciales).

En este caso, el disyuntor de circuito probablemente no será tan útil a menos que, como respaldo, almacene el comando de pago en algún tipo de almacenamiento intermedio y luego "vuelva a aplicar" la lógica de pago.

El objetivo de un disyuntor es proporcionar un retroceso razonable para que el flujo no se considere fallido si se aplica la lógica de retroceso.

Aquí hay otro ejemplo donde el disyuntor tiene mucho más sentido.

Si crea un portal "similar a netflix" y en la interfaz de usuario hay un widget que muestra películas "recomendadas". El motor de recomendaciones toma en consideración las películas que has visto / gustado antes. Técnicamente se trata de un "sistema externo" / microservicio.

Ahora, ¿qué pasa si el flujo que llena los datos para la interfaz de usuario no puede obtener las recomendaciones (por ejemplo, si el servicio de recomendaciones está inactivo), "fallará" todo el flujo? Probablemente no, tal vez sea mejor mostrar una "lista genérica" de películas recomendadas y dejar que el usuario continúe trabajando con la aplicación.

En este caso, el disyuntor puede ser una buena opción para implementar la llamada al servicio de recomendación externa.

Ahora, ¿cuál es la diferencia entre este flujo y el manejo de excepciones?

Si la razón de la falla de ese sistema de recomendación es una interrupción de la red temporal / lentitud de la base de datos, probablemente sea mejor darle a este servicio un tiempo y no intentar llamarlo una y otra vez, deberíamos darle la oportunidad de 'recuperarse '. Cuando aplicamos un disyuntor, durante el período de "circuito abierto" nuestro código ni siquiera intentará llamar al servidor, enrutando directamente al método alternativo.

Un bloque de prueba / captura regular, por otro lado, siempre llamará al servicio de recomendaciones.

Para concluir, un interruptor de circuito es un patrón de tolerancia a fallas como se indicó en la pregunta; es una herramienta que puede ser aplicable en algunas situaciones e irrelevante en otros casos.

5
Mark Bramnik 15 sep. 2018 a las 20:37

Es cierto que se utiliza un gran disyuntor para hacer que un API sea tolerante a fallas.

Como cuál es la diferencia entre el bloque de captura y el disyuntor.

La principal diferencia entre un bloque de captura y un disyuntor es el manejo del caso de falla. Supongamos que estamos llamando una API de un sistema externo. Digamos que la llamada a la API falló.

  1. Si usamos el bloque catch, capturaremos la excepción y llamaremos a un método alternativo. La próxima vez llamaremos a la misma API y el sistema externo todavía está inactivo. De nuevo, este mismo ciclo de eventos ocurrirá. Esto bombardeará innecesariamente el sistema externo que sufre, consumirá recursos del sistema y también aumentará el tiempo de respuesta de su API.

  2. Si usamos un patrón de disyuntor, nuestra primera llamada falla y luego abrimos el circuito. La próxima vez ni siquiera llamaremos al sistema externo y seguiremos directamente el patrón de reserva. Voila todo se maneja!

¿Y qué podemos hacer en el método alternativo? ¿Cómo puede ayudar esto?

Un buen ejemplo para un método alternativo es el siguiente. Tenemos un sistema de pagos que enruta los pagos a diferentes pasarelas de pago. Digamos que recibimos un error de una pasarela de pago en particular, luego, en el método alternativo, podemos enrutarlo a una pasarela de pago diferente.

También puede leer este artículo para comprender más sobre este tema: https://martinfowler.com/bliki/ CircuitBreaker.html

3
user3705988 15 sep. 2018 a las 19:06

El objetivo de este patrón de diseño es encapsular la lógica para manejar errores inesperados y repetidos.

La página de wikipedia para este patrón tiene secciones útiles que explican los tipos de situaciones en las que desea implementar esta lógica para evitar hacer solicitudes que esperas fallar.

¿Cuál es la ventaja de este patrón?

Este patrón es ventajoso cuando se encuentra con una situación en la que sabe que un servicio no estará disponible y desea un comportamiento personalizado hasta que el servicio vuelva a estar en línea. Por ejemplo, durante la migración de una base de datos, tendría sentido dividir las solicitudes en una cola hasta que la migración haya finalizado.

¿Cuál es la diferencia entre el bloque de captura y el disyuntor?

Creo que esta diferencia es la diferencia entre concepto e implementación. Detectar la presencia de una situación en la que desea "abrir el circuito" podría significar detectar errores en un bloque de captura y contarlos, como en su ejemplo. Sin embargo, el manejo no se limita solo a errores.

En mi ejemplo, el backend podría informar a la interfaz de usuario de que está a punto de producirse una migración, provocando un "circuito abierto" en la interfaz de usuario hasta que reciba un mensaje de migración finalizada.

0
Souperman 15 sep. 2018 a las 10:50