SlideShare una empresa de Scribd logo
1 de 40
Descargar para leer sin conexión
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 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
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
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
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.
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)
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)
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 é seguro para o GIL deixar
coisas acontecerem em paralelo é com IO.
➢
Se sua vida é IO-bound, isso é o que importa.
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 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.
Multithreading – Abstrações
➢
Abstrações úteis (todas disponíveis no concurrent-ruby):
➢
IVars
➢
Futures
➢
Promises
➢
Thread Pools
➢
Channels
➢
Software Transactional Memory (STM)
➢
Agents
Multithreading – Abstrações
➢
IVars
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
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”
Tempo fazendo o processamento dos eventos
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 relacionadas
a multi-threading.
➢
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
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, 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

Más contenido relacionado

La actualidad más candente

Desenvolvimento Frontend- JavaScript - Share
Desenvolvimento Frontend- JavaScript - ShareDesenvolvimento Frontend- JavaScript - Share
Desenvolvimento Frontend- JavaScript - ShareCesar William Alvarenga
 
Vagrant você deveria está usando
Vagrant   você deveria está usandoVagrant   você deveria está usando
Vagrant você deveria está usandoHudson Brendon
 
Conhecendo o Nodejs
Conhecendo o NodejsConhecendo o Nodejs
Conhecendo o NodejsCaio Cutrim
 
Introdução ao Node.js - FATEC SP
Introdução ao Node.js - FATEC SPIntrodução ao Node.js - FATEC SP
Introdução ao Node.js - FATEC SPArthur Fücher
 
Node.JS - Workshop do básico ao avançado
Node.JS - Workshop do básico ao avançadoNode.JS - Workshop do básico ao avançado
Node.JS - Workshop do básico ao avançadoEduardo Bohrer
 
Desmistificando um Ambiente de Desenvolvimento WEB com Vagrant
Desmistificando um Ambiente de Desenvolvimento WEB com VagrantDesmistificando um Ambiente de Desenvolvimento WEB com Vagrant
Desmistificando um Ambiente de Desenvolvimento WEB com VagrantLuis Henrique Costa
 
Linux Containers: do que são feitos? de onde vem? quem os alimenta?
Linux Containers: do que são feitos? de onde vem? quem os alimenta?Linux Containers: do que são feitos? de onde vem? quem os alimenta?
Linux Containers: do que são feitos? de onde vem? quem os alimenta?Marcos Paulo de Souza
 
Nodejs - A performance que eu sempre quis ter
Nodejs - A performance que eu sempre quis terNodejs - A performance que eu sempre quis ter
Nodejs - A performance que eu sempre quis terEmerson Macedo
 
Jruby, o melhor de 2 mundos (MacGyver + ChuckNorris)
Jruby, o melhor de 2 mundos (MacGyver + ChuckNorris)Jruby, o melhor de 2 mundos (MacGyver + ChuckNorris)
Jruby, o melhor de 2 mundos (MacGyver + ChuckNorris)Marcio Sfalsin
 
Introdução ao NodeJS
Introdução ao NodeJSIntrodução ao NodeJS
Introdução ao NodeJSGiovanni Bassi
 
Testes com javascript
Testes com javascriptTestes com javascript
Testes com javascriptLaís Lima
 
Introdução à programação em Ruby
Introdução à programação em RubyIntrodução à programação em Ruby
Introdução à programação em RubyDaniel Andrade
 
Node.js, Uma breve introdução
Node.js, Uma breve introduçãoNode.js, Uma breve introdução
Node.js, Uma breve introduçãoPablo Feijó
 
Delphi Conference 2012 - Programação Baseado em Regras com RTTI
Delphi Conference 2012 - Programação Baseado em Regras com RTTIDelphi Conference 2012 - Programação Baseado em Regras com RTTI
Delphi Conference 2012 - Programação Baseado em Regras com RTTIMario Guedes
 

La actualidad más candente (20)

Ruby
RubyRuby
Ruby
 
