0
Sistemas Tolerantes
a Fallas
Agustín Ramos
@MachinesAreUs
¿Cuál es el costo de una falla?
¿Cuál es el costo de una falla?
• Una pequeña molestia para algún usuario.
!
• Una transacción (de negocio) no completada....
(Casi) Todos los sistemas son
distribuidos
Las falacias de los sistemas distribuidos
1. La red es confiable.
2. La latencia es cero.
3. El ancho de banda es infinito...
Todos los sistemas fallan
http://www.ctlab.org/documents/How%20Complex%20Systems%20Fail.pdf
¿Cómo desarrollar sistemas
tolerantes a fallas?
1. Aceptar: No puedes prevenir todas las fallas.
2. Evita los “puntos únicos de falla”.
3. Implementa mecanismos de detecc...
Consecuencias
Sistemas…
• Creados de componentes pequeños,
independientes en tiempo de ejecución.
• Distribuidos.
• Con re...
Usa…
µ-Services
Patrones de Estabilidad
Patrón #1
Timeouts
Timeouts (1)
// Básico 1
myObject.wait(); // No uses esto por default
myObject.wait(TIMEOUT); // Mejor usa esto
!
// Básic...
Timeouts (2)
// Utilizando el API de concurrencia de Java
<MyActionResult> myAction = <My Blocking Action>	

ExecutorServi...
Timeouts (3)
// Utilizando el SimpleTimeLimiter de Guava
Callable<MyActionResult> myAction = <My Blocking Action>	

Simple...
Patrón #2
Circuit Breaker
Circuit Breaker (1)
Circuit Breaker (2)
Circuit Breaker (3)
public class CircuitBreaker implements MyResource {
public enum State { CLOSED, OPEN, HALF_OPEN }
fina...
Circuit Breaker (4)
...
public Result access(...) { // resource access
Result r = null;
if (state == OPEN) {
checkTimeout(...
Circuit Breaker (5)
...
private void success() {
reset();
}
private void fail() {
counter++;
if (counter > THRESHOLD) {
tr...
Circuit Breaker (6)
...	

private void tripBreaker() {
state = OPEN;
tripTime = System.currentTimeMillis();
}
private void...
Patrón #3
Fail Fast
Fail Fast (1)
Fail Fast (2)
Fail Fast (3)
public class FailFastGuard {
private FailFastGuard() {}
public static void checkResources(Set<CircuitBreaker...
Fail Fast (4)
public class MyService {
Set<CircuitBreaker> requiredResources;
// Initialize resources
...
public Result my...
Patrón #4
Shed Load
Shed Load (1)
Shed Load (2)
Shed Load (3)
public class ShedLoadFilter implements Filter {
Random random;
public void init(FilterConfig fc) throws Serv...
Shed Load (4)
...
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws java.io...
Shed Load (5)
...
private boolean shouldShed(int load) { // Example implement
if (load < THRESHOLD) {
return false;
}
doub...
Patrón #5
Deferrable Work
Deferrable Work (1)
Deferrable Work (2)
Deferrable Work (3)
// Adaptive load variant
ProcessingState state = initBatch();
while(!state.done()) {
waitLoadBased();
...
Patrón #6
Monitoreo
Referencias
• How Complex Systems Fail
http://j.mp/HowComplexSystemsFail
!
• Release It!
http://j.mp/ReleaseIt
!
• Fault t...
Se MUY amable con tus usuarios
Ellos te lo agradecerán :)
Preguntas
Agustín Ramos
@MachinesAreUs
Desarrollo de sistemas tolerantes a fallas
Desarrollo de sistemas tolerantes a fallas
Desarrollo de sistemas tolerantes a fallas
Upcoming SlideShare
Loading in...5
×

Desarrollo de sistemas tolerantes a fallas

227

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 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
227
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
9
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Transcript of "Desarrollo de sistemas tolerantes a fallas"

  1. 1. Sistemas Tolerantes a Fallas Agustín Ramos @MachinesAreUs
  2. 2. ¿Cuál es el costo de una falla?
  3. 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. 4. (Casi) Todos los sistemas son distribuidos
  5. 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. 6. Todos los sistemas fallan
  7. 7. http://www.ctlab.org/documents/How%20Complex%20Systems%20Fail.pdf
  8. 8. ¿Cómo desarrollar sistemas tolerantes a fallas?
  9. 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. 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. 11. Usa… µ-Services
  12. 12. Patrones de Estabilidad
  13. 13. Patrón #1 Timeouts
  14. 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. 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. 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. 17. Patrón #2 Circuit Breaker
  18. 18. Circuit Breaker (1)
  19. 19. Circuit Breaker (2)
  20. 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. 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. 22. Circuit Breaker (5) ... private void success() { reset(); } private void fail() { counter++; if (counter > THRESHOLD) { tripBreaker(); } } private void reset() { state = CLOSED; counter = 0; } ...
  23. 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. 24. Patrón #3 Fail Fast
  25. 25. Fail Fast (1)
  26. 26. Fail Fast (2)
  27. 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. 28. Fail Fast (4) public class MyService { Set<CircuitBreaker> requiredResources; // Initialize resources ... public Result myExpensiveAction(...) { FailFastGuard.checkResources(requiredResources); // Execute core action ... } }
  29. 29. Patrón #4 Shed Load
  30. 30. Shed Load (1)
  31. 31. Shed Load (2)
  32. 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. 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. 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. 35. Patrón #5 Deferrable Work
  36. 36. Deferrable Work (1)
  37. 37. Deferrable Work (2)
  38. 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. 39. Patrón #6 Monitoreo
  40. 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. 41. Se MUY amable con tus usuarios Ellos te lo agradecerán :)
  42. 42. Preguntas Agustín Ramos @MachinesAreUs
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×