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

(Tornado + MongoDB) + NginxPushStream = Newsfee...

(Tornado + MongoDB) + NginxPushStream = Newsfeed no CartolaFC

Uma palestra para mostrar como foi feito o Newsfeed do CartolaFC. Seus acertos, erros e dicas para seguir as dicas com sucesso!

Avatar for Alexandre Saboia Fuziyama

Alexandre Saboia Fuziyama

October 04, 2013
Tweet

More Decks by Alexandre Saboia Fuziyama

Other Decks in Technology

Transcript

  1. ‣ cartolafc e o newsfeed ‣ arquitetura da aplicação ‣

    a escolha do banco de dados ‣ problemas enfrentados ‣ testes de performance ‣ resultados newsfeed agenda Friday, October 4, 13
  2. ‣ uma das maiores aplicações dinâmicas da globo.com ‣ maior

    fantasy game da internet brasileira ‣ quase 90 milhões de pageviews em jun/11 ‣ +30k sessões simultâneas nos picos de acesso cartolafc algumas informações Friday, October 4, 13
  3. ‣ uma das maiores aplicações dinâmicas da globo.com ‣ maior

    fantasy game da internet brasileira ‣ quase 90 milhões de pageviews em jun/11 ‣ +30k sessões simultâneas nos picos de acesso cartolafc algumas informações Friday, October 4, 13
  4. 1 3 5 7 9 11 13 15 17 19

    21 23 25 27 29 31 33 35 37 550,000 700,000 850,000 1,000,000 1,150,000 1,300,000 +1.200.000 times salvos em uma única rodada mais de 2.000.000 de times 2010 2012 2011 Friday, October 4, 13
  5. Desenvolver uma aplicação de mural, que suporte o volume de

    acesso do cartolafc, com alta performance e disponibilidade. o desafio: Friday, October 4, 13
  6. ‣ a aplicação ser independente do jogo ‣ a perda

    de mensagens não é crítica ‣ indisponibilidade inicial é tolerável newsfeed algumas premissas Friday, October 4, 13
  7. ‣ a aplicação ser independente do jogo ‣ a perda

    de mensagens não é crítica ‣ indisponibilidade inicial é tolerável newsfeed algumas premissas ★ cenário perfeito para apostar em inovação Friday, October 4, 13
  8. newsfeed arquitetura - session Guardamos no memcached o id e

    as ligas do usuário Friday, October 4, 13
  9. newsfeed arquitetura - get messages Guardamos no memcached as 20

    últimas mensagens de cada liga Friday, October 4, 13
  10. newsfeed arquitetura - post Checa a permissão e invalida a

    listagem das mensagens para esta liga Friday, October 4, 13
  11. newsfeed a ideia de box PUSH STREAM beanstalkd 7 x

    DEAMON x 5 Friday, October 4, 13
  12. newsfeed a ideia de box . . . N PUSH

    STREAM beanstalkd 7 x DEAMON x 5 Friday, October 4, 13
  13. PUSH STREAM beanstalkd 7 x DEAMON x 5 newsfeed a

    ideia de box . . . PUSH STREAM beanstalkd 7 x DEAMON x 5 PUSH STREAM beanstalkd 7 x DEAMON x 5 PUSH STREAM beanstalkd 7 x DEAMON x 5 PUSH STREAM beanstalkd 7 x DEAMON x 5 Friday, October 4, 13
  14. newsfeed a escolha do banco ‣ velocidade ‣ não precisávamos

    de um SGBD completo ‣ sem schema ‣ failover automático ‣ possibilidade de escalar escrita com sharding Friday, October 4, 13
  15. ✓estrutura da coleção newsfeed problemas enfrentados itens revisados: • id

    (_id) • data (formato) • comentário (auto relacionamento) • mensagem (tamanho) Friday, October 4, 13
  16. x trabalhar com toda a massa de dados -100 milhões

    de mensagens newsfeed problemas enfrentados Friday, October 4, 13
  17. x trabalhar com toda a massa de dados -100 milhões

    de mensagens newsfeed problemas enfrentados ✓ trabalhar com um working set reduzido, minimizando impacto das consultas no banco; mensagens dos últimos 7 dias. Friday, October 4, 13
  18. x pymongo: biblioteca síncrona que executava apenas uma consulta ao

    mongo por instância de tornado newsfeed problemas enfrentados Friday, October 4, 13
  19. x pymongo: biblioteca síncrona que executava apenas uma consulta ao

    mongo por instância de tornado newsfeed problemas enfrentados ✓ asyncmongo: bliblioteca para acessar o mongo de forma assíncrona utilizando o tornado ioloop - dobramos a quantidade suportada no post - aumentamos em 40% a quantidade suportada no get das mensagens Friday, October 4, 13
  20. newsfeed implementação síncrona import tornado.web import tornado.ioloop class MainHandler(tornado.web.RequestHandler): def

    get(self): self.write("Hello, Tornado World!") application = tornado.web.Application([(r"/", MainHandler),]) if __name__ == "__main__": application.listen(8888) tornado.ioloop.IOLoop.instance().start() http://www.tornadoweb.org Friday, October 4, 13
  21. newsfeed implementação assíncrona import tornado.web import tornado.ioloop class AsyncHandler(tornado.web.RequestHandler): @tornado.web.asynchronous

    def get(self): http = tornado.httpclient.AsyncHTTPClient() http.fetch("http://z.com",callback=self.on_resp) def on_resp(self): self.write("Hello, Tornado World!") self.finish() http://www.tornadoweb.org Friday, October 4, 13
  22. newsfeed alternativa para driver assíncrono Motor: Asynchronous Python driver for

    Tornado and MongoDB http://motor.readthedocs.org Friday, October 4, 13
  23. newsfeed acertos ‣ criação de uma camada intermediária de cache

    entre a aplicação e o banco. ‣ utilização do módulo nginx push stream ‣ escolha do mongodb como database: simples, robusto e rápido Friday, October 4, 13
  24. newsfeed acertos ‣ nginx push stream: módulo para o nginx,

    super performático para troca de mensagens no estilo publisher/ subscriber. Suporta EventSource, WebSocket, Long Polling e o imortal Iframe. PUSH STREAM https://github.com/wandenberg/nginx-push-stream-module Friday, October 4, 13
  25. newsfeed testes de performance ‣ identificação de gargalos no acesso

    ao mongo ‣ grande importância na definição das libs utilizadas no projeto ‣ massa de dados: 1 coleção com 100 milhões de mensagens ‣ faça do ApacheBenchmark(ab) seu amigão! Friday, October 4, 13
  26. ‣ otimização de requests com streaming ‣ aumento do tempo

    online do usuário: - para mais de 20 minutos ‣ abrimos um canal de comunicação entre os cartoleiros de uma mesma liga ‣ ~3 milhões de mensagens no final da temporada newsfeed resultado Friday, October 4, 13