Slide 1

Slide 1 text

Disyuntores O cómo no terminar viviendo abajo de un puente

Slide 2

Slide 2 text

{github,twitter}.com/inkel Web Developer DevOps Wannabe Citrusbyte RubyConfAR No sé diseñar slides Fundamentalista de la barba Lector

Slide 3

Slide 3 text

goodreads.com/inkel

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

● Aplicaciones distribuidas ● SOA ● Microservicios

Slide 6

Slide 6 text

twitter.com/adrianco

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

on get, "pokemon" do render("pokemon/index", pokemons: PokeDex.all) end

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

Ser popular tiene su precio 1. Más visitas 2. Más consultas a la base de datos 3. Más lenta cada consulta 4. Mayor cantidad de recursos 5. Timeouts 6. GOTO 2

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

on get, "pokemon" do pokemons = Cache.fetch(:pokemons) do PokeDex.all end render("pokemon/index", pokemons:pokemons) end

Slide 14

Slide 14 text

on get, "pokemon" do pokemons = Cache.fetch(:pokemons) do PokeDex.all end render("pokemon/index", pokemons:pokemons) end

Slide 15

Slide 15 text

Creemos que las cosas fallan así...

Slide 16

Slide 16 text

...cuando en realidad fallan así

Slide 17

Slide 17 text

“Si algo puede salir mal, probablemente salga mal” Edward A. Murphy Jr.

Slide 18

Slide 18 text

Cosas que pueden fallar ● Cache ● Base de datos ● Saturación de red ● Particiones de red ● Noisy-neighbor ● CPU ● OOM ● Espacio libre ● Timeouts ● Índices viejos ● Integer overflow ● Etcétera

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

es.wikipedia.org/wiki/Disyuntor Un disyuntor, interruptor automático (España), automático (Chile), breaker o pastilla (México) o taco (Colombia), es un aparato capaz de interrumpir o abrir un circuito eléctrico cuando la intensidad de la corriente eléctrica que por él circula excede de un determinado valor, o en el que se ha producido un cortocircuito, con el objetivo de evitar daños a los equipos eléctricos. A diferencia de los fusibles, que deben ser reemplazados tras un único uso, el disyuntor puede ser rearmado una vez localizado y reparado el problema que haya causado su disparo o desactivación automática.

Slide 21

Slide 21 text

es.wikipedia.org/wiki/Disyuntor Un disyuntor, interruptor automático (España), automático (Chile), breaker o pastilla (México) o taco (Colombia), es un aparato capaz de interrumpir o abrir un circuito eléctrico cuando la intensidad de la corriente eléctrica que por él circula excede de un determinado valor, o en el que se ha producido un cortocircuito, con el objetivo de evitar daños a los equipos eléctricos. A diferencia de los fusibles, que deben ser reemplazados tras un único uso, el disyuntor puede ser rearmado una vez localizado y reparado el problema que haya causado su disparo o desactivación automática.

Slide 22

Slide 22 text

Circuit Breaker Pattern ● Controla el acceso y ejecución de un bloque de código ● Sobrepasado el límite de errores consecutivos, abre el circuito ● Todo intento a ejecutar el código falla con un error conocido ● Pasado cierto timeout, intenta ejecutar el código ● Si funciona correctamente, cierra el circuito ● Si falla, comienza el ciclo nuevamente

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

Ejemplo

Slide 25

Slide 25 text

# A partir del décimo error consecutivo, abrir el circuito # y esperar 5 segundos para volver a intentarlo. disyuntor_cache = Disyuntor.new(threshold: 10, timeout: 5) # A partir del quinto error consecutivo, abrir el circuito # y esperar 1 minuto para volver a intentarlo. disyuntor_db = Disyuntor.new(threshold: 5, timeout: 60) # Ejecutar una acción personalizada cuando el circuito esté # abierto. disyuntor_db.on_circuit_open do fail DBNotFound end

Slide 26

Slide 26 text

on get, "pokemons" do begin pokemons = get_pokemons_from_cache render("pokemons/index", pokemons: pokemons) rescue DBNotFound render("db_not_found") end end

Slide 27

Slide 27 text

on get, "pokemons" do begin pokemons = get_pokemons_from_cache render("pokemons/index", pokemons: pokemons) rescue DBNotFound render("db_not_found") end end

Slide 28

Slide 28 text

def get_pokemons_from_cache disyuntor_cache.try do Cache.fetch(:pokemons) do get_pokemons end end rescue Disyuntor::CircuitOpenError get_pokemons end

Slide 29

Slide 29 text

def get_pokemons_from_cache disyuntor_cache.try do Cache.fetch(:pokemons) do get_pokemons end end rescue Disyuntor::CircuitOpenError get_pokemons end

Slide 30

Slide 30 text

def get_pokemons_from_cache disyuntor_cache.try do Cache.fetch(:pokemons) do get_pokemons end end rescue Disyuntor::CircuitOpenError get_pokemons end

Slide 31

Slide 31 text

def get_pokemons disyuntor_db.try do PokeDex.all end end

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

Festejar con moderación resiliente 1. adj. Que tiene resiliencia. resiliencia Del ingl. resilience, y este der. del lat. resiliens, -entis, part. pres. act. de resilīre 'saltar hacia atrás, rebotar', 'replegarse'. 1. f. Capacidad de adaptación de un ser vivo frente a un agente perturbador o un estado o situación adversos. 2. f. Capacidad de un material, mecanismo o sistema para recuperar su estado inicial cuando ha cesado la perturbación a la que había estado sometido.

Slide 34

Slide 34 text

Entonces, ¿qué conseguimos? ● Si uno de los servicios no funciona falla inmediatamente. ● Menor consumo de recursos en los servidores, debido a no ejecutar código que sabemos va a fallar. ● Menos intervención manual dado que el sistema se “arregla” automáticamente. ● Disminución en el número de errores en cascada.

Slide 35

Slide 35 text

“A su manera, los disyuntores ayudan a reducir recursos asociados a operaciones que probablemente vayan a fallar. Evitás esperar un timeout en el cliente, y un circuito abierto evita poner carga en un servidor sobrecargado.” Martin Fowler

Slide 36

Slide 36 text

Disyuntores en Ruby ● github.com/wsargent/circuit_breaker ● github.com/soundcloud/simple_circuit_breaker ● github.com/pedro/cb2 ● github.com/inkel/disyuntor ● Implementalo vos!

Slide 37

Slide 37 text

No content

Slide 38

Slide 38 text

Su consulta no molesta

Slide 39

Slide 39 text

● Release It!: Design and Deploy Production-Ready Software ● Martin Fowler: Circuit Breaker ● Improved production stability with circuit breakers ● Making the Netflix API More Resilient ● Esta charla Más info