SlideShare una empresa de Scribd logo
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.
• Datos inconsistentes.
!
• No disponibilidad del sistema. O_o
!
• Pérdida de un cliente.
• O de muchos de ellos.
!
• Muerte de una organización.
(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.
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.
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 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.
Consecuencias
Sistemas…
• Creados de componentes pequeños,
independientes en tiempo de ejecución.
• Distribuidos.
• Con reintentos finitos.
• Con respuestas apropiadas para casos de
falla.
Usa…
µ-Services
Patrones de Estabilidad
Sistemas Tolerantes a Fallas
Patrón #1
Timeouts
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
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 (...) {
...
}
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 (...) {
... }
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 }
final MyResource resource;
State state;
int counter;
long tripTime;
public CircuitBreaker(MyResource r) {
resource = r;
state = CLOSED;
counter = 0;
tripTime = 0L;
} ...
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;
}
...
Circuit Breaker (5)
...
private void success() {
reset();
}
private void fail() {
counter++;
if (counter > THRESHOLD) {
tripBreaker();
}
}
private void reset() {
state = CLOSED;
counter = 0;
}
...
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;
}
}
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> resources) {
for (CircuitBreaker r : resources) {
if (r.getState() != CircuitBreaker.CLOSED) {
throw new ResourceUnavailableException(r);
}
}	

	

 }
}
Fail Fast (4)
public class MyService {
Set<CircuitBreaker> requiredResources;
// Initialize resources
...
public Result myExpensiveAction(...)
{
FailFastGuard.checkResources(requiredResources);
// Execute core action
...
}
}
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 ServletException {
random = new Random(System.currentTimeMillis());
}
public void destroy() {
random = null;
} ...
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);
}
...
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;
}
}
Patrón #5
Deferrable Work
Deferrable Work (1)
Deferrable Work (2)
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;
}
Patrón #6
Monitoreo
Sistemas Tolerantes a Fallas
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
Se MUY amable con tus usuarios
Ellos te lo agradecerán :)
Preguntas
Agustín Ramos
@MachinesAreUs

Más contenido relacionado

PDF
Pairwise and property based testing
PDF
Desarrollo de sistemas tolerantes a fallas
PPT
Gestión de errores en Java
KEY
Ios.s14
PDF
Introduccion a Programacion Reactiva
PDF
Programación Reactiva en Android
PPTX
Unidad 5: Excepciones Ejercicio 3
PDF
Jyoc java-cap12 excepciones
Pairwise and property based testing
Desarrollo de sistemas tolerantes a fallas
Gestión de errores en Java
Ios.s14
Introduccion a Programacion Reactiva
Programación Reactiva en Android
Unidad 5: Excepciones Ejercicio 3
Jyoc java-cap12 excepciones

La actualidad más candente (20)

PPTX
Java 8 time to join the future
PDF
Jyoc java-cap23 j unit
PPT
Sincronizacion
DOCX
Excepciones en Java
PDF
Uso de Excepciones en JAVA
DOCX
Estructuras de control try catch
DOCX
Las excepciones standar
DOCX
Mas sobre excepciones
PDF
Programación Reactiva con RxJava
PPT
5.manejo de excepciones
PDF
Workshop iOS 4: Closures, generics & operators
PPTX
SMA1011_BUBAL_Tipos de comportamiento
DOCX
Pruebas de aceptación 15 11_2013
PPT
Tipos De Comportamiento
PDF
3 java sesin 3 pps
PPT
Scjp Jug Section 2 Flow Control
PDF
SCJP, Clase 4: Operadores
PPTX
Equipo de Marketing de Paradigma Digital
PDF
Guia demanejodeexcepcionesaserciones
PDF
Manejo de excepciones en Java
Java 8 time to join the future
Jyoc java-cap23 j unit
Sincronizacion
Excepciones en Java
Uso de Excepciones en JAVA
Estructuras de control try catch
Las excepciones standar
Mas sobre excepciones
Programación Reactiva con RxJava
5.manejo de excepciones
Workshop iOS 4: Closures, generics & operators
SMA1011_BUBAL_Tipos de comportamiento
Pruebas de aceptación 15 11_2013
Tipos De Comportamiento
3 java sesin 3 pps
Scjp Jug Section 2 Flow Control
SCJP, Clase 4: Operadores
Equipo de Marketing de Paradigma Digital
Guia demanejodeexcepcionesaserciones
Manejo de excepciones en Java
Publicidad

Similar a Sistemas Tolerantes a Fallas (20)

PDF
JVM Reactive Programming
PPTX
Tema servlets
PPTX
Tema servlets
PPTX
Tema servlets
PPTX
Tema servlets
PPT
Unit Testing - Trovit
DOCX
Reporte de grafos con semagforos de 3,3,4 y 6 procesos
PDF
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PPT
Unit Testing - GTUG
PDF
DefinicionExplicacionEjemplosdeHilosenJava
PPTX
Lenguaje de programacion java, conceptos
PPT
JAVA PARA PRINCIPIANTES2342342432231.PPT
PDF
Curso de Struts2: Unidad Didáctica 00 Introduccion
PPTX
Sistemas operativos unidad 2
PDF
5 Mecanismos Reuntilizacion Abstraccion Final
 
DOCX
Multitarea e hilos en java con ejemplos
DOCX
Practica cliente servidor java
DOCX
Programacion Servidor-Chat
PPTX
Concurrencia en Java
PPTX
Statement
JVM Reactive Programming
Tema servlets
Tema servlets
Tema servlets
Tema servlets
Unit Testing - Trovit
Reporte de grafos con semagforos de 3,3,4 y 6 procesos
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
Unit Testing - GTUG
DefinicionExplicacionEjemplosdeHilosenJava
Lenguaje de programacion java, conceptos
JAVA PARA PRINCIPIANTES2342342432231.PPT
Curso de Struts2: Unidad Didáctica 00 Introduccion
Sistemas operativos unidad 2
5 Mecanismos Reuntilizacion Abstraccion Final
 
