Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

78
Escalando uma plataforma de e-mail transacional: aprendizado das trincheiras Celso Crivelaro (@celsocrivelaro) Fabio Perrella (@fabioperrella) SMTP Locaweb

Transcript of Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Page 1: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Escalando uma plataforma de e-mail transacional:

aprendizado das trincheiras

Celso Crivelaro (@celsocrivelaro)Fabio Perrella (@fabioperrella)

SMTP Locaweb

Page 2: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

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

Page 3: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

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

Page 4: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras
Page 5: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

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

Page 6: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras
Page 7: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

O que é email transacional?- Disparos granulares- Notificação de eventos- Entrega rápida- Exemplos de uso: CRM, E-commerce, Billing, Websites

Page 8: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Processamento Lento

Processamento Rápido

Arquitetura

Autenticação Tratamento da Mensagem MTA ProvedoresUsuário

Processamento da Mensagem Consolidação Painel

Page 9: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

SMTP Locaweb- Arquitetura distribuída- Painel e APIs -> Ruby on Rails- Workers -> Ruby- Postfix milters -> Python- DB -> Postgres- Caches e Filas -> Redis- MTA -> PowerMTA

Page 10: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

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)

Page 11: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Apostas que deram certo!

http://www.lafayetterealestatenews.com/wp-content/uploads/2015/08/Success.jpg

Page 12: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras
Page 13: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Postgres Schemas- Posgresql >= 9.3- http://www.postgresql.org/docs/9.3/static/ddl-schemas.html

SET search_path TO myschema,public;

Page 14: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras
Page 15: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Public

Tabelas menores

Tabelas em comum

Migração default

Privado (Conta)

Tabelas maiores

Dados de uma conta

Migração ao criar conta

Postgres Schemas

Page 16: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Prós

Isolamento dados

Tamanho das tabelas

Contras

Complexidade migrações

Relatórios consolidados

Postgres Schemas

Page 17: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Exportação de Relatórios

Page 18: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Postgres Copy - Exportação de dadosProblema:

- Geração de arquivos > 100mil linhas- Código ruby iterando do DB e gerando CSV- Podia levar horas para finalizar geração de arquivo

Page 20: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Separação das Apps

Page 21: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Apps por funcionalidade

Milters(python)

WorkersPainel

Core Api

Provisionador

DB

API envio

Open-Click

Auth Policy

Page 22: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

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

Page 23: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Apps por funcionalidade

Milters(python)

WorkersPainel

Core Api

Provisionador

DB

API envio

Open-Click

Auth Policy

Page 24: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras
Page 25: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

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)

Page 26: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Docker com ambiente completo- Docker-compose! (https://docs.docker.com/compose)- Mailcatcher (https://mailcatcher.me)- Fluxo completo do email- Base para configuração de produção

Page 27: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras
Page 28: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

DockerPor onde começar:

https://training.docker.com/self-paced-training

Vale gastar um tempo!

Page 29: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Logs

Page 30: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

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)

Page 31: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras
Page 32: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

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

Page 33: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

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

Page 34: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

https://github.com/locaweb/heartcheck

Page 35: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Heartcheck

Redis DB Sidekiq Telnet

ProcessosAPIs Mount Points

DNS

Page 36: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras
Page 37: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras
Page 38: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Gráficos!

Page 39: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Painel de monitoração (cockpit)- Ajuda saber quando precisamos aumentar capacidade e onde- Investigação de problemas- Grafana ( http://grafana.org )- New Relic / AppSignal

Page 40: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Painel de monitoração (cockpit)

Page 41: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Deploy contínuo(quase...)

Page 42: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Toggler - Feature Toggle- Deploy contínuo sem impacto- Exibir/esconder feature nova para determinadas contas- Ligar/desligar features sem deploy

Page 43: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

De MVP para 2,5 MM

Page 44: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Processamento Lento

Processamento Rápido

Voltando ao diagrama...

Autenticação Tratamento da Mensagem MTA ProvedoresUsuário

Processamento da Mensagem Consolidação

Page 45: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Requisitos não funcionais

Alta Disponibilidade Performance

EscalabilidadeResiliência

Page 46: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Estabilidade

Page 47: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Isole os componentes críticos

Page 48: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Aplicação Painel

Painel Web API Interna - HTTP

Recursos

Pool de Conexões App Server Regras de

Negócio Integrações

Page 49: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Aplicação API InternaAplicaçã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

Page 50: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

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

Page 51: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Poucos Componentes=

Pouca Manutenção

Page 52: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

API InternaPainel

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

Page 53: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Usar tecnologia que não domina...

Postfix Milter libmilter

pymilter

app

Protoco Milter

Page 54: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

- Libs=

+ Alegria

Page 55: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Escalabilidade

Page 56: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Busque o dado de memórias + rápidas e de

lugares pertos

Page 57: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Estratégia de Cache Padrão

App

Cache

Fonte

1

2

3

Page 58: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

1a Estratégia de Cache

App

Fonte App Cache

App

TTL curto

Page 59: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

2a Estratégia de Cache

App

Fonte App

Cache

App

Cache

Cache

TTL curto

TTL curto

TTL curto

Page 60: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

3a Estratégia de Cache

App

Fonte App

CacheSlave

App

CacheSlave

CacheSlave

TTL longo

TTL longo

TTL longo

CacheMaster

Page 61: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

4a Estratégia de Cache

App

Fonte App

CacheSlave

App

CacheSlave

CacheSlave

TTL longo

TTL longo

TTL longo

CacheMaster

Cache Manager

Page 62: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Balanceamento de Carga

Page 63: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

App

Client App

App

Load Balancer

Page 64: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

App

Client

App

App

Load Balancer

App

App

App

Load Balancer

Load Balancer

Page 65: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Client Load Balancer Cache

Client Load Balancer Cache

Page 66: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Use SEMPRE pool de recursos

Page 67: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Problemas com Pool de Recursos

Não explode erros no início

Esperar de liberação de recurso

Timeouts são esporádicos Deadlocks

Page 68: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Timeouts baixos=

Fail Fast

Page 69: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Coisas que devíamos ter feito

Page 70: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras
Page 71: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Documentação de Arquitetura- Documentação sobre decisões de arquitetura

http://thinkrelevance.com/blog/2011/11/15/documenting-architecture-decisions

- Faltou documentação de decisões

Page 72: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

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….

Page 73: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Não reinvente a roda

Page 74: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Saiba os limites...

Teste de Carga

Teste de Estresse

Teste de Pico

Page 75: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Algumas referências

Page 76: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras
Page 77: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras
Page 78: Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado das trincheiras

Obrigado!!!

Desconto especial ao evento: bit.ly/smtpqcon