Pular para o conteúdo
~/petro

sua estratégia de deploy importa menos do que você pensa

(mês passado) · 12 min de leitura · views
Índice
  1. Recreate — Derruba tudo. Sobe de novo.
  2. Rolling — Troca o pneu com o carro andando.
  3. Blue/Green — O prédio espelhado.
  4. o mito do rollback
  5. Canary — Três mesas no fundo, pra ver se o salão passa mal.
  6. a conta que ninguém quer fazer
  7. Shadow — Trabalho sujo no escuro.
  8. o blast radius
  9. o pesadelo do banco de dados
  10. checklist tático

Sexta-feira, 15h12. Deploy de rotina. Alteramos o user_data.sh da instância — nada exótico. Rolling update, como sempre fazíamos.

O warmup time do Auto Scaling Group estava configurado para 5 minutos. Mas com as novas dependências que adicionamos, a instância passou a levar 9 minutos para subir. O ASG, impaciente, marcava a instância como unhealthy. Matava. Subia outra. Que também não bootava a tempo. Que também era marcada como unhealthy.

Em poucos minutos, efeito cascata. 2 instâncias viraram 20. Nenhuma saudável. A latência explodiu e a tela foi tomada por erros 5xx pra todo lado.

Tivemos um Rolling elegante no papel, mas um Recreate catastrófico na prática.


O problema não era a estratégia. Era um warmup que ninguém conferiu. Um script sem teste de carga. Um default que ninguém questionou.

Times gastam semanas debatendo arquiteturas no quadro branco como se fossem escudos mágicos contra quedas em produção. Não são.

A estratégia é só o envelope. O que decide se o sistema sobe ou desce são os parâmetros que ninguém olha: o readiness delay, o warmup time, o connection draining, o batch size. Ter um Canary perfeito com um health check genérico é pular de avião com paraquedas amarrado com nó cego. O design tá lindo, mas a execução vai ser fatal.

Pensa na sua infra como a reforma de um restaurante lotado. Três objetivos:

  • Zero downtime: O restaurante nunca fecha; os clientes continuam comendo.
  • Zero custo extra: Você não aluga um segundo prédio nem compra fogões sobressalentes.
  • Zero risco: Se a nova cozinha falhar, a comida de ninguém queima.

A realidade é que você só pode ter dois. O terceiro sempre cobra — e é nessa troca que cada estratégia se posiciona.

o triângulo do deploy

escolha dois — o terceiro sempre cobra

Zero DowntimeZero Custo ExtraZero RiscoRecreateRollingBlue/GreenCanaryShadow

Cada estratégia abaixo tem uma simulação interativa que você pode (e deve) quebrar. O ponto não é escolher a “vencedora” — é entender por que nenhuma delas te salva sozinha.


Recreate — Derruba tudo. Sobe de novo.

A versão antiga (v1) é completamente desligada. O ambiente zera. A versão nova (v2) assume do zero. Sem sobreposições.

A Prática: Você prega um aviso: “Fechado para reformas”. Desliga tudo. Por 30 dias, ninguém é atendido. Quando reabre, a operação é 100% nova e coerente. Sem misturar estado antigo com banco novo.

Como funciona no Servidor:

  1. Mata todo o tráfego v1.
  2. Aguarda o desligamento pleno.
  3. Inicia as instâncias v2.
  4. Religado.

Onde faz sentido: Quando o ambiente rejeita concorrência. Uma estrutura de banco que quebra fatalmente a versão anterior.

O Custo: Downtime absoluto. Não há choro.

PrósContras
Zero risco arquiteturalDowntime inevitável
Sem colisão de versãoUsuários sem acesso
Menor complexidadeRollback requer re-deploy imediato
configuração de deploy
Instâncias
1
Boot time
2s
Warmup do LB
2s
Drain antes de matar
2s
Taxa de requests
3 req/s
✓ seguroWarmup maior ou igual ao boot time, junto com um drain bem configurado, ajuda a manter o deploy sem downtime.
infraestruturadireto
v1
v1
ONLINE — serviço estável
fluxo de requisiçõesdireto
0
Usuáriosv1load 0/13 in-flight requests0/13
sucesso: 0falha: 0

