SlideShare uma empresa Scribd logo
comoéanovaarquiteturadogamefeitapara
suportamosumvolumeaindamaiordeacessos
Alexandre Saboia Fuziyama
Bacharel em Informática pela PUC-Rio
11 anos na globo.com
Full Stack Web Developer
9 anos trabalhando em equipes ágeis
@alexandresaboia saboia@corp.globo.com
aumentara
atratividade
brasileirão
multidevice
multidevice
uper
cartola-api
VOLUME
alguns números desta
temporada
335milcartoleiros pro
Cartoleiro
10milhõescartoleiros
5.8milhõestimes escalados na rodada 17 de 2017
+610milhõesescalações únicas na temporada 2017
+900milusuários simultâneos no ga*
~100milrequests por segundo na api
* google analytics
+3.5bilhõesde aberturas únicas de apps na temporada
+8milhõesapps ativas no mês de junho
+17milhõesde downloads das apps
ARQUITETURA
nas internas, como o
cartolafc funciona?
2010-2015
ARQUITETURA E TECNOLOGIA EM
atualização
game
admin
api
arquiteturacentradanogame
apps
BD
2010-2015
game
api atu admin
2016-2017
ARQUITETURA E TECNOLOGIA EM
atualização
game
admin
arquiteturacentradanogame
apps
BD
2010-2015
api
arquiteturacentradanaAPI
atualização
admin
api
BDv2
2
2016-2017
game
apps
golang
game
api
infra
banco de dados
backend
frontend
infra
banco de dados
backend
frontend
Stackresumida
I N F R A EST R U T U R A
RPAAS Galeb Tsuru
Cartola
Comoé
UsuárioCartoleiro
Stackresumida
I N F R A EST R U T U R A
tsuru
PaaS-PlataformasaService
OrquestraçãodecontainersDocker
Rápido,FácileContinuousDeployment
Facilitaamanutençãoeconfiguraçãodainfraestrutura
Escalável,ConfiáveleOpensource
Suportaváriaslinguagens
Aproximadodesenvolvedordainfraestrutura
maisdetalhesem:https://tsuru.io
Stackresumida
I N F R A EST R U T U R A
tsuru
Usuário
Cartoleiro
Galeb
RouterL7
Unit
Unit
Unit
VM
Unit
Unit
Unit
VM
Unit
Unit
Unit
Unit
VM
máquinafísica
RPAAS
Stackresumida
I N F R A EST R U T U R A
Comoé
RPAAS Galeb Tsuru
Cartola
UsuárioCartoleiro
Stackresumida
I N F R A EST R U T U R A
Comoé
RoutereLoadBalancerdinâmicodenível7
Altamenteescalável
Permitetrocasderotaseconfigsemrestartoureload
Opensource
Auxiliaotsururefazendorotasparaasnovasunit
maisdetalhesem:http://galeb.io
Galeb
Stackresumida
I N F R A EST R U T U R A
Unit
Galeb
Usuário
Cartoleiro
Unit
Unit
Unit
Unit
Unit
Unit
Galeb
RouterL7
Unit
Unit
Unit
VM
VM
VM
RPAAS
Stackresumida
I N F R A EST R U T U R A
Comoé
RPAAS Galeb Tsuru
Cartola
UsuárioCartoleiro
Stackresumida
I N F R A EST R U T U R A
RPaaS
RPaaS-ReverseProxyasaService
PlugindisponívelparaoTsuru
NGINXcomproxyreversoparaasuaaplicação
RespeitaosheadersdefinidosnaaplicaçãoRPAAS
Usuário RPAAS Galeb Tsuru
Cartoleiro
unit
Stack
I N F R A EST R U T U R A
Fluxodetalhadodeumarequisição
unit
unit
unit
unit
unit
unit
unit
BF BB
https
I N F R A EST R U T U R A
apartirde2016
FullTLS
100% dos acessos no CDA é feito via https
Monitoração
I N F R A EST R U T U R A
aplicadaemtodasascamadas
Monitoração
I N F R A EST R U T U R A
aplicadaemtodasascamadas
infra
banco de dados
backend
frontend
Bancodedados
I N F R A EST R U T U R A
mudançaparaoMySQL5.7
pré-processadordequeriesmaiseficiente:ganhamos
maiorvelocidadenaexecução
replicaçãopormulti-thread:reduçãonotempode
replicaçãoentreomastereosslaves.
Bancodedados
I N F R A EST R U T U R A
MySQL5.7
+820gb
dados + índices na 32ª rodada
Bancodedados
I N F R A EST R U T U R A
MySQL5.7-replicaçãomaster/slave
read.cartola.mysql.interno.com
write.cartola.mysql.interno.com
READ READREAD
VIP de leitura
READ WRITE
VIP de escrita
read.cartola.mysql.interno.com
write.cartola.mysql.interno.com
Bancodedados
I N F R A EST R U T U R A
MySQL5.7-partitioning
CREATE TABLE members (
firstname VARCHAR(25) NOT NULL,
lastname VARCHAR(25) NOT NULL,
username VARCHAR(16) NOT NULL,
email VARCHAR(35),
joined DATE NOT NULL
)
PARTITION BY RANGE( YEAR(joined) ) (
PARTITION p0 VALUES LESS THAN (1960),
PARTITION p1 VALUES LESS THAN (1970),
PARTITION p2 VALUES LESS THAN (1980),
PARTITION p3 VALUES LESS THAN (1990),
PARTITION p4 VALUES LESS THAN MAXVALUE
);
https://dev.mysql.com/doc/refman/5.7/en/partitioning-types.html
members
p0
p1
p4
p3
p2. . .
Bancodedados
I N F R A EST R U T U R A
MySQL5.7-cuidadocomocrescimentodatabela
ALTER TABLE time_atleta MODIFY time_atleta_id bigintunsigned
NOT NULL AUTO_INCREMENT;
CREATETABLE`time_atleta`(
`time_atleta_id`int(11)unsignedNOTNULLAUTO_INCREMENT,
`rodada_id`tinyint(3)unsignedNOTNULL,
…
);
15horas!
infra
banco de dados
backend
frontend
Backend
I N F R A EST R U T U R A
tecnologiasutilizadasnaapi
golang
Backend
I N F R A EST R U T U R A
tecnologiasutilizadasnaapi
golang
https://www.tiobe.com/tiobe-index/go/
September 2017
2015.1
Backend
I N F R A EST R U T U R A
mudançaparaogolang
resultadosiniciais:
python: 4.500r/s
golang:14.000r/s
observações:
• concorrência
• aproveitamentoderecursos
testesapi
pythonxgolang
*emumamesmamáquinafísicasemcacheestático
Backend
I N F R A EST R U T U R A
mudançaparaogolang
40%
deeconomiaemCPU
2015 -2016
Backend
I N F R A EST R U T U R A
mudançaparaogolang
2015 -2017
23%
deeconomiaemCPU
Backend
I N F R A EST R U T U R A
mudançaparaogolang
conexões: 2015=140k 2016=1.1M 2017=1.2M
160milreq/seg 100milreq/seg
8xmais
conexõessimultâneas
2015 -2017
Backend
I N F R A EST R U T U R A
mudançaparaogolang
9xmais
usuáriossimultâneos
noGA 2015=100k 2016=493k 2017=905k
2015 -2017
BACKEND
estratégias utilizadas
Backend
I N F R A EST R U T U R A
estratégiaparacacheamento
Usuário
Cartoleiro
RPAAS Tsuru
Cartola
cacheadonorpaasrespeitandoomax-age
...
READ
Backend
I N F R A EST R U T U R A
cacheamentocache-control-maxAge
func WriteCachedResponse(w http.ResponseWriter, data interface{}, statusCode int, maxAge string) {
w.Header().Set("Content-Type", "application/json;charset=UTF-8")
w.Header().Set("Vary", "Accept-Encoding")
w.Header().Set("Cache-Control", maxAge)
w.WriteHeader(statusCode)
json.NewEncoder(w).Encode(&data)
}
func WriteResponse(w http.ResponseWriter, data interface{}, statusCode int) {
w.Header().Set("Content-Type", "application/json;charset=UTF-8")
w.Header().Set("Vary", "Accept-Encoding")
w.WriteHeader(statusCode)
json.NewEncoder(w).Encode(&data)
}
Backend
I N F R A EST R U T U R A
estratégiaparacacheamento
Usuário
Cartoleiro
RPAAS Tsuru
Cartola
cacheadonomemcached
aplicação
...
READ
Backend
I N F R A EST R U T U R A
estratégiaparacacheamento
Usuário
Cartoleiro
RPAAS Tsuru
Cartola
requisiçãocompleta-recuperandodobancodedados
...
READ
Backend
I N F R A EST R U T U R A
estratégiaparacacheamento-fragmentaçãoporobjetoselistas
“time_id”: {[atleta_id,atleta_id,…]}
ex.: “1234” : {[1,2,3,4,5,6,7,8,9,10,11,12] }
"atleta_id": {“id”:1, “nome”:“RomáriodeSouzaFaria”,…}
“liga_id”: {[time_id,time_id,…]}
ex.: “5678” : {[11,22,33,44,55,66,77,88,99,110,111,112] }
"time_id": {“id”:11, “nome”:“PregerebaFC”,“slug”:“pregereba-fc”,…}
Backend
I N F R A EST R U T U R A
utilizaçãodeworkers
Recuperaçãodosatletasdomercado
Recuperaçãodosdadosdotime
http://divan.github.io/posts/go_concurrency_visualize/
fan-out pattern
Backend
I N F R A EST R U T U R A
utilizaçãodefilas
ManipulaçãodosSVGsdeescudosecamisas
Indexaçãodetimeseligasnabusca(ES)
Notificaçãopush
Backend
I N F R A EST R U T U R A
tempomáximoparauma conexão
10seg
éobastante!
normalmenteasrequisiçõesduramentre10mse100ms
Backend
I N F R A EST R U T U R A
estratégiaquerysnoMySQL
Queryssimplescompoucosjoins
Poucosupdates,prefiradelete+insert
Junteosdadosnaaplicação
Backend
I N F R A EST R U T U R A
gzipnaaplicação
n := negroni.New(negroni.NewRecovery(), gzip.Gzip(gzip.BestSpeed), Cors())
const (
NoCompression = flate.NoCompression
BestSpeed = flate.BestSpeed
BestCompression = flate.BestCompression
DefaultCompression = flate.DefaultCompression
HuffmanOnly = flate.HuffmanOnly
)
Backend
I N F R A EST R U T U R A
bibliotecasimportantes
GorillaMux
Testfy
jarcoal/httpmock.v1
logrus
guregu/null.v3
redis.v4
github.com/codegangsta/negroni
github.com/dropbox/godropbox/memcache
github.com/phyber/negroni-gzip/gzip
github.com/go-sql-driver/mysql
github.com/jmoiron/sqlx
infra
banco de dados
backend
frontend
Frontend
I N F R A EST R U T U R A
apostasemumSPA
• aplicaçãoestática
• reusodecomponentes
• comunicaçãocomocartolasomenteviaapi
• reduçãonaquantidadederequests
Frontend
I N F R A EST R U T U R A
porquêAngularJS?
• umframeworkmvccomtudoqueprecisaríamosparacriara
navegaçãodocartola
• implementaçãodefluxosmaisexplícito
• organizaçãodocódigo(lógicadenegócio,camadade
apresentação)
• facilidadenacomunicaçãoentrecomponentesnamesmapágina
Frontend
I N F R A EST R U T U R A
vantagensdoAngularJS?
problemasconhecidos
Frontend
I N F R A EST R U T U R A
outrasestratégias
• usodeSVGparaamaioriadasimagensdogameweb
• utilizaçãodespritessvg
Frontend
I N F R A EST R U T U R A
outrasestratégias
• minifyhtml
• minifycss
• otimizadorparaimagens
• svgsprite
tasksGulp
Frontend
I N F R A EST R U T U R A
CDN
NGINXdoRpaaSésuperperformáticoparaaentregadeestático
usamosumaappestáticanotsuruparafuncionarcomoumaCDN
Estratégiaparaversionamentodosdeploysevitandoocacheamento
nobrowserdousuário
https://cartolafc.globo.com/dist/1.1.7/js/main.js
https://cartolafc.globo.com/dist/1.1.7/css/cartola.css
https://cartolafc.globo.com/dist/1.1.7/img/logo_cartola.png
Takeaway
I N F R A EST R U T U R A
otimizaçãoeperformance
"Premature optimization is the root of all evil."
DonaldKnuth
perguntas?
temosvagas! talentos.globo.com

