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

RubyConf BR 2021 - Uma talk eventualmente consi...

RubyConf BR 2021 - Uma talk eventualmente consistente

"Eventualmente consistente" é a expressão que usamos para informações que não são atualizadas em tempo real mas que, eventualmente, se tornam consistentes. Essa estratégia de delaying pode ser vital para um sistema, como foi no nosso caso, em que reduzimos o tempo para recalcular relatórios de envio por hora de 4 horas em média para apenas 5 minutos. Esta talk traz um compilado de aprendizados sobre o uso consciente dos recursos disponíveis, tomando por base um ambiente altamente concorrente com processamento diário de mais de 10M de eventos.

More Decks by Gabriel Leopoldo Ferreira

Other Decks in Technology

Transcript

  1. ANTES +4 h de delay para atualizar relatórios 1.5 M

    de eventos travados NA FILA 1000 queries por segundo 47% IOwait no main DB
  2. 5 min de delay para atualizar relatórios 10 M de

    eventos processados por dia (sem fila) 2000 queries por segundo 8% IOwait no Main DB DEPois
  3. a) Enfileirar outro job b) Nada… jobs foram feitos pra

    demorar c) Comprar mais hardware! d) Correr em círculos e) Dar git blame
  4. - throughput (requests / s) - response time de uma

    rota / job - consumo de memória - consumo de CPU - tempo gasto em requests
  5. - redis local / redis externo - mass inserts /

    vários inserts - sobrecarga na leitura ou na escrita
  6. escritas Leituras vs 1. inserts simples 2. Inserts em várias

    tabelas 3. dados pré-computados 4. views, triggers e procedures 1. Leitura simples 2. Joins de tabelas 3. dados computados no momento da leitura 4. Cruzar dados em memória (na app)
  7. Wikipedia (Rentrancy computing) “[...] a reentrant procedure can be interrupted

    in the middle of its execution and then safely be called again (“reentered”) before it’s previous invocations complete execution [...]”
  8. “Idempotence is the property of certain operations [...] whereby they

    can be applied multiple times without changing the result beyond the initial application” Wikipedia (Indempotence)
  9. Prós: - Maior controle sobre a ordem de execução; -

    Paradigma request/response; - Mais intuitiva (da perspectiva do código) - Regra de negócio centralizada; Contras: - Maior acoplamento entre jobs / serviços; - Menos independência dos serviços;
  10. Prós: - Serviços e jobs mais independentes; - Controle distribuído

    / maior resiliência; - Paradigma ES + CQRS; Contras: - Menos intuitiva; - Sem controle sobre a ordem de execução; - Regras de negócio espalhadas;
  11. 20 THREADS PER VM 4 VIRTUAL MACHINES TONS OF UPDATES

    ON THE SAME RECORD IN THE DATABASE ASYNC JOBS DOING A SINGLE UPDATE EACH LOCKS CAUSES A CHAOS IN THE DATABASE OTHER APPS CRASH SINCE CAN’T ACQUIRE LOCKS THE DATABASE STOPS RESPONDING
  12. 3 THREADS PER VM 4 VIRTUAL MACHINES UPDATES STILL OCCUR,

    BUT NOW IN LESS SCALE OTHER APPS STILL WORKING THE DEFINITIVE FIX GOES TO THE BACKLOG UPDATE PERFORMANCE COULD BE BETTER, BUT IT FITS OUR PURPOSES NOW A DOCUMENTATION ABOUT THE BUG, AND SOLUTION PROPOSALS ASYNC JOBS DOING A SINGLE UPDATE EACH