Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... -...

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

Transcript of Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... -...

Page 1: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

Escalando uma plataforma de e-mail transacional:

aprendizado das trincheiras

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

SMTP Locaweb

Page 2: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

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: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

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: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel
Page 5: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

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- Mais de 2.000 contas ativas

Page 6: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel
Page 7: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

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

Page 8: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

Processamento Lento

Processamento Rápido

Arquitetura

Autenticação Tratamento da Mensagem MTA ProvedoresUsuário

Processamento da Mensagem Consolidação Painel

Page 9: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

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: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

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: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

Apostas que deram certo!

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

Page 12: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel
Page 13: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

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

SET search_path TO myschema,public;

Page 14: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel
Page 15: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

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: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

Prós

Isolamento dados

Tamanho das tabelas

Contras

Complexidade migrações

Relatórios consolidados

Postgres Schemas

Page 17: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

Exportação de Relatórios

Page 18: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

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: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

Separação das Apps

Page 21: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

Apps por funcionalidade

Milters(python)

WorkersPainel

Core Api

Provisionador

DB

API envio

Open-Click

Auth Policy

Page 22: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

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: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

Apps por funcionalidade

Milters(python)

WorkersPainel

Core Api

Provisionador

DB

API envio

Open-Click

Auth Policy

Page 24: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel
Page 25: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

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: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

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: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel
Page 28: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

DockerPor onde começar:

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

Vale gastar um tempo!

Page 29: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

Logs

Page 30: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

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: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel
Page 32: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

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: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

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: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

https://github.com/locaweb/heartcheck

Page 35: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

Heartcheck

Redis DB Sidekiq Telnet

ProcessosAPIs Mount Points

DNS

Page 36: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel
Page 37: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel
Page 38: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

Gráficos!

Page 39: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

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: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

Painel de monitoração (cockpit)

Page 41: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

Deploy contínuo(quase...)

Page 42: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

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

Page 43: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

De MVP para 2,5 MM

Page 44: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

Processamento Lento

Processamento Rápido

Voltando ao diagrama...

Autenticação Tratamento da Mensagem MTA ProvedoresUsuário

Processamento da Mensagem Consolidação

Page 45: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

Requisitos não funcionais

Alta Disponibilidade Performance

EscalabilidadeResiliência

Page 46: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

Estabilidade

Page 47: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

Isole os componentes críticos

Page 48: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

Aplicação Painel

Painel Web API Interna - HTTP

Recursos

Pool de Conexões App Server Regras de

Negócio Integrações

Page 49: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

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: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

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: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

Poucos Componentes=

Pouca Manutenção

Page 52: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

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: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

Usar tecnologia que não domina...

Postfix Milter libmilter

pymilter

app

Protoco Milter

Page 54: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

- Libs=

+ Alegria

Page 55: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

Escalabilidade

Page 56: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

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

lugares pertos

Page 57: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

Estratégia de Cache Padrão

App

Cache

Fonte

1

2

3

Page 58: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

1a Estratégia de Cache

App

Fonte App Cache

App

TTL curto

Page 59: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

2a Estratégia de Cache

App

Fonte App

Cache

App

Cache

Cache

TTL curto

TTL curto

TTL curto

Page 60: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

3a Estratégia de Cache

App

Fonte App

CacheSlave

App

CacheSlave

CacheSlave

TTL longo

TTL longo

TTL longo

CacheMaster

Page 61: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

4a Estratégia de Cache

App

Fonte App

CacheSlave

App

CacheSlave

CacheSlave

TTL longo

TTL longo

TTL longo

CacheMaster

Cache Manager

Page 62: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

Balanceamento de Carga

Page 63: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

App

Client App

App

Load Balancer

Page 64: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

App

Client

App

App

Load Balancer

App

App

App

Load Balancer

Load Balancer

Page 65: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

Client Load Balancer Cache

Client Load Balancer Cache

Page 66: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

Use SEMPRE pool de recursos

Page 67: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

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: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

Timeouts baixos=

Fail Fast

Page 69: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

Coisas que devíamos ter feito

Page 70: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel
Page 71: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

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: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

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: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

Não reinvente a roda

Page 74: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

Saiba os limites...

Teste de Carga

Teste de Estresse

Teste de Pico

Page 75: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

Algumas referências

Page 76: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel
Page 77: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel
Page 78: Escalando uma plataforma de e-mail transacional: SMTP ... · Escalando uma plataforma de ... - Atenção à versão do Redis, pode não ser a mesma da sua ... Aplicação Painel Painel

Obrigado!!!

Desconto especial ao evento: bit.ly/smtpqcon