Your SlideShare is downloading. ×
Desarrollo de sistemas tolerantes a fallas
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Desarrollo de sistemas tolerantes a fallas

208

Published on

¿Cuánto cuesta a una organización cuando un sistema falla? ¿Cuál es el impacto de que todo un sistema esté fuera de operación por una falla inesperada? ¿Hay manera de crear sistemas que continúen …

¿Cuánto cuesta a una organización cuando un sistema falla? ¿Cuál es el impacto de que todo un sistema esté fuera de operación por una falla inesperada? ¿Hay manera de crear sistemas que continúen funcionando aún cuando, por ejemplo, un proceso o sub-sistema muere o no está disponible? ¿Crees que todo esto se puede arreglar con un bloque “try-catch” bien colocado?

En esta sesión platicaré sobre la importancia de crear sistemas robustos y tolerantes a fallas, explicando las propiedades básicas que un sistema debe cumplir para continuar funcionando aún en la presencia de errores inesperados. Presentaré también varios patrones de diseño con el código correspondiente para que comiences a introducir robustez y tolerancia a fallas a los sistemas con que trabajas.

Semblanza del conferencista:
Agustín Ramos es un profesional de desarrollo de software con más de 12 años de experiencia en la industria. Impulsor de la metáfora del artesano como un modelo de cómo debe ser nuestra profesión. Gusta de refactorizar diseños, código, ideas y equipos de desarrollo por igual. Actualmente su principal interés se enfoca en resolver los retos que presenta el desarrollo de sistemas altamente distribuidos y escalables.