Mais conteúdo relacionado

Mais procurados

Noçoes de ventilação mecânica
Noçoes de ventilação mecânicaNoçoes de ventilação mecânica
Noçoes de ventilação mecânicahelciofonteles
 
Enfermagem de Reabilitação DPOC Protocolo
Enfermagem de Reabilitação DPOC ProtocoloEnfermagem de Reabilitação DPOC Protocolo
Enfermagem de Reabilitação DPOC ProtocoloBelmiro Rocha
 
Ecg normalidade e variação de normalidade
Ecg normalidade e variação de normalidadeEcg normalidade e variação de normalidade
Ecg normalidade e variação de normalidadecatarinarua
 
Sistema cardiovascular O conjunto dos sistemas vasculares
Sistema cardiovascular O conjunto dos sistemas vasculares Sistema cardiovascular O conjunto dos sistemas vasculares
Sistema cardiovascular O conjunto dos sistemas vasculares Tecoluca Luiz
 
Noções básicas de anatomia - Educação Física 9º Ano
Noções básicas de anatomia - Educação Física 9º AnoNoções básicas de anatomia - Educação Física 9º Ano
Noções básicas de anatomia - Educação Física 9º AnoHugo Victor
 
Capacidades fisicas: Agilidade
Capacidades fisicas: AgilidadeCapacidades fisicas: Agilidade
Capacidades fisicas: Agilidadeguest1c615a
 
