BluDotNet - Conhecendo o Team Foundation Server 2010
Escalando plataforma e-mail transacional
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.
5. 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
6.
7. O que é email transacional?
- Disparos granulares
- Notificação de eventos
- Entrega rápida
- Exemplos de uso: CRM, E-commerce, Billing, Websites
11. Apostas que deram certo!
http://www.lafayetterealestatenews.com/wp-content/uploads/2015/08/Success.jpg
12.
13. Postgres Schemas
- Posgresql >= 9.3
- http://www.postgresql.org/docs/9.3/static/ddl-schemas.html
SET search_path TO myschema,public;
14.
15. Public
Tabelas menores
Tabelas em comum
Migração default
Privado (Conta)
Tabelas maiores
Dados de uma conta
Migração ao criar conta
Postgres Schemas
18. 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
19. COPY #{QUERY} TO STDOUT WITH FORMAT CSV
http://www.postgresql.org/docs/9.3/static/app-psql.html#APP-PSQL-META-
COMMANDS-COPY
22. 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
25. 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)
26. 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
30. 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)
31.
32. 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
33. 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!)
39. Painel de monitoração (cockpit)
- Ajuda saber quando precisamos aumentar capacidade e onde
- Investigação de problemas
- Grafana ( http://grafana.org )
- New Relic / AppSignal
42. Toggler - Feature Toggle
- Deploy contínuo sem impacto
- Exibir/esconder feature nova para determinadas contas
- Ligar/desligar features sem deploy
48. Aplicação Painel
Painel Web API Interna - HTTP
Recursos
Pool de
Conexões
App Server
Regras de
Negócio
Integrações
49. 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
50. 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
52. 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
53. Usar tecnologia que não domina...
Postfix Milter libmilter
pymilter
app
Protoco Milter
71. 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
72. 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….