Published in: Software, Technology, Business
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
208
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
8
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Sistemas Tolerantes a Fallas Agustín Ramos @MachinesAreUs
  • 2. ¿Cuál es el costo de una falla?
  • 3. ¿Cuál es el costo de una falla? • Una pequeña molestia para algún usuario. ! • Una transacción (de negocio) no completada. • Datos inconsistentes. ! • No disponibilidad del sistema. O_o ! • Pérdida de un cliente. • O de muchos de ellos. ! • Muerte de una organización.
  • 4. (Casi) Todos los sistemas son distribuidos
  • 5. Las falacias de los sistemas distribuidos 1. La red es confiable. 2. La latencia es cero. 3. El ancho de banda es infinito. 4. La red es segura. 5. La topología no cambia. 6. Existe solo un administrador. 7. El costo del transporte es cero. 8. La red es homogénea.
  • 6. Todos los sistemas fallan
  • 7. http://www.ctlab.org/documents/How%20Complex%20Systems%20Fail.pdf
  • 8. ¿Cómo desarrollar sistemas tolerantes a fallas?
  • 9. 1. Aceptar: No puedes prevenir todas las fallas. 2. Evita los “puntos únicos de falla”. 3. Implementa mecanismos de detección de errores. 4. Implementa corrección de errores. • Si es posible y hace sentido. • e.g. patrón: Compensating Transactions ? 5. Contención de errores 1. Evita que se propaguen.
  • 10. Consecuencias Sistemas… • Creados de componentes pequeños, independientes en tiempo de ejecución. • Distribuidos. • Con reintentos finitos. • Con respuestas apropiadas para casos de falla.
  • 11. Usa… µ-Services
  • 12. Patrones de Estabilidad
  • 13. Patrón #1 Timeouts
  • 14. Timeouts (1) // Básico 1 myObject.wait(); // No uses esto por default myObject.wait(TIMEOUT); // Mejor usa esto ! // Básico 2 myThread.join(); // No uses esto por default myThread.join(TIMEOUT); // Mejor usa esto
  • 15. Timeouts (2) // Utilizando el API de concurrencia de Java <MyActionResult> myAction = <My Blocking Action> ExecutorService executor = Executors.newSingleThreadExecutor(); Future<MyActionResult> future = executor.submit(myAction); MyActionResult result = null; try { result = future.get(); // No uses esto por default result = future.get(TIMEOUT, TIMEUNIT); // Mejor usa esto } catch (TimeoutException e) { // Si ocurre el timeout ... } catch (...) { ... }
  • 16. Timeouts (3) // Utilizando el SimpleTimeLimiter de Guava Callable<MyActionResult> myAction = <My Blocking Action> SimpleTimeLimiter limiter = new SimpleTimeLimiter(); MyActionResult result = null; try {
 result = limiter.callWithTimeout(myAction, TIMEOUT, TIMEUNIT, false); } catch (UncheckedTimeoutException e) { ... } catch (...) { ... }
  • 17. Patrón #2 Circuit Breaker
  • 18. Circuit Breaker (1)
  • 19. Circuit Breaker (2)
  • 20. Circuit Breaker (3) public class CircuitBreaker implements MyResource { public enum State { CLOSED, OPEN, HALF_OPEN } final MyResource resource; State state; int counter; long tripTime; public CircuitBreaker(MyResource r) { resource = r; state = CLOSED; counter = 0; tripTime = 0L; } ...
  • 21. Circuit Breaker (4) ... public Result access(...) { // resource access Result r = null; if (state == OPEN) { checkTimeout(); throw new ResourceUnavailableException(); } try { r = resource.access(...); // should use timeout } catch (Exception e) { fail(); throw e; } success(); return r; } ...
  • 22. Circuit Breaker (5) ... private void success() { reset(); } private void fail() { counter++; if (counter > THRESHOLD) { tripBreaker(); } } private void reset() { state = CLOSED; counter = 0; } ...
  • 23. Circuit Breaker (6) ... private void tripBreaker() { state = OPEN; tripTime = System.currentTimeMillis(); } private void checkTimeout() { if ((System.currentTimeMillis - tripTime) > TIMEOUT) { state = HALF_OPEN; counter = THRESHOLD; } } public State getState() return state; } }
  • 24. Patrón #3 Fail Fast
  • 25. Fail Fast (1)
  • 26. Fail Fast (2)
  • 27. Fail Fast (3) public class FailFastGuard { private FailFastGuard() {} public static void checkResources(Set<CircuitBreaker> resources) { for (CircuitBreaker r : resources) { if (r.getState() != CircuitBreaker.CLOSED) { throw new ResourceUnavailableException(r); } } } }
  • 28. Fail Fast (4) public class MyService { Set<CircuitBreaker> requiredResources; // Initialize resources ... public Result myExpensiveAction(...) { FailFastGuard.checkResources(requiredResources); // Execute core action ... } }
  • 29. Patrón #4 Shed Load
  • 30. Shed Load (1)
  • 31. Shed Load (2)
  • 32. Shed Load (3) public class ShedLoadFilter implements Filter { Random random; public void init(FilterConfig fc) throws ServletException { random = new Random(System.currentTimeMillis()); } public void destroy() { random = null; } ...
  • 33. Shed Load (4) ... public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException { int load = getLoad(); if (shouldShed(load)) {
 HttpServletResponse res = (HttpServletResponse)response; res.setIntHeader("Retry-After", RECOMMENDATION); res.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE); return; } chain.doFilter(request, response); } ...
  • 34. Shed Load (5) ... private boolean shouldShed(int load) { // Example implement if (load < THRESHOLD) { return false; } double shedBoundary = ((double)(load - THRESHOLD))/ ((double)(MAX_LOAD - THRESHOLD)); return random.nextDouble() < shedBoundary; } }
  • 35. Patrón #5 Deferrable Work
  • 36. Deferrable Work (1)
  • 37. Deferrable Work (2)
  • 38. Deferrable Work (3) // Adaptive load variant ProcessingState state = initBatch(); while(!state.done()) { waitLoadBased(); state = processNext(state); } void waitLoadBased() {
 int load = getLoad();
 long delay = calcDelay(load);
 Thread.sleep(delay); // try-catch left out for better readability } long calcDelay(int load) { // Simple example implementation if (load < THRESHOLD) { return 0L; } return (load – THRESHOLD) * DELAY_FACTOR; }
  • 39. Patrón #6 Monitoreo
  • 40. Referencias • How Complex Systems Fail http://j.mp/HowComplexSystemsFail ! • Release It! http://j.mp/ReleaseIt ! • Fault tolerance made Easy http://j.mp/FaultToleranceMadeEasy ! • Fault tolerance 101 http://j.mp/FaultTolerance101
  • 41. Se MUY amable con tus usuarios Ellos te lo agradecerán :)
  • 42. Preguntas Agustín Ramos @MachinesAreUs

×