Ventilação mecânica
Ventilação mecânicaVentilação mecânica
Ventilação mecânicaresenfe2013
 
Manejo da via aerea - Fisioterapeuta
Manejo da via aerea - FisioterapeutaManejo da via aerea - Fisioterapeuta
Manejo da via aerea - FisioterapeutaJanderson Physios
 
Suporte avançado de vida em cardiologia em adultos
Suporte avançado de vida em cardiologia em adultosSuporte avançado de vida em cardiologia em adultos
Suporte avançado de vida em cardiologia em adultosAroldo Gavioli
 
Aula 01 introdução a anatomia - posição, planos, cortes e divisões do corpo...
Aula 01   introdução a anatomia - posição, planos, cortes e divisões do corpo...Aula 01   introdução a anatomia - posição, planos, cortes e divisões do corpo...
Aula 01 introdução a anatomia - posição, planos, cortes e divisões do corpo...Hamilton Nobrega
 
Sistema Esquelético.
Sistema Esquelético.Sistema Esquelético.
Sistema Esquelético.Zeca Ribeiro
 
Padrões de aptidão do enfermeiro forense
Padrões de aptidão do enfermeiro forensePadrões de aptidão do enfermeiro forense
Padrões de aptidão do enfermeiro forenseAlbino Gomes
 