Quebre a simulação: Aumente para 4 instâncias e veja a matemática cruel. Quanto maior seu cluster, maior a janela de indisponibilidade. O tamanho da sua escala vira o tamanho do seu downtime.


Rolling — Troca o pneu com o carro andando.

A versão B estrangula a versão A gradualmente. Sai um, entra outro. Peça por peça até o ambiente estar 100% atualizado. O sistema se recusa a morrer completamente.

A Prática: O serviço não para. Você isola uma máquina do pool, atualiza, e sobe de novo. Metade do tráfego esbarra na versão velha, metade na nova. É um atrito temporário, mas o faturamento não engasga.

A Falha: Seu Banco de Dados é obrigado a gerenciar requisições da v1 e da v2 alterando a mesma estrutura simultaneamente. Essa estratégia cobra seu preço na frente.

O Custo: Capacidade ou velocidade. Você abre mão de uma.

PrósContras
Zero downtime (no papel)Dolorosamente arrastado
O Padrão Ouro da indústriaExige retrocompatibilidade severa
Baixo custo agregadoErros de drain são fatais
configuração de deploy
Instâncias
4
Boot time
2s
Warmup do LB
2s
Drain antes de matar
2s
Taxa de requests
9 req/s
✓ seguroWarmup maior ou igual ao boot time, junto com um drain bem configurado, ajuda a manter o deploy sem downtime.
parâmetros da estratégia
Batch size
1
Mín. ativas
2
Máx. instâncias
12
infraestrutura
v1
v1
v1
v1
v1
ONLINE — serviço estável
fluxo de requisições
0
UsuáriosLBv1load 0/13 in-flight requests0/13v1load 0/13 in-flight requests0/13v1load 0/13 in-flight requests0/13v1load 0/13 in-flight requests0/13
sucesso: 0falha: 0

Quebre a simulação: Zere o minActive e aumente seu batchSize ao máximo. Boom. Você esmagou a capacidade ativamente e o seu refinado Rolling acabou de virar um Recreate disfarçado de desastre. Aumente o bootTime pra superar o health check e assista a tela pintar de vermelho — foi essa tela que derrubou nossa sexta-feira.


Blue/Green — O prédio espelhado.

Custo alto. Risco Mínimo. A versão B (Green) desponta numa infra paralela, blindada e idêntica. Testada às escuras. Ao cruzar a linha de segurança, aperta-se um botão. O roteador vira 100% do tráfego pro lugar novo.

A Prática: Você nunca mexe na infra principal. Sobe outro ambiente, contrata réplicas e testa em segredo. Tudo limpo? Vira a chave magnética (DNS/Load Balancer) no mesmo segundo. O cliente continua navegando e nem sente.

O Limite Colateral: Ambientes virgens precisam de banco de dados aquecido. Caches zumbis ou compartilhamento bruto de schemas fazem a porta trancar.

A Troca: Custo dobrado em nuvem de uma canetada só.

PrósContras
Zero downtime (teórico)O dobro na fatura no mês
O tão sonhado Rollback “Botão Vermelho”Dependências estagnadas de Banco
Testes robustos de fumaça pré realCache frio mata a produção
configuração de deploy
Instâncias/ambiente
2
Boot time
2s
Warmup do LB
2s
Drain antes de matar
2s
Taxa de requests
8 req/s
✓ seguroWarmup maior ou igual ao boot time, junto com um drain bem configurado, ajuda a manter o deploy sem downtime.
parâmetros da estratégia
Cache warmup
2
infraestrutura
blue
v1
v1
green
ONLINE — serviço estável
fluxo de requisições
0
UsuáriosLBv1load 0/13 in-flight requests0/13v1load 0/13 in-flight requests0/13
sucesso: 0falha: 0

Quebre a simulação: Vá nos parâmetros da estratégia e zere o Cache warmup. Na virada do switch, contemple a tempestade. Isso é a Manada em Fuga (Thundering Herd). Com caches vazios, requisições afogam instantaneamente o banco. O LB vira 100%, e máquinas hiper-saudáveis te disparam 504 na cara num lock de desespero! Você salvou o código, mas a percepção capotou.