Desenvolvimento Frontend- JavaScript - Share
Desenvolvimento Frontend- JavaScript - ShareDesenvolvimento Frontend- JavaScript - Share
Desenvolvimento Frontend- JavaScript - Share
 
Vagrant você deveria está usando
Vagrant   você deveria está usandoVagrant   você deveria está usando
Vagrant você deveria está usando
 
Paradigmas do Ruby
Paradigmas do RubyParadigmas do Ruby
Paradigmas do Ruby
 
Conhecendo o Nodejs
Conhecendo o NodejsConhecendo o Nodejs
Conhecendo o Nodejs
 
Introdução ao Node.js - FATEC SP
Introdução ao Node.js - FATEC SPIntrodução ao Node.js - FATEC SP
Introdução ao Node.js - FATEC SP
 
A Linguagem Ruby
A Linguagem RubyA Linguagem Ruby
A Linguagem Ruby
 
Node.JS - Workshop do básico ao avançado
Node.JS - Workshop do básico ao avançadoNode.JS - Workshop do básico ao avançado
Node.JS - Workshop do básico ao avançado
 
Desmistificando um Ambiente de Desenvolvimento WEB com Vagrant
Desmistificando um Ambiente de Desenvolvimento WEB com VagrantDesmistificando um Ambiente de Desenvolvimento WEB com Vagrant
Desmistificando um Ambiente de Desenvolvimento WEB com Vagrant
 
Linux Containers: do que são feitos? de onde vem? quem os alimenta?
Linux Containers: do que são feitos? de onde vem? quem os alimenta?Linux Containers: do que são feitos? de onde vem? quem os alimenta?
Linux Containers: do que são feitos? de onde vem? quem os alimenta?
 
Utilizando Docker para escalonar aplicações Node.Js
Utilizando Docker para escalonar aplicações Node.JsUtilizando Docker para escalonar aplicações Node.Js
Utilizando Docker para escalonar aplicações Node.Js
 
Nodejs - A performance que eu sempre quis ter
Nodejs - A performance que eu sempre quis terNodejs - A performance que eu sempre quis ter
Nodejs - A performance que eu sempre quis ter
 
Jruby, o melhor de 2 mundos (MacGyver + ChuckNorris)
Jruby, o melhor de 2 mundos (MacGyver + ChuckNorris)Jruby, o melhor de 2 mundos (MacGyver + ChuckNorris)
Jruby, o melhor de 2 mundos (MacGyver + ChuckNorris)
 
Introdução ao NodeJS
Introdução ao NodeJSIntrodução ao NodeJS
Introdução ao NodeJS
 
Testes com javascript
Testes com javascriptTestes com javascript
Testes com javascript
 
Introdução à programação em Ruby
Introdução à programação em RubyIntrodução à programação em Ruby
Introdução à programação em Ruby
 
Python oo
Python ooPython oo
Python oo
 
Node.js, Uma breve introdução
Node.js, Uma breve introduçãoNode.js, Uma breve introdução
Node.js, Uma breve introdução
 
Python e Golang - Parte 2
Python e Golang - Parte 2Python e Golang - Parte 2
Python e Golang - Parte 2
 
Delphi Conference 2012 - Programação Baseado em Regras com RTTI
Delphi Conference 2012 - Programação Baseado em Regras com RTTIDelphi Conference 2012 - Programação Baseado em Regras com RTTI
Delphi Conference 2012 - Programação Baseado em Regras com RTTI
 

Destacado

Debian no limite - como ter um desktop atualizado
Debian no limite - como ter um desktop atualizadoDebian no limite - como ter um desktop atualizado
Debian no limite - como ter um desktop atualizadoClaudio Ferreira Filho
 
Ambient Light Events- Wylkon Queiroz
Ambient Light Events- Wylkon QueirozAmbient Light Events- Wylkon Queiroz
Ambient Light Events- Wylkon QueirozLocaweb
 
Overview Sobre Varnish
Overview Sobre VarnishOverview Sobre Varnish
Overview Sobre VarnishLocaweb
 
