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 ...
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.34...
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...
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...
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/torn...
http://nginx.org/

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

https://github.com/tornadoweb/torn...
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
baixoc...
outrospontosfortes
reverse proxy cache
expiração ativa
load balancer
baixo consumo
alta performance
https://www.digitaloce...
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...
ganhandovelocidade
chamadas ajax montam
determinadas partes
controller monta a
estrutura
cache estático dos jsons
destas p...
ganhandovelocidade
versionamento dos assets
otimização dos seletores
jquery
um único arquivo .js
minificado
redução no tama...
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...
volumedeacessos
pense:
requests dinâmicos com tempo de
resposta em 100ms é aceitável?
e se você tiver 300.000 conexões
sim...
volumedeacessos
requests > 100ms viram problema
neste cenário de concorrência
ações:
otimização para ter < 50ms
rever a re...
testesdeperformance
usar as ferramentas ao longo
do desenvolvimento para
identificar gargalos
http://httpd.apache.org/docs/...
aplicação
infraestrutura
bancodedados
atualizaçãoderodada
comosuportamostodoestevolume?
~166GB
+300Mi
tamanhofísico
dobancoatéa
rodada#20
delinhasem
somenteumatabela
atéarodada#20
+26Mi
denovaslinhasa
cadarodad...
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 retir...
boasestratégias
querys simples
cruzar os dados na aplicação
cachear resultados de querys básicas
saber o que o ORM está fa...
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
…
rod...
aplicação
infraestrutura
bancodedados
atualizaçãoderodada
comosuportamostodoestevolume?
multiprocesso
multiprocesso em Python:
http://sebastianraschka.com/Articles/2014_multiprocessing_intro.html
https://docs.p...
24 Cores CPU
24 Cores CPU ...
multiprocesso
multiprocesso
http://sebastianraschka.com/Articles/2014_multiprocessing_intro....
pré-cache
dados básicos
dados dos atletas
• rodada, partidas, clubes, status, esquema tático …
• info do atleta, pontuação...
pré-cache
dados dos times
dados das ligas
a estratégia: cachear as instâncias e
também os relacionamentos
• info do time, ...
Perguntas?
https://github.com/globocom/IWantToWorkAtGloboCom
Cuidando de mais de 1 milhão de usuários por rodada no CartolaFC
Cuidando de mais de 1 milhão de usuários por rodada no CartolaFC
Cuidando de mais de 1 milhão de usuários por rodada no CartolaFC
Cuidando de mais de 1 milhão de usuários por rodada no CartolaFC
Cuidando de mais de 1 milhão de usuários por rodada no CartolaFC
Próximos SlideShares
Carregando em…5
×

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

557 visualizações

Publicada em

O CartolaFC é o maior fantasy game do Brasil. Não só pela quantidade de usuários, como também pela quantidade de dados manipulados durante as 38 rodadas do Campeonato Brasileiro de futebol. São mais de 3 milhões de usuários que a cada rodada geram 26 milhões de novas linhas no banco de dados.

Do lançamento em 2006 até hoje, evoluímos nossa arquitetura para uma aplicação web capaz de suportar milhares de acessos simultâneos e um grande volume de dados, utilizando tecnologias open source. Nessa palestra iremos apresentar uma visão aprofundada e técnica sobre a aplicação atual e os desafios encontrados ao escalá-la.

Ao assistir a apresentação, você entenderá nossas decisões técnicas – da escolha do banco de dados à definição dos servidores, passando por desafios ao escalar o CartolaFC. Também conhecerá dicas e experiências para auxiliar na construção de suas aplicações web e domar questões de desempenho e escalabilidade.

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

