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

Escalando uma plataforma de email transacional- aprendizado das trincheiras

Escalando uma plataforma de email transacional- aprendizado das trincheiras

Apresentação feita na QCon SP em 2016

Celso Crivelaro

March 28, 2016
Tweet

More Decks by Celso Crivelaro

Other Decks in Technology

Transcript

  1. Escalando uma plataforma de e-mail transacional: aprendizado das trincheiras Celso

    Crivelaro (@celsocrivelaro) Fabio Perrella (@fabioperrella) SMTP Locaweb
  2. Fabio Perrella - Eng Computação - Dev Ruby, Php, Python,

    Javascript - Locaweb, time de Email - 1a geração do projeto do SMTP @fabioperrella http://fabioperrella.blogspot.com
  3. Celso Crivelaro - Engenheiro e Mestre em Engenharia de Computação

    - Dev Ruby / Python / Java - Dev do SMTP Locaweb há 1 ano e meio @celsocrivelaro http://crivelaro.me
  4. SMTP Locaweb - Produto - Plataforma para envio de e-mails

    transacionais - Envio de grandes quantidades com velocidade e qualidade - Relatórios “ao vivo” para acompanhar os envios - Envio por SMTP e API HTTP - Webhooks para devoluções de e-mails (bounces) - 2,5 milhões de e-mails por dia - Há + de 2 anos no ar
  5. O que é email transacional? - Disparos granulares - Notificação

    de eventos - Entrega rápida - Exemplos de uso: CRM, E-commerce, Billing, Websites
  6. Processamento Lento Processamento Rápido Arquitetura Autenticação Tratamento da Mensagem MTA

    Provedores Usuário Processamento da Mensagem Consolidação Painel
  7. SMTP Locaweb - Arquitetura distribuída - Painel e APIs ->

    Ruby on Rails - Workers -> Ruby - Postfix milters -> Python - DB -> Postgres - Caches e Filas -> Redis - MTA -> PowerMTA
  8. Desafios - Estabilidade - Escalabilidade - Performance - Relatórios em

    “tempo real” - Combater fraudes - Manter qualidade da entrega (https://returnpath. com/downloads/the-ultimate-guide-to-email-deliverability)
  9. Public Tabelas menores Tabelas em comum Migração default Privado (Conta)

    Tabelas maiores Dados de uma conta Migração ao criar conta Postgres Schemas
  10. Postgres Copy - Exportação de dados Problema: - Geração de

    arquivos > 100mil linhas - Código ruby iterando do DB e gerando CSV - Podia levar horas para finalizar geração de arquivo
  11. Gem “models” para compartilhar código - Modelos, Migrações, Códigos em

    comum extraídos para gem - Facilidade para usar Activerecord - Atenção na atualização de novas versões da gem - Dica: http://ryanbigg.com/2013/08/bundler-local-paths
  12. Problemas - Ambiente distribuído - Testes de integração eram essenciais!

    - Configuração do Postfix, Milters, Nginx não é trivial - Dev novo não conseguia levantar ambiente completo - Incompatibilidades Mac OS X / Linux - Versionamento de dependencias (ex: Redis)
  13. Archive de logs centralizado - Syslog ajuda! - Log rotate

    a cada 15min - Archive em storage organizado por servidor/data - Grep em multiplos servidores/datas - Cuidado: limite de caracteres syslog (aprox 1500 p/ mensagem)
  14. Caches e filas no Redis - Milters dependem de dados

    das contas (API) - Performance - TTL - Facilidade para debug / “queries” (comparando com memcache) $ redis-cli monitor | grep “qquer coisa” - Estruturas de dados: string, hashes, arrays, sets - Operações atômicas / garantia para concorrência
  15. Redis - Sharding com twemproxy (https://github.com/twitter/twemproxy) - Persistência desligada: app

    deve saber “esquentar” o cache! - Alternativa: Master / Slave (local) - Futuro: Redis Cluster - Atenção à versão do Redis, pode não ser a mesma da sua máquina (docker nele!)
  16. Painel de monitoração (cockpit) - Ajuda saber quando precisamos aumentar

    capacidade e onde - Investigação de problemas - Grafana ( http://grafana.org ) - New Relic / AppSignal
  17. Toggler - Feature Toggle - Deploy contínuo sem impacto -

    Exibir/esconder feature nova para determinadas contas - Ligar/desligar features sem deploy
  18. Processamento Lento Processamento Rápido Voltando ao diagrama... Autenticação Tratamento da

    Mensagem MTA Provedores Usuário Processamento da Mensagem Consolidação
  19. Aplicação Painel Painel Web API Interna - HTTP Recursos Pool

    de Conexões App Server Regras de Negócio Integrações
  20. Aplicação API Interna Aplicação Painel Painel Web API Interna -

    HTTP Recursos Pool de Conexões App Server Regras de Negócio Integrações Recursos Pool de Conexões App Server Regras de Negócio Integrações
  21. Separação de Máquinas por Aplicação Mesma máquina Interdependência de libs

    Consumo de Recursos Versão da Linguagem Máquina separada Lib por App Aplicação não afeta outra Upgrades podem ser feitos em separado
  22. API Interna Painel Novas Funcionalidades Estabilidade/Performance Muitas atualizações Poucas atualizações

    Framework para Web Framework para API Quebrou: ninguém morre Quebrou: ponto central de falha
  23. 2a Estratégia de Cache App Fonte App Cache App Cache

    Cache TTL curto TTL curto TTL curto
  24. 3a Estratégia de Cache App Fonte App Cache Slave App

    Cache Slave Cache Slave TTL longo TTL longo TTL longo Cache Master
  25. 4a Estratégia de Cache App Fonte App Cache Slave App

    Cache Slave Cache Slave TTL longo TTL longo TTL longo Cache Master Cache Manager
  26. Problemas com Pool de Recursos Não explode erros no início

    Esperar de liberação de recurso Timeouts são esporádicos Deadlocks
  27. Worker com Ruby puro - Fizemos um grande workers de

    processamento de mensagens - Em Ruby puro… - Sem recursos de mensageria - Difícil ver errors, retentativa, tamanho da fila….