Treinamento personalizado e composição corporal
Treinamento personalizado e composição corporalTreinamento personalizado e composição corporal
Treinamento personalizado e composição corporalwashington carlos vieira
 

Mais procurados (20)

Noçoes de ventilação mecânica
Noçoes de ventilação mecânicaNoçoes de ventilação mecânica
Noçoes de ventilação mecânica
 
Enfermagem de Reabilitação DPOC Protocolo
Enfermagem de Reabilitação DPOC ProtocoloEnfermagem de Reabilitação DPOC Protocolo
Enfermagem de Reabilitação DPOC Protocolo
 
Ecg normalidade e variação de normalidade
Ecg normalidade e variação de normalidadeEcg normalidade e variação de normalidade
Ecg normalidade e variação de normalidade
 
Sistema cardiovascular O conjunto dos sistemas vasculares
Sistema cardiovascular O conjunto dos sistemas vasculares Sistema cardiovascular O conjunto dos sistemas vasculares
Sistema cardiovascular O conjunto dos sistemas vasculares
 
Programando com Python
Programando com PythonProgramando com Python
Programando com Python
 
Noções básicas de anatomia - Educação Física 9º Ano
Noções básicas de anatomia - Educação Física 9º AnoNoções básicas de anatomia - Educação Física 9º Ano
Noções básicas de anatomia - Educação Física 9º Ano
 
Sara
SaraSara
Sara
 
Capacidades fisicas: Agilidade
Capacidades fisicas: AgilidadeCapacidades fisicas: Agilidade
Capacidades fisicas: Agilidade
 
Hemorragias
HemorragiasHemorragias
Hemorragias
 
Ventilação mecânica
Ventilação mecânicaVentilação mecânica
Ventilação mecânica
 
Anatomia fisiologia humana
Anatomia fisiologia humanaAnatomia fisiologia humana
Anatomia fisiologia humana
 
Afogamento 1
Afogamento 1Afogamento 1
Afogamento 1
 
Manejo da via aerea - Fisioterapeuta
Manejo da via aerea - FisioterapeutaManejo da via aerea - Fisioterapeuta
Manejo da via aerea - Fisioterapeuta
 
Suporte avançado de vida em cardiologia em adultos
Suporte avançado de vida em cardiologia em adultosSuporte avançado de vida em cardiologia em adultos
Suporte avançado de vida em cardiologia em adultos
 
Aula 01 introdução a anatomia - posição, planos, cortes e divisões do corpo...
Aula 01   introdução a anatomia - posição, planos, cortes e divisões do corpo...Aula 01   introdução a anatomia - posição, planos, cortes e divisões do corpo...
Aula 01 introdução a anatomia - posição, planos, cortes e divisões do corpo...
 
Sistema Esquelético.
Sistema Esquelético.Sistema Esquelético.
Sistema Esquelético.
 
Padrões de aptidão do enfermeiro forense
Padrões de aptidão do enfermeiro forensePadrões de aptidão do enfermeiro forense
Padrões de aptidão do enfermeiro forense
 
Treinamento personalizado e composição corporal
Treinamento personalizado e composição corporalTreinamento personalizado e composição corporal
Treinamento personalizado e composição corporal
 
Ventilação Mecânica Básica
Ventilação Mecânica Básica Ventilação Mecânica Básica
Ventilação Mecânica Básica
 