Postgres Wonderland - Campus Party 2013
Postgres Wonderland - Campus Party 2013Postgres Wonderland - Campus Party 2013
Postgres Wonderland - Campus Party 2013Fabio Telles Rodriguez
 
Tech talkrubocop
Tech talkrubocopTech talkrubocop
Tech talkrubocopLocaweb
 
Como encontrar uma agulha num palheiro de logs
Como encontrar uma agulha num palheiro de logsComo encontrar uma agulha num palheiro de logs
Como encontrar uma agulha num palheiro de logsDickson S. Guedes
 
Isolamento e mvcc
Isolamento e mvccIsolamento e mvcc
Isolamento e mvccLocaweb
 
Celery for SysAdmins
Celery for SysAdminsCelery for SysAdmins
Celery for SysAdminsLocaweb
 
Soluções para sua empresa vender na Internet
Soluções para sua empresa vender na InternetSoluções para sua empresa vender na Internet
Soluções para sua empresa vender na InternetLocaweb
 
API Do Email Marketing Locaweb
API Do Email Marketing LocawebAPI Do Email Marketing Locaweb
API Do Email Marketing LocawebLocaweb
 
Sistemas Distribuidos
Sistemas DistribuidosSistemas Distribuidos
Sistemas DistribuidosLocaweb
 
Dojo PHP (treinanto programação orientada a objetos em PHP)
Dojo PHP (treinanto programação orientada a objetos em PHP)Dojo PHP (treinanto programação orientada a objetos em PHP)
Dojo PHP (treinanto programação orientada a objetos em PHP)Fabrízio Mello
 
Se eu fosse a Microsoft
Se eu fosse a MicrosoftSe eu fosse a Microsoft
Se eu fosse a MicrosoftCesar Brod
 
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)Dickson S. Guedes
 

Destacado (20)

Debian no limite - como ter um desktop atualizado
Debian no limite - como ter um desktop atualizadoDebian no limite - como ter um desktop atualizado
Debian no limite - como ter um desktop atualizado
 
Postgres Wonderland - PGDay CE2013
Postgres  Wonderland - PGDay CE2013Postgres  Wonderland - PGDay CE2013
Postgres Wonderland - PGDay CE2013
 
Ambient Light Events- Wylkon Queiroz
Ambient Light Events- Wylkon QueirozAmbient Light Events- Wylkon Queiroz
Ambient Light Events- Wylkon Queiroz
 
Overview Sobre Varnish
Overview Sobre VarnishOverview Sobre Varnish
Overview Sobre Varnish
 
Postgres Big data
Postgres Big dataPostgres Big data
Postgres Big data
 
Postgres Wonderland - Campus Party 2013
Postgres Wonderland - Campus Party 2013Postgres Wonderland - Campus Party 2013
Postgres Wonderland - Campus Party 2013
 
Tech talkrubocop
Tech talkrubocopTech talkrubocop
Tech talkrubocop
 
Como encontrar uma agulha num palheiro de logs
Como encontrar uma agulha num palheiro de logsComo encontrar uma agulha num palheiro de logs
Como encontrar uma agulha num palheiro de logs
 
Isolamento e mvcc
Isolamento e mvccIsolamento e mvcc
Isolamento e mvcc
 
Celery for SysAdmins
Celery for SysAdminsCelery for SysAdmins
Celery for SysAdmins
 
Revisão do postgresql.conf
Revisão do postgresql.confRevisão do postgresql.conf
Revisão do postgresql.conf
 
Soluções para sua empresa vender na Internet
Soluções para sua empresa vender na InternetSoluções para sua empresa vender na Internet
Soluções para sua empresa vender na Internet
 
API Do Email Marketing Locaweb
API Do Email Marketing LocawebAPI Do Email Marketing Locaweb
API Do Email Marketing Locaweb
 
Freenas
FreenasFreenas
Freenas
 
Trabalhando com Logs no PostgreSQL
Trabalhando com Logs no PostgreSQLTrabalhando com Logs no PostgreSQL
Trabalhando com Logs no PostgreSQL
 