Sem downloads
Visualizações
Visualizações totais
557
No SlideShare
0
A partir de incorporações
0
Número de incorporações
11
Ações
Compartilhamentos
0
Downloads
3
Comentários
0
Gostaram
2
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

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

  1. 1. Cuidando de mais de 1 milhão de usuários por rodada no CartolaFC
  2. 2. 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
  3. 3. cultura futebol centradano Fonte: IBGE | Stochos Sports Entertainment
  4. 4. números
  5. 5. +de 3milhõesdeusuários
  6. 6. 0 450K 900K 1,350K 1,800K 2009 2010 2011 2012 2013 2014 2015 histórico de recordes de times escalados em uma rodada
  7. 7. 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
  8. 8. 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
  9. 9. 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
  10. 10. http://immortaldc.com/wp-content/uploads/2013/10/system-analysis-1024x681.jpg Como suportamos todo este volume?
  11. 11. comosuportamostodoestevolume? api multi-device atualização processamentodos dados game aplicaçãoweb admin controledojogo
  12. 12. aplicação infraestrutura bancodedados atualizaçãoderodada comosuportamostodoestevolume?
  13. 13. aplicação infraestrutura bancodedados atualizaçãoderodada comosuportamostodoestevolume?
  14. 14. beanstalkd tecnologiasaplicadas asyncmongo
  15. 15. http://nginx.org/ https://github.com/nginx/nginx http://www.tornadoweb.org/en/stable/ https://github.com/tornadoweb/tornado tecnologiasaplicadas
  16. 16. http://nginx.org/ https://github.com/nginx/nginx http://www.tornadoweb.org/en/stable/ https://github.com/tornadoweb/tornado tecnologiasaplicadas Por que não?
  17. 17. http://blog.webfaction.com/2008/12/a-little-holiday-present-10000-reqssec-with-nginx-2/ x benchmark
  18. 18. http://blog.webfaction.com/2008/12/a-little-holiday-present-10000-reqssec-with-nginx-2/ x benchmark altaperformance baixoconsumode recursos e
  19. 19. 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
  20. 20. Por que ?
  21. 21. https://developers.facebook.com/blog/post/301
  22. 22. outrospontosfortes open source assíncrono simples i/o não bloqueante performance
  23. 23. http://tornado.readthedocs.org/
  24. 24. repository template controller model arquitetura cache
  25. 25. 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
  26. 26. ganhandovelocidade chamadas ajax montam determinadas partes controller monta a estrutura cache estático dos jsons destas partes
  27. 27. ganhandovelocidade versionamento dos assets otimização dos seletores jquery um único arquivo .js minificado redução no tamanho e no número de imagens
  28. 28. aplicação infraestrutura bancodedados atualizaçãoderodada comosuportamostodoestevolume?
  29. 29. emação workerworker workerworker usuário internet
  30. 30. emação usuário internet wowo wowo wowo wowo wowo wowo Load Balancer
  31. 31. cartolabox beanstalkd API GAME DEAMON DEAMON DEAMON DEAMON API e Game compartilham recursos
  32. 32. beanstalkd API GAM DEAMON DEAMON DEAMON DEAMON boxesemaisboxes
  33. 33. 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
  34. 34. 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
  35. 35. 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
  36. 36. 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
  37. 37. aplicação infraestrutura bancodedados atualizaçãoderodada comosuportamostodoestevolume?
  38. 38. ~166GB +300Mi tamanhofísico dobancoatéa rodada#20 delinhasem somenteumatabela atéarodada#20 +26Mi denovaslinhasa cadarodada processada
  39. 39. slave masterfailover vip de leitura vip de escrita read only bancodedados
  40. 40. 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
  41. 41. 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 ?
  42. 42. tabela enorme partitions rodada 1 rodada 2 rodada 3 rodada N …
  43. 43. 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 …
  44. 44. aplicação infraestrutura bancodedados atualizaçãoderodada comosuportamostodoestevolume?
  45. 45. 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
  46. 46. 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
  47. 47. 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
  48. 48. 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
  49. 49. Perguntas? https://github.com/globocom/IWantToWorkAtGloboCom

×