Princípios de Concorrência
em Ruby
Renan Ranelli (Milhouse)
Agenda
➢
O que é concorrência ?
➢
Pra quê escrever código concorrente ?
➢
(Breve) Explicação dos diferentes modelos de con...
O que é concorrência?
➢
Concorrência, assincronia e paralelismo são coisas relacionadas mas
que muita gente as confunde.
➢...
O que é concorrência?
➢
Assincronia significa que o resultado de uma
computação não esta disponível imediatamente
após a a...
Pra quê escrever código concorrente
➢
Concorrência possibilita assincronia e paralelismo
➢
Libera o CPU para fazer outras ...
Diferentes modelos de concorrência
➢
Multiprocesses (resque, unicorn)
➢
Multithreading (sidekiq)
➢
Fibers (Ruby tem fibers...
Multithreading
➢
Threads, assim como processos, são coisas oferecidas
pelo SO.
➢
Mutexes ~
➢
Deadlocks ~
➢
Thread#join ~
➢...
Multithreading
Multithreading
Pausa para o GIL
Pausa para o GIL
Pausa para o GIL
➢
O GIL (Global Interpreter Lock) impede que código
ruby rode em paralelo.
➢
A unica ocasião em que é seg...
Pausa para o GIL
Pausa para o GIL
Pausa para o GIL
Multithreading
➢
Considere que os jobs no sidekiq são unicos
Tem algum ruim nessa implementação ??
➢
Multithreading – Evite Thread.new
➢
É uma boa idéia não usar threads diretamente.
➢
Existem várias abstrações melhores e m...
Multithreading – Abstrações
➢
Abstrações úteis (todas disponíveis no concurrent-ruby):
➢
IVars
➢
Futures
➢
Promises
➢
Thre...
Multithreading – Abstrações
➢
IVars
Multithreading – Abstrações
➢
Futures
Feature:
As a highly responsive Ruby application
I want long-running tasks on a sepa...
Multithreading – Abstrações
➢
Futures
Multithreading – Abstrações
➢
Implementação porca
Multithreading – Abstrações
➢
Promises
➢
Tipo Futures (só que Monads ;D)
➢
Pros Haskellistas: (then) = >==
Multithreading – Abstrações
➢
Thread pools
➢
Worke-horse dos executors.
Multithreading – Abstrações
Caso de uso - Hodor
Caso de uso - Hodor
Novo sistema
Old database
Caso de uso - Hodor
Caso de uso - Hodor
Caso de uso - Hodor
Caso de uso - Hodor
➢
Dahora! Tudo funcionava....
➢
Mas ai resolvemos medir:
Tempo atualizando status dos eventos na “fila...
Pareceu Fácil né ???
Foi nada.
Lições aprendidas
➢
PELO AMOR DE DEUS NÃO USA `Timeout::timeout` !!
1!!1!!um!!onze!
➢
Lições aprendidas
➢
Cuidado com o connection pool do ActiveRecord
(Principalmente se for Rails < 4)
➢
Lições aprendidas
➢
Por favor, atualizem as versões dos drivers de banco.
TinyTds ~ 0.5 tinha zilhares de issues relaciona...
Lições aprendidas
➢
Metricas são muito mais legais que logs
➢
http://webleela.service.ita.consul.locaweb.com.br/inde
x.htm...
Lições aprendidas
➢
Converse (e ajude!) com a galera que desenvolve as
gems
➢
➢
Figura pare pense ?
➢
➢
Para evitar problemas como o da foto do mimi triste:
➢
1. Não use concorrência
➢
2. Se for usar,...
Princípios de Concorrência em Ruby e Além
Próximos SlideShares
Carregando em…5
×

Princípios de Concorrência em Ruby e Além

369 visualizações

Publicada em

Renan Ranelli, fala sobre as ferramentas que o Ruby oferece para programação concorrente, modelos de concorrência do Ruby e outras alternativas. Também fala sobre o porquê é necessário a programação concorrente, algumas abstrações úteis e também vou apresenta brevemente o caso de uma aplicação que sua equipe desenvolveu na hospedagem, alguns dos problemas que enfrentaram e as soluções abordadas.

Publicada em: Tecnologia
0 comentários
1 gostou
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
369
No SlideShare
0
A partir de incorporações
0
Número de incorporações
6
Ações
Compartilhamentos
0
Downloads
5
Comentários
0
Gostaram
1
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Princípios de Concorrência em Ruby e Além

  1. 1. Princípios de Concorrência em Ruby Renan Ranelli (Milhouse)
  2. 2. Agenda ➢ O que é concorrência ? ➢ Pra quê escrever código concorrente ? ➢ (Breve) Explicação dos diferentes modelos de concorrência ➢ Por que escrever código concorrente é dificil ? ➢ O que é o tão odiado GIL ➢ Abstrações úteis que facilitam sua vida multithreaded ➢ Exemplo de como usamos isso tudo em uma app real & lições aprendidas
  3. 3. O que é concorrência? ➢ Concorrência, assincronia e paralelismo são coisas relacionadas mas que muita gente as confunde. ➢ “Concurrency is when two tasks can start, run, and complete in overlapping time periods. It doesn’t necessarily mean they’ll ever both be running at the same instant. E.g. Multitasking in a single core machine” ➢ “Parallelism is when tasks literally run at the same time, e.g. on a multicore processor or SIMD instructions” - Sun’s Multithreaded programming guide
  4. 4. O que é concorrência? ➢ Assincronia significa que o resultado de uma computação não esta disponível imediatamente após a avaliação. ➢ Significa que a maquina pode fazer outras coisas enquanto espera essa computação terminar e eventualmente no futuro fazer uso do resultado da mesma
  5. 5. Pra quê escrever código concorrente ➢ Concorrência possibilita assincronia e paralelismo ➢ Libera o CPU para fazer outras coisas enquanto espera por IO (http, banco, rede, disco, etc.) oferece mais performance. E.g. você poderá servir os requests de 30 usuários ao mesmo tempo ao invés de 1.
  6. 6. Diferentes modelos de concorrência ➢ Multiprocesses (resque, unicorn) ➢ Multithreading (sidekiq) ➢ Fibers (Ruby tem fibers!) ➢ Corroutines ➢ Actors (Celluloid) ➢ Outras bruxarias que eu não manjo(process calculi)
  7. 7. Multithreading ➢ Threads, assim como processos, são coisas oferecidas pelo SO. ➢ Mutexes ~ ➢ Deadlocks ~ ➢ Thread#join ~ ➢ Comportamento diferente com exceptions (e.g. streaming do log no package-installer)
  8. 8. Multithreading
  9. 9. Multithreading
  10. 10. Pausa para o GIL
  11. 11. Pausa para o GIL
  12. 12. Pausa para o GIL ➢ O GIL (Global Interpreter Lock) impede que código ruby rode em paralelo. ➢ A unica ocasião em que é seguro para o GIL deixar coisas acontecerem em paralelo é com IO. ➢ Se sua vida é IO-bound, isso é o que importa.
  13. 13. Pausa para o GIL
  14. 14. Pausa para o GIL
  15. 15. Pausa para o GIL
  16. 16. Multithreading ➢ Considere que os jobs no sidekiq são unicos Tem algum ruim nessa implementação ?? ➢
  17. 17. Multithreading – Evite Thread.new ➢ É uma boa idéia não usar threads diretamente. ➢ Existem várias abstrações melhores e mais seguras para expressar a task que você tem em mãos. ➢ Uma referência excelente é a lib do java java.util.concurrent. No mundo Ruby existe a gem concurrent-ruby que implementa parte do java.util.concurrent.
  18. 18. Multithreading – Abstrações ➢ Abstrações úteis (todas disponíveis no concurrent-ruby): ➢ IVars ➢ Futures ➢ Promises ➢ Thread Pools ➢ Channels ➢ Software Transactional Memory (STM) ➢ Agents
  19. 19. Multithreading – Abstrações ➢ IVars
  20. 20. Multithreading – Abstrações ➢ Futures Feature: As a highly responsive Ruby application I want long-running tasks on a separate thread So I can perform other tasks without waiting
  21. 21. Multithreading – Abstrações ➢ Futures
  22. 22. Multithreading – Abstrações ➢ Implementação porca
  23. 23. Multithreading – Abstrações ➢ Promises ➢ Tipo Futures (só que Monads ;D) ➢ Pros Haskellistas: (then) = >==
  24. 24. Multithreading – Abstrações ➢ Thread pools ➢ Worke-horse dos executors.
  25. 25. Multithreading – Abstrações
  26. 26. Caso de uso - Hodor
  27. 27. Caso de uso - Hodor Novo sistema Old database
  28. 28. Caso de uso - Hodor
  29. 29. Caso de uso - Hodor
  30. 30. Caso de uso - Hodor
  31. 31. Caso de uso - Hodor ➢ Dahora! Tudo funcionava.... ➢ Mas ai resolvemos medir: Tempo atualizando status dos eventos na “fila” Tempo fazendo o processamento dos eventos
  32. 32. Pareceu Fácil né ???
  33. 33. Foi nada.
  34. 34. Lições aprendidas ➢ PELO AMOR DE DEUS NÃO USA `Timeout::timeout` !! 1!!1!!um!!onze! ➢
  35. 35. Lições aprendidas ➢ Cuidado com o connection pool do ActiveRecord (Principalmente se for Rails < 4) ➢
  36. 36. Lições aprendidas ➢ Por favor, atualizem as versões dos drivers de banco. TinyTds ~ 0.5 tinha zilhares de issues relacionadas a multi-threading. ➢
  37. 37. Lições aprendidas ➢ Metricas são muito mais legais que logs ➢ http://webleela.service.ita.consul.locaweb.com.br/inde x.html#/dashboard/db/heisenberghodor
  38. 38. Lições aprendidas ➢ Converse (e ajude!) com a galera que desenvolve as gems ➢
  39. 39. ➢ Figura pare pense ? ➢ ➢ Para evitar problemas como o da foto do mimi triste: ➢ 1. Não use concorrência ➢ 2. Se for usar, não compartilhe nada. Não decida usar antes de MEDIR e ter certeza que você realmente precisa. ➢ 3. Se tiver que compartilhar, tomar muito cuidado pra sincronizar o acesso

×