Sistemas Distribuidos
Sistemas DistribuidosSistemas Distribuidos
Sistemas Distribuidos
 
Dojo PHP (treinanto programação orientada a objetos em PHP)
Dojo PHP (treinanto programação orientada a objetos em PHP)Dojo PHP (treinanto programação orientada a objetos em PHP)
Dojo PHP (treinanto programação orientada a objetos em PHP)
 
Storage em Oracle RAC
Storage em Oracle RACStorage em Oracle RAC
Storage em Oracle RAC
 
Se eu fosse a Microsoft
Se eu fosse a MicrosoftSe eu fosse a Microsoft
Se eu fosse a Microsoft
 
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)
 

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

Concorrência e Paralelismo em Elixir (e outras linguagens)
Concorrência e Paralelismo em Elixir (e outras linguagens)Concorrência e Paralelismo em Elixir (e outras linguagens)
Concorrência e Paralelismo em Elixir (e outras linguagens)Gustavo Chapim
 
TDC2018SP | Trilha Node.js - Melhores praticas de desempenho utilizando Node....
TDC2018SP | Trilha Node.js - Melhores praticas de desempenho utilizando Node....TDC2018SP | Trilha Node.js - Melhores praticas de desempenho utilizando Node....
TDC2018SP | Trilha Node.js - Melhores praticas de desempenho utilizando Node....tdc-globalcode
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAThiago Cifani
 
PHP e a (in)segurança de aplicações
PHP e a (in)segurança de aplicaçõesPHP e a (in)segurança de aplicações
PHP e a (in)segurança de aplicaçõesrjsmelo
 
Concorrência em Android
Concorrência em AndroidConcorrência em Android
Concorrência em AndroidPedro Veloso
 
Sistemas Distribuídos - Computação Paralela
Sistemas Distribuídos - Computação ParalelaSistemas Distribuídos - Computação Paralela
Sistemas Distribuídos - Computação ParalelaAdriano Teixeira de Souza
 
Sistemas Distribuídos - Computação Paralela - Introdução
Sistemas Distribuídos - Computação Paralela - IntroduçãoSistemas Distribuídos - Computação Paralela - Introdução
Sistemas Distribuídos - Computação Paralela - IntroduçãoAdriano Teixeira de Souza
 
Esta começando a programar para a web? Então começe com Rails
Esta começando a programar para a web? Então começe com RailsEsta começando a programar para a web? Então começe com Rails
Esta começando a programar para a web? Então começe com Railsismaelstahelin
 
Desenvolvimento de aplicações embarcadas utilizando Python
Desenvolvimento de aplicações embarcadas utilizando PythonDesenvolvimento de aplicações embarcadas utilizando Python
Desenvolvimento de aplicações embarcadas utilizando PythonFlávio Ribeiro
 
Três anos de Scala em Produção: desafios, aprendizados e dores de cabeça
Três anos de Scala em Produção: desafios, aprendizados e dores de cabeçaTrês anos de Scala em Produção: desafios, aprendizados e dores de cabeça
Três anos de Scala em Produção: desafios, aprendizados e dores de cabeçaFelipe Hummel
 
PHP Turbinado com CodeIgniter - Conisli 2011
PHP Turbinado com CodeIgniter - Conisli 2011PHP Turbinado com CodeIgniter - Conisli 2011
PHP Turbinado com CodeIgniter - Conisli 2011Evaldo Junior
 
Além da programação funcional com Elixir e Erlang
Além da programação funcional com Elixir e ErlangAlém da programação funcional com Elixir e Erlang
Além da programação funcional com Elixir e ErlangElaine Naomi
 
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!Intel Software Brasil
 
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!Luciano Palma
 
Palestra: Computação Paralela na SECOMP 2013 (UNIFEI)
Palestra: Computação Paralela na SECOMP 2013 (UNIFEI)Palestra: Computação Paralela na SECOMP 2013 (UNIFEI)
Palestra: Computação Paralela na SECOMP 2013 (UNIFEI)Intel Software Brasil
 