Desmame ventilatório
Desmame ventilatórioDesmame ventilatório
Desmame ventilatório
 

Semelhante a Nas internas do CartolaFC: como é a nova arquitetura do game feita para suportamos um volume ainda maior de acessos - GopherConBR

Nas internas do CartolaFC: como é a nova arquitetura do game feita para supor...
Nas internas do CartolaFC: como é a nova arquitetura do game feita para supor...Nas internas do CartolaFC: como é a nova arquitetura do game feita para supor...
Nas internas do CartolaFC: como é a nova arquitetura do game feita para supor...Alexandre Saboia Fuziyama
 
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...tdc-globalcode
 
Você não deveria escrever uma API para isso
Você não deveria escrever uma API para issoVocê não deveria escrever uma API para isso
Você não deveria escrever uma API para issoJunior Conte
 
Construindo sua primeira ontologia
Construindo sua primeira ontologiaConstruindo sua primeira ontologia
Construindo sua primeira ontologiaRômulo Jales
 
Construa painéis administrativos em Adobe Flex integrados com ASP.NET MVC
Construa painéis administrativos em Adobe Flex  integrados com ASP.NET MVCConstrua painéis administrativos em Adobe Flex  integrados com ASP.NET MVC
Construa painéis administrativos em Adobe Flex integrados com ASP.NET MVCIgor Musardo
 
Aplicações com Tecnologias Web
Aplicações com Tecnologias WebAplicações com Tecnologias Web
Aplicações com Tecnologias WebRildo Pragana
 
Construindo URA e Sistemas de Call Center com Asterisk
Construindo URA e Sistemas de Call Center com AsteriskConstruindo URA e Sistemas de Call Center com Asterisk
Construindo URA e Sistemas de Call Center com AsteriskRodrigo R Passos
 
Construindo URA e Sistemas de Call Center com Asterisk
Construindo URA e Sistemas de Call Center com AsteriskConstruindo URA e Sistemas de Call Center com Asterisk
Construindo URA e Sistemas de Call Center com AsteriskRodrigo R Passos
 
TDC2018FLN | Trilha Arquitetura - Architecting for Resilience
TDC2018FLN | Trilha Arquitetura - Architecting for ResilienceTDC2018FLN | Trilha Arquitetura - Architecting for Resilience
TDC2018FLN | Trilha Arquitetura - Architecting for Resiliencetdc-globalcode
 
Architecting For Resilience
Architecting For ResilienceArchitecting For Resilience
Architecting For ResilienceFabiano Modos
 
Campus Party 2015: Os 10 Atributos de uma API de Sucesso
Campus Party 2015: Os 10 Atributos de uma API de SucessoCampus Party 2015: Os 10 Atributos de uma API de Sucesso
Campus Party 2015: Os 10 Atributos de uma API de SucessoKleber Bacili
 
PyData - Consumindo e publicando web APIs com Python
PyData - Consumindo e publicando web APIs com PythonPyData - Consumindo e publicando web APIs com Python
PyData - Consumindo e publicando web APIs com PythonBruno Rocha
 
Django + extjs pelos forms
Django + extjs pelos formsDjango + extjs pelos forms
Django + extjs pelos formsMoacir Filho
 
Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Christiano Anderson
 
Fsi8a Sistemas Internet
Fsi8a Sistemas InternetFsi8a Sistemas Internet
Fsi8a Sistemas InternetLuiz Domingues
 
Intervalo Técnico - QG Mobile
Intervalo Técnico - QG MobileIntervalo Técnico - QG Mobile
Intervalo Técnico - QG MobileVitor Albuquerque
 

Semelhante a Nas internas do CartolaFC: como é a nova arquitetura do game feita para suportamos um volume ainda maior de acessos - GopherConBR (20)

Nas internas do CartolaFC: como é a nova arquitetura do game feita para supor...
Nas internas do CartolaFC: como é a nova arquitetura do game feita para supor...Nas internas do CartolaFC: como é a nova arquitetura do game feita para supor...
Nas internas do CartolaFC: como é a nova arquitetura do game feita para supor...
 
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
 
Você não deveria escrever uma API para isso
Você não deveria escrever uma API para issoVocê não deveria escrever uma API para isso
Você não deveria escrever uma API para isso
 
Construindo sua primeira ontologia
Construindo sua primeira ontologiaConstruindo sua primeira ontologia
Construindo sua primeira ontologia
 
MongoDB + PHP
MongoDB + PHPMongoDB + PHP
MongoDB + PHP
 
Construa painéis administrativos em Adobe Flex integrados com ASP.NET MVC
Construa painéis administrativos em Adobe Flex  integrados com ASP.NET MVCConstrua painéis administrativos em Adobe Flex  integrados com ASP.NET MVC
Construa painéis administrativos em Adobe Flex integrados com ASP.NET MVC
 
