Cuidando de mais de 1 milhão
de usuários por rodada no CartolaFC
Alexandre Saboia
saboia@corp.globo.com
@alexandresaboia
- bacharel em informática 

PUC-Rio
- full stack developer
- ~ 10 anos de globo.com
- ~ 6 anos em equipes ágeis
AlexandreSaboia
saboia@corp.globo.com
@alexandresaboia
cultura
futebol
centradano
Fonte: IBGE | Stochos Sports Entertainment
números
+de
3milhõesdeusuários
0
450K
900K
1,350K
1,800K
2009 2010 2011 2012 2013 2014 2015
histórico de recordes de times escalados em uma rodada
histórico de recordes de times escalados em uma rodada
450K
900K
1,350K
1,800K
2009 2010 2011 2012 2013 2014 2015
1.766.349timesescaladosna
rodada14
histórico de recordes de times escalados em uma rodada
450K
900K
1,350K
1,800K
2009 2010 2011 2012 2013 2014 2015
1,766K
1,371K
1,284K1,277K
1,151K
750K
573K
+1Mi
timesescaladosem
menosde24hs
histórico de recordes de times escalados em uma rodada
450K
900K
1,350K
1,800K
2009 2010 2011 2012 2013 2014 2015
1,766K
1,371K
1,284K1,277K
1,151K
750K
573K
+200Mi
requestsaAPIem
umdomingo
http://immortaldc.com/wp-content/uploads/2013/10/system-analysis-1024x681.jpg
Como suportamos todo
este volume?
comosuportamostodoestevolume?
api
multi-device
atualização
processamentodos
dados
game
aplicaçãoweb
admin
controledojogo
aplicação
infraestrutura
bancodedados
atualizaçãoderodada
comosuportamostodoestevolume?
aplicação
infraestrutura
bancodedados
atualizaçãoderodada
comosuportamostodoestevolume?
beanstalkd
tecnologiasaplicadas
asyncmongo
http://nginx.org/

https://github.com/nginx/nginx
http://www.tornadoweb.org/en/stable/

https://github.com/tornadoweb/tornado
tecnologiasaplicadas
http://nginx.org/

https://github.com/nginx/nginx
http://www.tornadoweb.org/en/stable/

https://github.com/tornadoweb/tornado
tecnologiasaplicadas
Por que não?
http://blog.webfaction.com/2008/12/a-little-holiday-present-10000-reqssec-with-nginx-2/
x
benchmark
http://blog.webfaction.com/2008/12/a-little-holiday-present-10000-reqssec-with-nginx-2/
x
benchmark
altaperformance
baixoconsumode
recursos
e
outrospontosfortes
reverse proxy cache
expiração ativa
load balancer
baixo consumo
alta performance
https://www.digitalocean.com/community/tutorials/understanding-nginx-http-proxying-load-balancing-buffering-and-caching
Por que ?
https://developers.facebook.com/blog/post/301
outrospontosfortes
open source
assíncrono
simples
i/o não bloqueante
performance
http://tornado.readthedocs.org/
repository template	

controller	

