Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

(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!

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