Aplicações com Tecnologias Web
Aplicações com Tecnologias WebAplicações com Tecnologias Web
Aplicações com Tecnologias Web
 
Relatório
RelatórioRelatório
Relatório
 
Meetup MUG-RS KingHost
Meetup MUG-RS KingHostMeetup MUG-RS KingHost
Meetup MUG-RS KingHost
 
Construindo URA e Sistemas de Call Center com Asterisk
Construindo URA e Sistemas de Call Center com AsteriskConstruindo URA e Sistemas de Call Center com Asterisk
Construindo URA e Sistemas de Call Center com Asterisk
 
Construindo URA e Sistemas de Call Center com Asterisk
Construindo URA e Sistemas de Call Center com AsteriskConstruindo URA e Sistemas de Call Center com Asterisk
Construindo URA e Sistemas de Call Center com Asterisk
 
TDC2018FLN | Trilha Arquitetura - Architecting for Resilience
TDC2018FLN | Trilha Arquitetura - Architecting for ResilienceTDC2018FLN | Trilha Arquitetura - Architecting for Resilience
TDC2018FLN | Trilha Arquitetura - Architecting for Resilience
 
Architecting For Resilience
Architecting For ResilienceArchitecting For Resilience
Architecting For Resilience
 
Python e MongoDB - Ensol
Python e MongoDB - EnsolPython e MongoDB - Ensol
Python e MongoDB - Ensol
 
Campus Party 2015: Os 10 Atributos de uma API de Sucesso
Campus Party 2015: Os 10 Atributos de uma API de SucessoCampus Party 2015: Os 10 Atributos de uma API de Sucesso
Campus Party 2015: Os 10 Atributos de uma API de Sucesso
 
PyData - Consumindo e publicando web APIs com Python
PyData - Consumindo e publicando web APIs com PythonPyData - Consumindo e publicando web APIs com Python
PyData - Consumindo e publicando web APIs com Python
 
Django + extjs pelos forms
Django + extjs pelos formsDjango + extjs pelos forms
Django + extjs pelos forms
 
Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7
 
Fsi8a Sistemas Internet
Fsi8a Sistemas InternetFsi8a Sistemas Internet
Fsi8a Sistemas Internet
 
Intervalo Técnico - QG Mobile
Intervalo Técnico - QG MobileIntervalo Técnico - QG Mobile
Intervalo Técnico - QG Mobile
 

