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

Como processar 10 milhões de registros por hora...

Como processar 10 milhões de registros por hora com Ruby

Ruby é uma das últimas escolhas pra quem precisa construir aplicações de alta performance. Afinal, a gente sempre ouve falar que a linguagem é lenta e não escala, certo? Bam! Nesta palestra vamos mostrar que isso não é verdade contando o caso da E.Life, que processa mais de 450 GB de dados por dia usando Ruby em uma estrutura super enxuta de servidores. Sim, é possível construir um sistema de alta performance com Ruby que consome poucos recursos.

Lailson Bandeira

May 18, 2016
Tweet

More Decks by Lailson Bandeira

Other Decks in Technology

Transcript

  1. LAILSON BANDEIRA • Fundador do Frevo on Rails • Co-organizador

    do Tropical Ruby • B.Sc. e M.Sc. em Ciência da Computação pelo CIn/UFPE • Programador com mais de 10 anos de experiência
  2. MINIMUM VIABLE PRODUCT requisitos 1 Cadastro de marcas com #hashtags

    e @profiles. 2 Coleta dos posts que contêm as #hashtags e postados pelos @profiles. 3 Filtragem e exportação via XLS para importação no Buzzmonitor.
  3. MINIMUM VIABLE PRODUCT exemplo CONTA Coca-cola MARCA Coca-cola #cocacola #shareacoke

    @cocacola MARCA Fanta #fanta @fanta MARCA Pepsi #pepsi #pepsicolasign @pepsi
  4. MINIMUM VIABLE PRODUCT desafios Não basta coletar os posts uma

    só vez 1 Como lidar com os limites da API do Instagram? 2 SOLUÇÃO Coletar e atualizar posts dos últimos 15 dias. SOLUÇÃO Criar pool de tokens.
  5. MINIMUM VIABLE PRODUCT perguntas Por que guardar uma cópia no

    Postgres? 1 2 Por que não fazer a busca no Postgres?
  6. MINIMUM VIABLE PRODUCT perguntas Por que guardar uma cópia no

    Postgres? 1 2 Por que não fazer a busca no Postgres?
  7. MINIMUM VIABLE PRODUCT class Post < Sequel::Model one_to_many :hashtag dataset_module

    do def with_remote_id(rid) first(remote_id: rid) end end end Post.create(remote_id: ‘123_45678',...)
  8. MINIMUM VIABLE PRODUCT DB[:posts].insert( remote_id: '123_45678', content: 'My new #shoes

    #beautiful, #stylish', hashtags: ['shoes', 'beautiful', ‘stylish’], remote_created_at: '2016-05-18 17:58:23', ... )
  9. MINIMUM VIABLE PRODUCT class PostRepository def insert(post) table_name = table_name_for(post)

    DB[table_name].insert(post) end ... end PostRepository.new.insert(remote_id: '123_45678')
  10. SERVICE-ORIENTED ARCHITECTURE novo requisito TRADUZINDO… API Criar API para gerenciamento

    de marcas. BUZZMONITOR Enviar os posts coletados para o Buzzmonitor.
  11. SERVICE-ORIENTED ARCHITECTURE class FetchPosts include Sidekiq::Worker def perform(name, count) posts

    = crawl_posts index_in_elasticsearch(posts) store_in_database(posts) send_to_buzzmonitor(posts) end end
  12. SERVICE-ORIENTED ARCHITECTURE class FetchPosts include Sidekiq::Worker def perform(name, count) posts

    = crawl_posts index_in_elasticsearch(posts) store_in_database(posts) send_to_buzzmonitor(posts) end end
  13. SERVICE-ORIENTED ARCHITECTURE crawler rabbitMQ INSTAGRAM SIDEKIQ indexer ELASTIC SEARCH REDIS

    POSTGRES SNEAKERS storage SNEAKERS MONGODB buzzmonitor SNEAKERS API RAILS RAILS
  14. SERVICE-ORIENTED ARCHITECTURE crawler rabbitMQ INSTAGRAM SIDEKIQ indexer ELASTIC SEARCH REDIS

    POSTGRES SNEAKERS storage SNEAKERS MONGODB buzzmonitor SNEAKERS API RAILS RAILS analytics RAKE
  15. SERVICE-ORIENTED ARCHITECTURE stats de jobs processados no Sidekiq por dia

    3,9M de mensagens processadas no RabbitMQ por dia 19,2M de registros processados por dia 240M de dados trafegando no RabbitMQ por dia 456GB 98GB quando compactado
  16. SERVICE-ORIENTED ARCHITECTURE stats custo total por mês US$ 2,246 HEROKU

    com servidores US$ 775 projetos 8 dynos 31 SERVIÇOS US$ 714 Elastic Cloud US$ 380 MongoDB US$ 299 CloudAMQP US$ 50 PostgreSQL US$ 28 openredis
  17. LIÇÕES APRENDIDAS muitas certezas não são verdadeiras "Ruby não é

    adequado para este projeto." "Heroku não é a melhor plataforma."
  18. Apresentação realizada em 18/05/2016 como parte do Encontro de Maio/2016

    do Frevo on Rails, disponível em https://speakerdeck.com/lailsonbm/como- processar-10-milhoes-de-registros-por-hora-com-ruby. Slides criados no Keynote com as fontes Galano Grotesque, Bernini Sans e Input. Creative Commons Attribution 4.0 International License. ENCONTRO DE MAIO/2016 DO FREVO ON RAILS LAILSON BANDEIRA https://github.com/lailsonbm https://twitter.com/lailsonbm https://speakerdeck.com/lailsonbm como processar 10 milhões de registros por hora com ruby — ou sim, ruby escala