{"id":24523768,"url":"https://github.com/jdvega6/circuitbreaker","last_synced_at":"2026-05-20T19:35:13.656Z","repository":{"id":256525785,"uuid":"855555401","full_name":"JDVega6/CircuitBreaker","owner":"JDVega6","description":"Implementa del patrón Circuit Breaker manualmente y con Polly para manejar fallos temporales en servicios externos, mejorando la resiliencia y eficiencia mediante inyección de dependencias y pruebas con ElasticSearch.","archived":false,"fork":false,"pushed_at":"2024-09-11T04:56:41.000Z","size":11,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-15T14:12:59.436Z","etag":null,"topics":["circuit-breaker","csharp","elasticsearch","patterns"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/JDVega6.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-09-11T04:09:30.000Z","updated_at":"2025-01-03T15:43:00.000Z","dependencies_parsed_at":"2024-09-11T11:28:09.619Z","dependency_job_id":"05813372-3dbe-4726-9e0d-ac6e606711ea","html_url":"https://github.com/JDVega6/CircuitBreaker","commit_stats":null,"previous_names":["jdvega6/circuitbreaker"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/JDVega6/CircuitBreaker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JDVega6%2FCircuitBreaker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JDVega6%2FCircuitBreaker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JDVega6%2FCircuitBreaker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JDVega6%2FCircuitBreaker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JDVega6","download_url":"https://codeload.github.com/JDVega6/CircuitBreaker/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JDVega6%2FCircuitBreaker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33272491,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-20T15:12:43.734Z","status":"ssl_error","status_checked_at":"2026-05-20T15:12:42.300Z","response_time":356,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["circuit-breaker","csharp","elasticsearch","patterns"],"created_at":"2025-01-22T04:16:56.523Z","updated_at":"2026-05-20T19:35:13.640Z","avatar_url":"https://github.com/JDVega6.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# Circuit Breaker en C# .NET 8\n\n## Descripción de la prueba\n\nSe implementó el patrón **Circuit Breaker** en una aplicación .NET 8 con dos enfoques una implementación **manual** y la otra utilizando la librería **Polly**. La implementación del Circuit Breaker en ambos casos permite fallar 3 veces antes de abrir el circuito por 20 segundos. Además, la lógica del Circuit Breaker se separó del controlador a través de la inyección de dependencias para mejorar la mantenibilidad y la reutilización del código. Se construye una aplicacion que realiza llamados a elasticSearch en el que se usa HttpClient para obtener respuesta del servicio externo, el docker compose esta configurado para ejecutar el servicio de elasticSearch y la aplicacion del CircuitBreaker.\n\n## Objetivo(s) de la prueba\n\n- Implementar el patrón **Circuit Breaker** para manejar fallos temporales en servicios externos.\n- Configurar el circuito para permitir 3 fallos consecutivos antes de abrirlo por 20 segundos.\n- Separar la lógica del Circuit Breaker del controlador utilizando inyección de dependencias.\n- Probar los diferentes estados del circuito: **cerrado**, **semiabierto** y **abierto**.\n\n## Pasos implementados para llevar a cabo la prueba\n1. **Implementación Manual:**\n  - Se creó una clase `CircuitBreakerManual` que maneja la lógica del Circuit Breaker\n  - Definición de los estados del Circuit Breaker (Abierto, Cerrado, Semi-Abierto).\n  - Control de errores mediante excepciones, contabilizando fallos consecutivos.\n  - Implementación de una lógica de reintento y tiempos de espera cuando el circuito está en estado \"Abierto\".\n  - El controlador `ManualCircuitBreakerProductController` utiliza el servicio `CircuitBreakerPolicy` para ejecutar las operaciones y manejar el estado del Circuit Breaker de forma centralizada.\n  - Simulación de fallos aleatorios para probar el comportamiento del Circuit Breaker.\n  - El estado del Circuit Breaker (abierto, cerrado y semiabierto) es manejado y registrado en la consola para pruebas.\n\n2. **Implementación con Polly:**\n  - Se instala el paquete de la libreria Polly en la version 8.4.1\n  - Se creó una clase `CircuitBreakerPolicy` que maneja la lógica del Circuit Breaker con Polly.\n  - Se configura la politica del circuit breaker para: \n      - Permitir hasta 3 excepciones antes de abrir el circuito.\n      - Mantener el circuito abierto durante 20 segundos antes de intentar pasar a un estado semiabierto.\n  - El controlador `PollyCircuitBreakerProductController` utiliza el servicio `CircuitBreakerPolicy` para ejecutar las operaciones y manejar el estado del Circuit Breaker de forma centralizada.\n  - Simulación de fallos para observar cómo Polly abre y cierra el circuito automáticamente.\n  - El estado del Circuit Breaker (abierto, cerrado y semiabierto) es manejado y registrado en la consola para pruebas.\n\n## Tecnologías usadas en la prueba\n\n- **Lenguaje**: C#\n- **Framework**: .NET 8\n- **Librerías**:\n  - [Polly](https://github.com/App-vNext/Polly): Librería de resiliencia para manejar patrones como el Circuit Breaker.\n\n## Resultados\n\nDurante las pruebas, se observó el comportamiento esperado del Circuit Breaker:\n\n- **Estado Cerrado**: El servicio funcionó correctamente hasta que se alcanzó el límite de 3 excepciones.\n- **Estado Abierto**: Después de 3 fallos, el circuito se abrió y rechazó las solicitudes durante 20 segundos.\n- **Estado Semiabierto**: Después de los 20 segundos, el circuito pasó a estado semiabierto y permitió probar si el servicio estaba disponible nuevamente.\n- **Recuperación**: El circuito volvió al estado cerrado cuando el servicio respondió correctamente en estado semiabierto.\n\n## Conclusiones\n\n- Este patron mejora la resilencia del sistema, permitiendo que los servicios que presenten algun problema se puedan recuperar de manera controlada.\n- El patron permite monitorear el conteo de fallos consecutivos, esto nos ayuda a gestionar los riesgos asociados a interdependencias de servicios, especialmente en sistemas distribuidos.\n- Optimiza el uso de recursos, evitando que se realicen intentos fallidos de comunicacion con servicios que no estan disponibles.\n- La implementación del patrón **Circuit Breaker** con **Polly** proporciona una manera eficaz de manejar fallos temporales en servicios externos, mejorando la resiliencia de la aplicación.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjdvega6%2Fcircuitbreaker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjdvega6%2Fcircuitbreaker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjdvega6%2Fcircuitbreaker/lists"}