Upgrade to Pro — share decks privately, control downloads, hide ads and more …

sde-api-rupy.pdf

 sde-api-rupy.pdf

Falo sobre a experiência de de construir uma API de dados esportivos que é usada pela Globo.com e parceiros, que responde hoje a 6000 req/s. O resultado do investimento na construção de uma nova API, problemas encontrados e soluções aplicadas usando as tecnologias como Python, Tornado, Redis, C e Nginx.

Rafael Martins

November 29, 2013
Tweet

More Decks by Rafael Martins

Other Decks in Programming

Transcript

  1. eu • Desenvolvedor apaixonado • Programador poliglota • Jogador de

    Magic e RPG • DJ nas horas vagas • Globo.com / esportes domingo, 1 de dezembro de 13
  2. api anterior • Velocidade -150 req/s • documentação ruim •

    serviços inconsistentes • base de código ruim domingo, 1 de dezembro de 13
  3. premissas • velocidade de resposta • ótima documentação • serviços

    consistentes • teste, teste e teste domingo, 1 de dezembro de 13
  4. model / repository jogo.equipe_mandante.nome X X X ids = [jogo.equipe_mandante_id,

    jogo.equipe_visitante_id] equipe_repository = EquipeRepository() equipes = equipe_repository.get_equipes(ids) domingo, 1 de dezembro de 13
  5. model / repository jogos = JogoRepository().get_jogos(edicao=”brasileirao2013”, pagina=1) equipes = set()

    for jogo in jogos: equipes.add(jogos.equipe_mandante.nome_popular) equipes.add(jogos.equipe_visitante.nome_popular) print equipes Modelo 1 domingo, 1 de dezembro de 13
  6. model / repository jogos = JogoRepository().get_jogos(edicao=”brasileirao2013”, pagina=1) equipes = set()

    for jogo in jogos: equipes.add(jogos.equipe_mandante.nome_popular) equipes.add(jogos.equipe_visitante.nome_popular) print equipes Modelo 1 20 jogos 40 hits no cache domingo, 1 de dezembro de 13
  7. model / repository jogos = JogoRepository().get_jogos(edicao=”brasileirao2013”, pagina=1) equipes_ids = set()

    for jogo in jogos: equipes.add(jogos.equipe_mandante_id) equipes.add(jogos.equipe_visitante_id) equipes = EquipeRepository().get_equipes(id=equipes_ids) [ print equipe.nome_popular for equipe in equipes ] Modelo 2 domingo, 1 de dezembro de 13
  8. model / repository jogos = JogoRepository().get_jogos(edicao=”brasileirao2013”, pagina=1) equipes_ids = set()

    for jogo in jogos: equipes.add(jogos.equipe_mandante_id) equipes.add(jogos.equipe_visitante_id) equipes = EquipeRepository().get_equipes(id=equipes_ids) [ print equipe.nome_popular for equipe in equipes ] Modelo 2 20 jogos 2 hits ao cache domingo, 1 de dezembro de 13
  9. expiração ativa SDE API /atletas/romario /equipes/flamengo/elenco Cache atletas savio, nelio,

    romario atleta nelio atleta savio atleta romario SDE Admin Banco de domingo, 1 de dezembro de 13
  10. expiração ativa SDE API /atletas/romario /equipes/flamengo/elenco Cache atletas savio, nelio,

    romario atleta nelio atleta savio atleta romario SDE Admin Banco de domingo, 1 de dezembro de 13
  11. expiração ativa SDE API /atletas/romario /equipes/flamengo/elenco Cache atletas savio, nelio,

    romario atleta nelio atleta savio atleta romario SDE Admin Banco de domingo, 1 de dezembro de 13
  12. expiração ativa SDE API /atletas/romario /equipes/flamengo/elenco Cache atletas savio, nelio,

    romario atleta nelio atleta savio atleta romario SDE Admin Banco de domingo, 1 de dezembro de 13
  13. Nginx - AAA web Autenticação Acesso Autorização Monitoração token: aaa

    Nginx- AAA Redis Com 1000 req simultâneas em 120ms domingo, 1 de dezembro de 13
  14. cache front-end Nginx - AAA Nginx - cache SDE API

    SDE API SDE API web domingo, 1 de dezembro de 13
  15. resultados • Serviços no Hack Day • Clientes com software

    em produção em 3 dias sem nenhum email. • Mais de 3 milhões de req/dia • Máquinas com load abaixo de 10% • Deploy constante domingo, 1 de dezembro de 13