model
arquitetura
cache
cache
estratégia: cachear as instâncias e
também os relacionamentos
@staticmethod!
def get_by_status (status_id, rodada_id):!
!
atleta_rodada_ids = AtletaRodada()!
! ! ! ! ! ! .ids_by_status(status_id=status_id, rodada_id=rodada_id)!
!
atletas_lesionados = []!
!
for atleta_rodada_id in atleta_rodada_ids:!
atleta = AtletaRodada().get(atleta_rodada_id)!
atletas_lesionados.append(atleta)!
!
return atletas_lesionados
ganhandovelocidade
chamadas ajax montam
determinadas partes
controller monta a
estrutura
cache estático dos jsons
destas partes
ganhandovelocidade
versionamento dos assets
otimização dos seletores
jquery
um único arquivo .js
minificado
redução no tamanho e no
número de imagens
aplicação
infraestrutura
bancodedados
atualizaçãoderodada
comosuportamostodoestevolume?
emação
workerworker
workerworker
usuário
internet
emação
usuário
internet
wowo
wowo
wowo
wowo
wowo
wowo
Load Balancer
cartolabox
beanstalkd
API GAME
DEAMON
DEAMON
DEAMON
DEAMON
API e Game compartilham recursos
beanstalkd
API GAM
DEAMON
DEAMON
DEAMON
DEAMON
boxesemaisboxes
beanstalkd
API GAM
DEAMON
DEAMON
DEAMON
DEAMON
boxesemaisboxes
beanstalk
API GAM
DEAMON
DEAMON
DEAMON
DEAMON
beanstalk
API GAM
DEAMON
DEAMON
DEAMON
DEAMON
beanstalk
API GAM
DEAMON
DEAMON
DEAMON
DEAMON
beanstalkd
API GAM
DEAMON
DEAMON
DEAMON
DEAMON
beanstalkd
API GAM
DEAMON
DEAMON
DEAMON
DEAMON
volumedeacessos
pense:
requests dinâmicos com tempo de
resposta em 100ms é aceitável?
e se você tiver 300.000 conexões
simultâneas?
e se depois do request cachearmos
por 15 min em um arquivo estático?
e se você tiver 1.5Mi de times
escalados?
cenário: consulta a pontuação parcial via api
volumedeacessos
requests > 100ms viram problema
neste cenário de concorrência
ações:
otimização para ter < 50ms
rever a relevância de cada dado
retornado pela API
mudar a estratégia de entrega da api
problemática
cenário: consulta a pontuação parcial via api
testesdeperformance
usar as ferramentas ao longo
do desenvolvimento para
identificar gargalos
http://httpd.apache.org/docs/2.2/programs/ab.html
https://github.com/wg/wrk
wrka HTTP benchmarking tool
apache benchmark
é possível acompanhar a
performance do seu código
rodando testes da sua máquina
não é necessário que sua
aplicação chegue em produção
aplicação
infraestrutura
bancodedados
atualizaçãoderodada
comosuportamostodoestevolume?
~166GB
+300Mi
tamanhofísico
dobancoatéa
rodada#20
delinhasem
somenteumatabela
atéarodada#20
+26Mi
denovaslinhasa
cadarodada
processada
slave
masterfailover
vip de leitura
vip de escrita
read only
bancodedados
bancodedados
slave
masterfailover
vip de leitura
vip de escrita
read only
Atraso na replicação da
escrita implica na retirada da
máquina slave do vip
boasestratégias
querys simples
cruzar os dados na aplicação
cachear resultados de querys básicas
saber o que o ORM está fazendo
update? delete + insert
querys com tempo > 50 ms ?
tabela enorme
partitions
rodada 1
rodada 2
rodada 3
rodada N
…
tabela enorme
partitions sub-tabela
partition 1
sub-tabela
partition 2
sub-tabela
partition 3
sub-tabela
partition N
…
rodada 1
rodada 2
rodada 3
rodada N
rodada 1
rodada 2
rodada 3
rodada N
…
aplicação
infraestrutura
bancodedados
atualizaçãoderodada
comosuportamostodoestevolume?
multiprocesso
multiprocesso em Python:
http://sebastianraschka.com/Articles/2014_multiprocessing_intro.html
https://docs.python.org/2.7/library/multiprocessing.html
24 Cores CPU
from multiprocessing
import Process
24 Cores CPU
24 Cores CPU ...
multiprocesso
multiprocesso
http://sebastianraschka.com/Articles/2014_multiprocessing_intro.html
https://docs.python.org/2.7/library/multiprocessing.html
pré-cache
dados básicos
dados dos atletas
• rodada, partidas, clubes, status, esquema tático …
• info do atleta, pontuação, mercado e filtros
estratégia: cachear as instâncias e
também os relacionamentos
pré-cache
dados dos times
dados das ligas
a estratégia: cachear as instâncias e
também os relacionamentos
• info do time, pontuação, escalação
• info da liga, ranking, times de uma liga, ligas de um time
Perguntas?
https://github.com/globocom/IWantToWorkAtGloboCom

Cuidando de mais de 1 milhão de usuários por rodada no CartolaFC