Multitarea e hilos en java con ejemplos
Practica cliente servidor java
Programacion Servidor-Chat
Concurrencia en Java
Statement
Publicidad

Más de Agustin Ramos (14)

PDF
Exploring Elixir Codebases with Archeometer
PDF
From Elixir to Akka (and back) - ElixirConf Mx 2017
PDF
¿En qué la estamos regando en pruebas de software?
PDF
Programación funcional con haskell
PDF
Técnicas basadas en matriz de estructura de diseño
KEY
Acercándose a la entrega continua
KEY
Modelos de paralelismo y concurrencia
PPTX
Arquitecturas que crecen y arquitecturas que no
PDF
Arqueología de software
PPTX
Hola OSGi
PPTX
Desarrollo Dirigido por Comportamiento (con Cucumber y Groovy)
PPTX
BDD - Desarrollo dirigido por comportamiento
PPTX
La nueva imagen del gurú - El maestro artesano dentro del ingeniero
PPTX
Modularización efectiva - domando a la hidra
Exploring Elixir Codebases with Archeometer
From Elixir to Akka (and back) - ElixirConf Mx 2017
¿En qué la estamos regando en pruebas de software?
Programación funcional con haskell
Técnicas basadas en matriz de estructura de diseño
Acercándose a la entrega continua
Modelos de paralelismo y concurrencia
Arquitecturas que crecen y arquitecturas que no
Arqueología de software
Hola OSGi
Desarrollo Dirigido por Comportamiento (con Cucumber y Groovy)
BDD - Desarrollo dirigido por comportamiento
La nueva imagen del gurú - El maestro artesano dentro del ingeniero
Modularización efectiva - domando a la hidra

Último (20)

PPTX
Presentación PASANTIAS AuditorioOO..pptx
PDF
Calidad desde el Docente y la mejora continua .pdf
PDF
5.1 Pinch y Bijker en libro Actos, actores y artefactos de Bunch Thomas (coor...
PPT
introduccion a las_web en el 2025_mejoras.ppt
PDF
Plantilla para Diseño de Narrativas Transmedia.pdf
PDF
diagrama de pareto.pdf valerie giraldo diaz
PDF
Influencia-del-uso-de-redes-sociales.pdf
PPTX
REDES INFORMATICAS REDES INFORMATICAS.pptx
PDF
SAP Transportation Management para LSP, TM140 Col18
DOCX
Las nuevas tecnologías en la salud - enfermería técnica.
PDF
Conceptos básicos de programación tecnología.pdf
PPTX
RAP02 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
PDF
Estrategia de apoyo tecnología miguel angel solis
DOCX
Zarate Quispe Alex aldayir aplicaciones de internet .docx
PDF
Temas y subtemas de las fichas 1 y 2.pdf
PDF
Aristoteles-y-su-forma-de-entender-el-conocimiento-y-las-personas.pdf
PPT
Que son las redes de computadores y sus partes
PDF
clase auditoria informatica 2025.........
PDF
Instrucciones simples, respuestas poderosas. La fórmula del prompt perfecto.
PPTX
Presentación de Redes de Datos modelo osi
Presentación PASANTIAS AuditorioOO..pptx
Calidad desde el Docente y la mejora continua .pdf
5.1 Pinch y Bijker en libro Actos, actores y artefactos de Bunch Thomas (coor...
introduccion a las_web en el 2025_mejoras.ppt
Plantilla para Diseño de Narrativas Transmedia.pdf
diagrama de pareto.pdf valerie giraldo diaz
Influencia-del-uso-de-redes-sociales.pdf
REDES INFORMATICAS REDES INFORMATICAS.pptx
SAP Transportation Management para LSP, TM140 Col18
Las nuevas tecnologías en la salud - enfermería técnica.
Conceptos básicos de programación tecnología.pdf
RAP02 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
Estrategia de apoyo tecnología miguel angel solis
Zarate Quispe Alex aldayir aplicaciones de internet .docx
Temas y subtemas de las fichas 1 y 2.pdf
Aristoteles-y-su-forma-de-entender-el-conocimiento-y-las-personas.pdf
Que son las redes de computadores y sus partes
clase auditoria informatica 2025.........
Instrucciones simples, respuestas poderosas. La fórmula del prompt perfecto.
Presentación de Redes de Datos modelo osi

Sistemas Tolerantes a Fallas

  • 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.
  • 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.
  • 15. 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
  • 16. 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 (...) { ... }
  • 17. 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 (...) { ... }
  • 21. 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; } ...
  • 22. 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; } ...
  • 23. Circuit Breaker (5) ... private void success() { reset(); } private void fail() { counter++; if (counter > THRESHOLD) { tripBreaker(); } } private void reset() { state = CLOSED; counter = 0; } ...
  • 24. 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; } }
  • 28. 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); } } } }
  • 29. Fail Fast (4) public class MyService { Set<CircuitBreaker> requiredResources; // Initialize resources ... public Result myExpensiveAction(...) { FailFastGuard.checkResources(requiredResources); // Execute core action ... } }
  • 33. 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; } ...
  • 34. 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); } ...
  • 35. 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; } }
  • 39. 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; }
  • 43. 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
  • 44. Se MUY amable con tus usuarios Ellos te lo agradecerán :)