Nas internas do CartolaFC: como é a nova arquitetura do game feita para suportamos um volume ainda maior de acessos - GopherConBR

  • 2. Alexandre Saboia Fuziyama Bacharel em Informática pela PUC-Rio 11 anos na globo.com Full Stack Web Developer 9 anos trabalhando em equipes ágeis @alexandresaboia saboia@corp.globo.com
  • 9. +610milhõesescalações únicas na temporada 2017 +900milusuários simultâneos no ga* ~100milrequests por segundo na api * google analytics
  • 10. +3.5bilhõesde aberturas únicas de apps na temporada +8milhõesapps ativas no mês de junho +17milhõesde downloads das apps
  • 11. ARQUITETURA nas internas, como o cartolafc funciona?
  • 21. Stackresumida I N F R A EST R U T U R A RPAAS Galeb Tsuru Cartola Comoé UsuárioCartoleiro
  • 22. Stackresumida I N F R A EST R U T U R A tsuru PaaS-PlataformasaService OrquestraçãodecontainersDocker Rápido,FácileContinuousDeployment Facilitaamanutençãoeconfiguraçãodainfraestrutura Escalável,ConfiáveleOpensource Suportaváriaslinguagens Aproximadodesenvolvedordainfraestrutura maisdetalhesem:https://tsuru.io
  • 23. Stackresumida I N F R A EST R U T U R A tsuru Usuário Cartoleiro Galeb RouterL7 Unit Unit Unit VM Unit Unit Unit VM Unit Unit Unit Unit VM máquinafísica RPAAS
  • 24. Stackresumida I N F R A EST R U T U R A Comoé RPAAS Galeb Tsuru Cartola UsuárioCartoleiro
  • 25. Stackresumida I N F R A EST R U T U R A Comoé RoutereLoadBalancerdinâmicodenível7 Altamenteescalável Permitetrocasderotaseconfigsemrestartoureload Opensource Auxiliaotsururefazendorotasparaasnovasunit maisdetalhesem:http://galeb.io Galeb
  • 26. Stackresumida I N F R A EST R U T U R A Unit Galeb Usuário Cartoleiro Unit Unit Unit Unit Unit Unit Galeb RouterL7 Unit Unit Unit VM VM VM RPAAS
  • 27. Stackresumida I N F R A EST R U T U R A Comoé RPAAS Galeb Tsuru Cartola UsuárioCartoleiro
  • 28. Stackresumida I N F R A EST R U T U R A RPaaS RPaaS-ReverseProxyasaService PlugindisponívelparaoTsuru NGINXcomproxyreversoparaasuaaplicação RespeitaosheadersdefinidosnaaplicaçãoRPAAS
  • 29. Usuário RPAAS Galeb Tsuru Cartoleiro unit Stack I N F R A EST R U T U R A Fluxodetalhadodeumarequisição unit unit unit unit unit unit unit BF BB
  • 30. https I N F R A EST R U T U R A apartirde2016 FullTLS 100% dos acessos no CDA é feito via https
  • 31. Monitoração I N F R A EST R U T U R A aplicadaemtodasascamadas
  • 32. Monitoração I N F R A EST R U T U R A aplicadaemtodasascamadas
  • 34. Bancodedados I N F R A EST R U T U R A mudançaparaoMySQL5.7 pré-processadordequeriesmaiseficiente:ganhamos maiorvelocidadenaexecução replicaçãopormulti-thread:reduçãonotempode replicaçãoentreomastereosslaves.
  • 35. Bancodedados I N F R A EST R U T U R A MySQL5.7 +820gb dados + índices na 32ª rodada
  • 36. Bancodedados I N F R A EST R U T U R A MySQL5.7-replicaçãomaster/slave read.cartola.mysql.interno.com write.cartola.mysql.interno.com READ READREAD VIP de leitura READ WRITE VIP de escrita read.cartola.mysql.interno.com write.cartola.mysql.interno.com
  • 37. Bancodedados I N F R A EST R U T U R A MySQL5.7-partitioning CREATE TABLE members ( firstname VARCHAR(25) NOT NULL, lastname VARCHAR(25) NOT NULL, username VARCHAR(16) NOT NULL, email VARCHAR(35), joined DATE NOT NULL ) PARTITION BY RANGE( YEAR(joined) ) ( PARTITION p0 VALUES LESS THAN (1960), PARTITION p1 VALUES LESS THAN (1970), PARTITION p2 VALUES LESS THAN (1980), PARTITION p3 VALUES LESS THAN (1990), PARTITION p4 VALUES LESS THAN MAXVALUE ); https://dev.mysql.com/doc/refman/5.7/en/partitioning-types.html members p0 p1 p4 p3 p2. . .
  • 38. Bancodedados I N F R A EST R U T U R A MySQL5.7-cuidadocomocrescimentodatabela ALTER TABLE time_atleta MODIFY time_atleta_id bigintunsigned NOT NULL AUTO_INCREMENT; CREATETABLE`time_atleta`( `time_atleta_id`int(11)unsignedNOTNULLAUTO_INCREMENT, `rodada_id`tinyint(3)unsignedNOTNULL, … ); 15horas!
  • 40. Backend I N F R A EST R U T U R A tecnologiasutilizadasnaapi golang
  • 41. Backend I N F R A EST R U T U R A tecnologiasutilizadasnaapi golang https://www.tiobe.com/tiobe-index/go/ September 2017 2015.1
  • 42. Backend I N F R A EST R U T U R A mudançaparaogolang resultadosiniciais: python: 4.500r/s golang:14.000r/s observações: • concorrência • aproveitamentoderecursos testesapi pythonxgolang *emumamesmamáquinafísicasemcacheestático
  • 43. Backend I N F R A EST R U T U R A mudançaparaogolang 40% deeconomiaemCPU 2015 -2016
  • 44. Backend I N F R A EST R U T U R A mudançaparaogolang 2015 -2017 23% deeconomiaemCPU
  • 45. Backend I N F R A EST R U T U R A mudançaparaogolang conexões: 2015=140k 2016=1.1M 2017=1.2M 160milreq/seg 100milreq/seg 8xmais conexõessimultâneas 2015 -2017
  • 46. Backend I N F R A EST R U T U R A mudançaparaogolang 9xmais usuáriossimultâneos noGA 2015=100k 2016=493k 2017=905k 2015 -2017
  • 48. Backend I N F R A EST R U T U R A estratégiaparacacheamento Usuário Cartoleiro RPAAS Tsuru Cartola cacheadonorpaasrespeitandoomax-age ... READ
  • 49. Backend I N F R A EST R U T U R A cacheamentocache-control-maxAge func WriteCachedResponse(w http.ResponseWriter, data interface{}, statusCode int, maxAge string) { w.Header().Set("Content-Type", "application/json;charset=UTF-8") w.Header().Set("Vary", "Accept-Encoding") w.Header().Set("Cache-Control", maxAge) w.WriteHeader(statusCode) json.NewEncoder(w).Encode(&data) } func WriteResponse(w http.ResponseWriter, data interface{}, statusCode int) { w.Header().Set("Content-Type", "application/json;charset=UTF-8") w.Header().Set("Vary", "Accept-Encoding") w.WriteHeader(statusCode) json.NewEncoder(w).Encode(&data) }
  • 50. Backend I N F R A EST R U T U R A estratégiaparacacheamento Usuário Cartoleiro RPAAS Tsuru Cartola cacheadonomemcached aplicação ... READ
  • 51. Backend I N F R A EST R U T U R A estratégiaparacacheamento Usuário Cartoleiro RPAAS Tsuru Cartola requisiçãocompleta-recuperandodobancodedados ... READ
  • 52. Backend I N F R A EST R U T U R A estratégiaparacacheamento-fragmentaçãoporobjetoselistas “time_id”: {[atleta_id,atleta_id,…]} ex.: “1234” : {[1,2,3,4,5,6,7,8,9,10,11,12] } "atleta_id": {“id”:1, “nome”:“RomáriodeSouzaFaria”,…} “liga_id”: {[time_id,time_id,…]} ex.: “5678” : {[11,22,33,44,55,66,77,88,99,110,111,112] } "time_id": {“id”:11, “nome”:“PregerebaFC”,“slug”:“pregereba-fc”,…}
  • 53. Backend I N F R A EST R U T U R A utilizaçãodeworkers Recuperaçãodosatletasdomercado Recuperaçãodosdadosdotime http://divan.github.io/posts/go_concurrency_visualize/ fan-out pattern
  • 54. Backend I N F R A EST R U T U R A utilizaçãodefilas ManipulaçãodosSVGsdeescudosecamisas Indexaçãodetimeseligasnabusca(ES) Notificaçãopush
  • 55. Backend I N F R A EST R U T U R A tempomáximoparauma conexão 10seg éobastante! normalmenteasrequisiçõesduramentre10mse100ms
  • 56. Backend I N F R A EST R U T U R A estratégiaquerysnoMySQL Queryssimplescompoucosjoins Poucosupdates,prefiradelete+insert Junteosdadosnaaplicação
  • 57. Backend I N F R A EST R U T U R A gzipnaaplicação n := negroni.New(negroni.NewRecovery(), gzip.Gzip(gzip.BestSpeed), Cors()) const ( NoCompression = flate.NoCompression BestSpeed = flate.BestSpeed BestCompression = flate.BestCompression DefaultCompression = flate.DefaultCompression HuffmanOnly = flate.HuffmanOnly )
  • 58. Backend I N F R A EST R U T U R A bibliotecasimportantes GorillaMux Testfy jarcoal/httpmock.v1 logrus guregu/null.v3 redis.v4 github.com/codegangsta/negroni github.com/dropbox/godropbox/memcache github.com/phyber/negroni-gzip/gzip github.com/go-sql-driver/mysql github.com/jmoiron/sqlx
  • 60. Frontend I N F R A EST R U T U R A apostasemumSPA • aplicaçãoestática • reusodecomponentes • comunicaçãocomocartolasomenteviaapi • reduçãonaquantidadederequests
  • 61. Frontend I N F R A EST R U T U R A porquêAngularJS? • umframeworkmvccomtudoqueprecisaríamosparacriara navegaçãodocartola • implementaçãodefluxosmaisexplícito • organizaçãodocódigo(lógicadenegócio,camadade apresentação) • facilidadenacomunicaçãoentrecomponentesnamesmapágina
  • 62. Frontend I N F R A EST R U T U R A vantagensdoAngularJS? problemasconhecidos
  • 63. Frontend I N F R A EST R U T U R A outrasestratégias • usodeSVGparaamaioriadasimagensdogameweb • utilizaçãodespritessvg
  • 64. Frontend I N F R A EST R U T U R A outrasestratégias • minifyhtml • minifycss • otimizadorparaimagens • svgsprite tasksGulp
  • 65. Frontend I N F R A EST R U T U R A CDN NGINXdoRpaaSésuperperformáticoparaaentregadeestático usamosumaappestáticanotsuruparafuncionarcomoumaCDN Estratégiaparaversionamentodosdeploysevitandoocacheamento nobrowserdousuário https://cartolafc.globo.com/dist/1.1.7/js/main.js https://cartolafc.globo.com/dist/1.1.7/css/cartola.css https://cartolafc.globo.com/dist/1.1.7/img/logo_cartola.png
  • 66. Takeaway I N F R A EST R U T U R A otimizaçãoeperformance "Premature optimization is the root of all evil." DonaldKnuth