o mito do rollback

Blue/Green é aclamado pelo sonho: aperto o Undo em 5 segundos. Mas é ilusão. Você desfaz código. Você nunca desfaz estado.

  • O Evento: Kafka postou a notificação. 12 API’s consumiram. Sem Ctrl+Z.
  • Side-Effects: A máquina rodou webhooks. O e-mail avisou os usuários. O gateway de pagamentos tirou fundos dos cartões.
  • DB Alterado: Matou aquela tabela no banco mas jobs assíncronos ainda consultavam o user_id_legacy? O sangramento já começou.

Sistemas distribuídos não aceitam “Ctrl+Z”. Preferir a precisão de falhar aos poucos (ex. Canary) é mais seguro que bater num freio de emergência invisível. A infraestrutura retrocede, mas a ferida nos dados fica aberta. Assuma que não tem volta — desenhe seu deploy para avançar (fix-forward) em frações menores.


Canary — Três mesas no fundo, pra ver se o salão passa mal.

Se Blue/Green provou que você não desfaz estado, Canary faz uma pergunta mais afiada: e se você nunca precisar? Falha tão pequena que o estrago é irrelevante.

A joia da coroa em mitigação de risco. Manda 1~5% do tráfego pra versão B. Fica observando. Se nada pegar fogo, abre pra 10%, 25%, e então 100%.

A Prática: Ninguém joga um update opressivo em 100% de cara. Você joga a nova versão num nó pequeno da ponta. Errou? O log espirra lixo sem queimar a operação geral.

O padrão das big techs — pegar o bug antes dele virar incêndio global.

O Custo: Tempo e matemática que ninguém quer fazer.

PrósContras
Blast radius controladoDemanda automação blindada
Métricas reais, não sintéticasAmostra ridícula se o tempo for curto (leia abaixo)
Cultura de observabilidadeDeploy lento por design
configuração de deploy
Instâncias
4
Boot time
2s
Warmup do LB
2s
Drain antes de matar
2s
Taxa de requests
9 req/s
✓ seguroWarmup maior ou igual ao boot time, junto com um drain bem configurado, ajuda a manter o deploy sem downtime.
parâmetros da estratégia
Passos
4
infraestrutura
v1
v1
v1
v1
v1
ONLINE — serviço estável
fluxo de requisições
0
UsuáriosLBv1load 0/13 in-flight requests0/13v1load 0/13 in-flight requests0/13v1load 0/13 in-flight requests0/13v1load 0/13 in-flight requests0/13
sucesso: 0falha: 0

Aviso anti-loucura: Não cruze A/B Test com Canary. A/B descobre a venda de produtos pra negócio (Qual cor os botões pagam?). Canary tenta salvar a integridade funcional de engenharia e servidor (Tem lixo de RAM destruindo query nova de JS?). Correm na mesma via, mas com direções divergentes.


a conta que ninguém quer fazer

Times compram o hype do The Canary com pífios “15 minutos a 5%” antes do pulo cego pra 100%.

Se existir um memory leak imperceptível que detona apenas 0,1% das requisições, você precisará de, no mínimo, 30 mil conexões direcionadas ao Canary só para o DataDog gerar um alerta estatisticamente válido. Deixar o tráfego 15 minutos pingando a 5% fora da escala de uma big tech não é rigor técnico, é teatro de segurança. É tentar tranquilizar a mente olhando para gráficos enquanto uma falha silenciosa se acumula no cluster.


Shadow — Trabalho sujo no escuro.

Copia todo request pro escuro. A versão A continua servindo o usuário de verdade. Em paralelo, a versão B recebe o mesmo tráfego, processa tudo — latência, CPU, erros — mas descarta a resposta. O usuário nunca sabe.

Na Prática: Você roda a versão nova sob tráfego real de produção, sem afetar ninguém. A pressão é real, os dados são reais, mas o cliente não sente nada.

A armadilha dos side-effects: Sem mocks blindados, a versão shadow dispara e-mails, cobra cartões e escreve no banco — tudo duplicado. Se você não isolar os efeitos colaterais, o shadow vira uma bomba.

