Top Banner
Sistemas Tolerantes a Fallas Agustín Ramos @MachinesAreUs
45

Sistemas Tolerantes a Fallas

May 11, 2015

Download

Technology

Agustín Ramos

Plática dada en el marco de SGCE 2014
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Sistemas Tolerantes a Fallas

Sistemas Tolerantes a Fallas

Agustín Ramos @MachinesAreUs

Page 2: Sistemas Tolerantes a Fallas

¿Cuál es el costo de una falla?

Page 3: Sistemas Tolerantes a Fallas

¿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.

Page 4: Sistemas Tolerantes a Fallas

(Casi) Todos los sistemas son distribuidos

Page 5: Sistemas Tolerantes a Fallas

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.

Page 6: Sistemas Tolerantes a Fallas

Todos los sistemas fallan

Page 7: Sistemas Tolerantes a Fallas

http://www.ctlab.org/documents/How%20Complex%20Systems%20Fail.pdf

Page 8: Sistemas Tolerantes a Fallas

¿Cómo desarrollar sistemas tolerantes a fallas?

Page 9: Sistemas Tolerantes a Fallas

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.

Page 10: Sistemas Tolerantes a Fallas

Consecuencias

Sistemas… • Creados de componentes pequeños,

independientes en tiempo de ejecución. • Distribuidos. • Con reintentos finitos. • Con respuestas apropiadas para casos de

falla.

Page 11: Sistemas Tolerantes a Fallas

Usa…

µ-Services

Page 12: Sistemas Tolerantes a Fallas

Patrones de Estabilidad

Page 13: Sistemas Tolerantes a Fallas
Page 14: Sistemas Tolerantes a Fallas

Patrón #1 Timeouts

Page 15: Sistemas Tolerantes a Fallas

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

Page 16: Sistemas Tolerantes a Fallas

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 (...) { ... }

Page 17: Sistemas Tolerantes a Fallas

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 (...) { ... }

Page 18: Sistemas Tolerantes a Fallas

Patrón #2 Circuit Breaker

Page 19: Sistemas Tolerantes a Fallas

Circuit Breaker (1)

Page 20: Sistemas Tolerantes a Fallas

Circuit Breaker (2)

Page 21: Sistemas Tolerantes a Fallas

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; } ...

Page 22: Sistemas Tolerantes a Fallas

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;

}

...

Page 23: Sistemas Tolerantes a Fallas

Circuit Breaker (5)

...

private void success() {

reset();

}

private void fail() { counter++; if (counter > THRESHOLD) {

tripBreaker();

}

}

private void reset() { state = CLOSED; counter = 0;

}

...

Page 24: Sistemas Tolerantes a Fallas

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; }

}

Page 25: Sistemas Tolerantes a Fallas

Patrón #3 Fail Fast

Page 26: Sistemas Tolerantes a Fallas

Fail Fast (1)

Page 27: Sistemas Tolerantes a Fallas

Fail Fast (2)

Page 28: Sistemas Tolerantes a Fallas

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); }

}

}

}

Page 29: Sistemas Tolerantes a Fallas

Fail Fast (4)

public class MyService { Set<CircuitBreaker> requiredResources; // Initialize resources ... public Result myExpensiveAction(...)

{

FailFastGuard.checkResources(requiredResources);

// Execute core action ...

}

}

Page 30: Sistemas Tolerantes a Fallas

Patrón #4 Shed Load

Page 31: Sistemas Tolerantes a Fallas

Shed Load (1)

Page 32: Sistemas Tolerantes a Fallas

Shed Load (2)

Page 33: Sistemas Tolerantes a Fallas

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; } ...

Page 34: Sistemas Tolerantes a Fallas

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); } ...

Page 35: Sistemas Tolerantes a Fallas

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; } }

Page 36: Sistemas Tolerantes a Fallas

Patrón #5 Deferrable Work

Page 37: Sistemas Tolerantes a Fallas

Deferrable Work (1)

Page 38: Sistemas Tolerantes a Fallas

Deferrable Work (2)

Page 39: Sistemas Tolerantes a Fallas

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; }

Page 40: Sistemas Tolerantes a Fallas

Patrón #6 Monitoreo

Page 41: Sistemas Tolerantes a Fallas
Page 42: Sistemas Tolerantes a Fallas
Page 43: Sistemas Tolerantes a Fallas

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

Page 44: Sistemas Tolerantes a Fallas

Se MUY amable con tus usuarios Ellos te lo agradecerán :)

Page 45: Sistemas Tolerantes a Fallas

Preguntas

Agustín Ramos @MachinesAreUs