Codando Assíncrono com Coroutines
Codando Assíncrono com CoroutinesCodando Assíncrono com Coroutines
Codando Assíncrono com CoroutinesArildo Borges Jr
 
Node js - O poder do JavaScript do lado do servidor
Node js  - O poder do JavaScript do lado do servidorNode js  - O poder do JavaScript do lado do servidor
Node js - O poder do JavaScript do lado do servidorRomulo Fagundes
 

Similar a Princípios de Concorrência em Ruby e Além (20)

Concorrência e Paralelismo em Elixir (e outras linguagens)
Concorrência e Paralelismo em Elixir (e outras linguagens)Concorrência e Paralelismo em Elixir (e outras linguagens)
Concorrência e Paralelismo em Elixir (e outras linguagens)
 
TDC2018SP | Trilha Node.js - Melhores praticas de desempenho utilizando Node....
TDC2018SP | Trilha Node.js - Melhores praticas de desempenho utilizando Node....TDC2018SP | Trilha Node.js - Melhores praticas de desempenho utilizando Node....
TDC2018SP | Trilha Node.js - Melhores praticas de desempenho utilizando Node....
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVA
 
Novas Fronteiras
Novas FronteirasNovas Fronteiras
Novas Fronteiras
 
PHP e a (in)segurança de aplicações
PHP e a (in)segurança de aplicaçõesPHP e a (in)segurança de aplicações
PHP e a (in)segurança de aplicações
 
Concorrência em Android
Concorrência em AndroidConcorrência em Android
Concorrência em Android
 
Palestra microservice semanatic
Palestra microservice semanaticPalestra microservice semanatic
Palestra microservice semanatic
 
Sistemas Distribuídos - Computação Paralela
Sistemas Distribuídos - Computação ParalelaSistemas Distribuídos - Computação Paralela
Sistemas Distribuídos - Computação Paralela
 
Sistemas Distribuídos - Computação Paralela - Introdução
Sistemas Distribuídos - Computação Paralela - IntroduçãoSistemas Distribuídos - Computação Paralela - Introdução
Sistemas Distribuídos - Computação Paralela - Introdução
 
Esta começando a programar para a web? Então começe com Rails
Esta começando a programar para a web? Então começe com RailsEsta começando a programar para a web? Então começe com Rails
Esta começando a programar para a web? Então começe com Rails
 
Desenvolvimento de aplicações embarcadas utilizando Python
Desenvolvimento de aplicações embarcadas utilizando PythonDesenvolvimento de aplicações embarcadas utilizando Python
Desenvolvimento de aplicações embarcadas utilizando Python
 
Três anos de Scala em Produção: desafios, aprendizados e dores de cabeça
Três anos de Scala em Produção: desafios, aprendizados e dores de cabeçaTrês anos de Scala em Produção: desafios, aprendizados e dores de cabeça
Três anos de Scala em Produção: desafios, aprendizados e dores de cabeça
 
PHP Turbinado com CodeIgniter - Conisli 2011
PHP Turbinado com CodeIgniter - Conisli 2011PHP Turbinado com CodeIgniter - Conisli 2011
PHP Turbinado com CodeIgniter - Conisli 2011
 
Além da programação funcional com Elixir e Erlang
Além da programação funcional com Elixir e ErlangAlém da programação funcional com Elixir e Erlang
Além da programação funcional com Elixir e Erlang
 
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
 
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
 
Palestra: Computação Paralela na SECOMP 2013 (UNIFEI)
Palestra: Computação Paralela na SECOMP 2013 (UNIFEI)Palestra: Computação Paralela na SECOMP 2013 (UNIFEI)
Palestra: Computação Paralela na SECOMP 2013 (UNIFEI)
 
Codando Assíncrono com Coroutines
Codando Assíncrono com CoroutinesCodando Assíncrono com Coroutines
Codando Assíncrono com Coroutines
 
Node js - O poder do JavaScript do lado do servidor
Node js  - O poder do JavaScript do lado do servidorNode js  - O poder do JavaScript do lado do servidor
Node js - O poder do JavaScript do lado do servidor
 