O Custo: A maior precisão possível. Mas a conta de cloud dobra.

PrósContras
Zero risco pro usuárioCusto de infra dobrado
Métricas de performance reaisMock de side-effects é um pesadelo
configuração de deploy
Instâncias
3
Boot time
2s
Warmup do LB
2s
Drain antes de matar
2s
Taxa de requests
9 req/s
✓ seguroWarmup maior ou igual ao boot time, junto com um drain bem configurado, ajuda a manter o deploy sem downtime.
infraestrutura
prod
v1
v1
v1
mirror
ONLINE — serviço estável
fluxo de requisições
0
UsuáriosLBv1load 0/13 in-flight requests0/13v1load 0/13 in-flight requests0/13v1load 0/13 in-flight requests0/13
sucesso: 0falha: 0

Quebre a simulação: Apenas encare ativamente o contador em amarelo. Veja a dupla faturação das máquinas na conta por nada a ser oferecido externamente. Essa é a paranoia total comprada em dólar e sem falhas perante os usuários.


o blast radius

Cinco estratégias, cada uma otimizando um lado diferente do mesmo triângulo. Mas estratégia é o quê. A pergunta mais perigosa é onde.

Deploys não acontecem apenas na camada de servidores. O escopo da mudança — o seu blast radius — escala desde uma única thread de CPU até o roteamento DNS intercontinental:

Simples

Menor custo / Maior risco

Complexo

Maior custo / Menor risco

Recreate

Downtime total

Rolling

Atualização gradual

Blue/Green

Cópia exata, dobra o custo

Canary

Roteamento percentual

Shadow

Tráfego espelhado

CamadaControleExemplos
Processos de SOPortas / IPCGunicorn, PM2
Pods / ContainersIngress / Service MeshKubernetes, Envoy
Instâncias / VMsLoad Balancers (ALB/NLB)AWS EC2, Azure VMs
Tráfego GlobalRoteamento Edge / DNSCloudflare, Route53

Dizer na daily que o time “faz Canary” é vago. Tão roteando 2% dos requests num load balancer local, ou jogando 10% do tráfego da Europa direto no Cloudflare? Sem saber o blast radius exato, você não sabe o tamanho do estrago.


o pesadelo do banco de dados

O blast radius te diz até onde o estrago se espalha. O banco de dados te diz onde ele fica.

Se existe uma força bruta capaz de triturar o seu Canary ou Rolling perfeito, é o banco de dados relacional.

A versão antiga não reconhece as alterações da mais nova. Se o script de deploy deita as instâncias v1 enquanto destrói uma coluna que estava sendo lida por elas, a aplicação apaga. O banco é o cemitério de estado compartilhado das estratégias elegantes.

Pra sobreviver a isso, a saída é o padrão Expand & Contract:

  1. Expansão: Cria as colunas novas. O código passa a escrever nos dois lugares ao mesmo tempo — mas a leitura continua no schema antigo.
  2. Migração: Um script em background move os dados antigos pro schema novo.
  3. Contração: Meses depois, quando nada mais lê o schema antigo, mata a coluna velha. Esse deploy “simples” leva um mês pra terminar com segurança.

checklist tático

A sexta-feira que abriu esse post? Estratégia certa. Parâmetro errado. Cada simulação que você quebrou acima provou a mesma coisa de um ângulo diferente.

Antes de aplicar a próxima mudança na infraestrutura, valide:

  1. Os parâmetros decidem tudo. Um timeout curto ou um batch size no máximo transformam o Canary mais elaborado num Recreate acidental.
  2. O banco não tem Ctrl+Z. Desenhe assumindo que falhas vão vazar pro estado persistido. A saída é avançar (fix-forward), não voltar.
  3. Amostra pequena = teatro. Canary com 5% de tráfego por 10 minutos em volume baixo não é validação — é autoengano. Se não atinge relevância estatística, o alerta é cego.

No fim do dia, a estratégia é só uma intenção. O que roda de verdade em produção são os valores que alguém preencheu num arquivo de configuração.


Nenhuma vítima ainda. Volte e quebre alguma coisa.