qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras
TRANSCRIPT
![Page 1: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/1.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/2.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/3.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/4.jpg)
![Page 5: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/5.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/6.jpg)
![Page 7: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/7.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/8.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/9.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/10.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/11.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/12.jpg)
![Page 13: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/13.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/14.jpg)
![Page 15: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/15.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/16.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/17.jpg)
Exportação de Relatórios
![Page 18: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/18.jpg)
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 19: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/19.jpg)
COPY #{QUERY} TO STDOUT WITH FORMAT CSV
http://www.postgresql.org/docs/9.3/static/app-psql.html#APP-PSQL-META-COMMANDS-COPY
![Page 20: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/20.jpg)
Separação das Apps
![Page 21: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/21.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/22.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/23.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/24.jpg)
![Page 25: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/25.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/26.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/27.jpg)
![Page 28: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/28.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/29.jpg)
Logs
![Page 30: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/30.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/31.jpg)
![Page 32: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/32.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/33.jpg)
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 35: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/35.jpg)
Heartcheck
Redis DB Sidekiq Telnet
ProcessosAPIs Mount Points
DNS
![Page 36: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/36.jpg)
![Page 37: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/37.jpg)
![Page 38: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/38.jpg)
Gráficos!
![Page 39: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/39.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/40.jpg)
Painel de monitoração (cockpit)
![Page 41: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/41.jpg)
Deploy contínuo(quase...)
![Page 42: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/42.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/43.jpg)
De MVP para 2,5 MM
![Page 44: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/44.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/45.jpg)
Requisitos não funcionais
Alta Disponibilidade Performance
EscalabilidadeResiliência
![Page 46: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/46.jpg)
Estabilidade
![Page 47: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/47.jpg)
Isole os componentes críticos
![Page 48: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/48.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/49.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/50.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/51.jpg)
Poucos Componentes=
Pouca Manutenção
![Page 52: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/52.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/53.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/54.jpg)
- Libs=
+ Alegria
![Page 55: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/55.jpg)
Escalabilidade
![Page 56: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/56.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/57.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/58.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/59.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/60.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/61.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/62.jpg)
Balanceamento de Carga
![Page 63: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/63.jpg)
App
Client App
App
Load Balancer
![Page 64: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/64.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/65.jpg)
Client Load Balancer Cache
Client Load Balancer Cache
![Page 66: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/66.jpg)
Use SEMPRE pool de recursos
![Page 67: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/67.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/68.jpg)
Timeouts baixos=
Fail Fast
![Page 69: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/69.jpg)
Coisas que devíamos ter feito
![Page 70: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/70.jpg)
![Page 71: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/71.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/72.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/73.jpg)
Não reinvente a roda
![Page 74: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/74.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/75.jpg)
Algumas referências
![Page 76: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/76.jpg)
![Page 77: Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado das trincheiras](https://reader030.vdocuments.site/reader030/viewer/2022032711/589fe1011a28abf3238b4e31/html5/thumbnails/77.jpg)