Intro linux
Intro linuxIntro linux
Intro linux
 

Más de Locaweb

Random testing
Random testingRandom testing
Random testingLocaweb
 
AngularJS
AngularJSAngularJS
AngularJSLocaweb
 
Testes utilizando cucumber + PhantomJs
Testes utilizando cucumber + PhantomJsTestes utilizando cucumber + PhantomJs
Testes utilizando cucumber + PhantomJsLocaweb
 
Lua tech talk
Lua tech talkLua tech talk
Lua tech talkLocaweb
 
Uso de estatísticas pelo postgre sql
Uso de estatísticas pelo postgre sqlUso de estatísticas pelo postgre sql
Uso de estatísticas pelo postgre sqlLocaweb
 
Linux cgroups and namespaces
Linux cgroups and namespacesLinux cgroups and namespaces
Linux cgroups and namespacesLocaweb
 
Comercio eletronico - Dicas práticas
Comercio eletronico - Dicas práticasComercio eletronico - Dicas práticas
Comercio eletronico - Dicas práticasLocaweb
 

Más de Locaweb (7)

Random testing
Random testingRandom testing
Random testing
 
AngularJS
AngularJSAngularJS
AngularJS
 
Testes utilizando cucumber + PhantomJs
Testes utilizando cucumber + PhantomJsTestes utilizando cucumber + PhantomJs
Testes utilizando cucumber + PhantomJs
 
Lua tech talk
Lua tech talkLua tech talk
Lua tech talk
 
Uso de estatísticas pelo postgre sql
Uso de estatísticas pelo postgre sqlUso de estatísticas pelo postgre sql
Uso de estatísticas pelo postgre sql
 
Linux cgroups and namespaces
Linux cgroups and namespacesLinux cgroups and namespaces
Linux cgroups and namespaces
 
Comercio eletronico - Dicas práticas
Comercio eletronico - Dicas práticasComercio eletronico - Dicas práticas
Comercio eletronico - Dicas práticas
 

Último

Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsDanilo Pinotti
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfSamaraLunas
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx2m Assessoria
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploDanilo Pinotti
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx2m Assessoria
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuisKitota
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx2m Assessoria
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx2m Assessoria
 

Último (8)

Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdf
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdf
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 

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

  • 1. Princípios de Concorrência em Ruby Renan Ranelli (Milhouse)
  • 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. 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. 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. 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. 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. 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)
  • 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.
  • 16. Multithreading ➢ Considere que os jobs no sidekiq são unicos Tem algum ruim nessa implementação ?? ➢
  • 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. Multithreading – Abstrações ➢ Abstrações úteis (todas disponíveis no concurrent-ruby): ➢ IVars ➢ Futures ➢ Promises ➢ Thread Pools ➢ Channels ➢ Software Transactional Memory (STM) ➢ Agents
  • 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
  • 23. Multithreading – Abstrações ➢ Promises ➢ Tipo Futures (só que Monads ;D) ➢ Pros Haskellistas: (then) = >==
  • 24. Multithreading – Abstrações ➢ Thread pools ➢ Worke-horse dos executors.
  • 26. Caso de uso - Hodor
  • 27. Caso de uso - Hodor Novo sistema Old database
  • 28. Caso de uso - Hodor
  • 29. Caso de uso - Hodor
  • 30. Caso de uso - Hodor
  • 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
  • 33.
  • 35. Lições aprendidas ➢ PELO AMOR DE DEUS NÃO USA `Timeout::timeout` !! 1!!1!!um!!onze! ➢
  • 36. Lições aprendidas ➢ Cuidado com o connection pool do ActiveRecord (Principalmente se for Rails < 4) ➢
  • 37. Lições aprendidas ➢ Por favor, atualizem as versões dos drivers de banco. TinyTds ~ 0.5 tinha zilhares de issues relacionadas a multi-threading. ➢
  • 38. 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
  • 39. Lições aprendidas ➢ Converse (e ajude!) com a galera que desenvolve as gems ➢
  • 40. ➢ 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