Implantação azul-verde vs canário: diferenças, compensações e como escolher

  1. Início
  2. Blog
  3. DevOps

DevOps

Implantação Azul-Verde vs Canário: Diferenças, compensações e como escolher

Ambas as estratégias permitem lançar sem derrubar o site, mas gerenciam os riscos de maneiras opostas. Saiba como cada um funciona, quanto realmente custa, como manusear o banco de dados e qual combina com sua equipe.

9 min de leitura
Implantação azul-verde versus canário: diferenças, compensações e como escolher

Principais pontos

  • Azul-verde mantém dois ambientes completos e alterna todo o tráfego de uma só vez.
  • Canary envia a nova versão primeiro para uma pequena parcela de usuários e depois a expande gradualmente.
  • Azul-verde oferece reversão muito rápida. Canary limita quantos usuários um lançamento incorreto pode afetar.
  • Ambos dependem de alterações de banco de dados compatíveis com versões anteriores e de um bom monitoramento.

Liberar software costumava significar uma janela de manutenção e dedos cruzados. As equipes modernas usam estratégias que tornam os lançamentos rotineiros, e a escolha implantação azul-verde versus implantação canário é uma das primeiras que você enfrentará. Ambos reduzem o risco, mas o fazem de maneiras opostas: um prepara uma substituição completa, enquanto o outro testa com usuários reais, um pouco de cada vez.

Este guia explica como cada um funciona e quanto custa na prática. Executamos pequenos exemplos de roteamento de usuário e reversão no Python 3.13, e a saída vem dessa execução. Os exemplos do Kubernetes são ilustrativos e não os executamos. Trate as porcentagens e os limites como exemplos iniciais de adaptação.

A resposta curta

Com a implantação azul-verde, você executa dois ambientes de produção idênticos. Um atende os usuários enquanto você implanta e testa a nova versão no outro, e então você alterna todo o tráfego de uma só vez.

Com a implantação canary, a nova versão é executada ao lado da antiga. Você envia uma pequena porcentagem do tráfego real, compara os resultados e aumenta a participação passo a passo até atender a todos. O nome vem dos canários que os mineiros costumavam usar como alerta precoce de perigo.

Azul esverdeado vs canário lado a lado

Aspecto Azul esverdeado Canário
Mudança de tráfego De uma vez Gradual
Usuários expostos a um lançamento incorreto Tudo, até você voltar Somente o compartilhamento canário
Reverter Mudar o tráfego de volta Defina o compartilhamento canário como zero
Velocidade de liberação Transferência rápida Mais devagar, em etapas
Custo de infraestrutura Até o dobro durante o lançamento Uma pequena parcela extra
Roteamento de tráfego necessário Uma simples mudança Roteamento baseado em porcentagem
Monitoramento necessário Bom Excelente, com métricas por versão
Versões vivem juntas Resumidamente, se é que existe Para todo o lançamento
Feedback de usuários reais antes do lançamento completo Não Sim

Como funciona a implantação azul-verde

  1. Blue está ativo e atende todo o tráfego.
  2. Implante a nova versão em verde, que não recebe tráfego de usuários.
  3. Teste o verde exaustivamente, no ambiente de produção real, utilizando testes de fumaça e usuários internos.
  4. Mude o roteador, balanceador de carga ou DNS para enviar o tráfego para verde.
  5. Observe atentamente, com o azul ainda funcionando e pronto.
  6. Se algo estiver errado, volte. Se tudo estiver bem, o azul se tornará o próximo ambiente ocioso.

No Kubernetes, você pode fazer a troca alterando o seletor de um serviço, para que o tráfego seja movido para pods rotulados de forma diferente:

apiVersion: v1
kind: Service
metadata:
  name: shop
spec:
  selector:
    app: shop
    version: green   # was: blue
  ports:
    - port: 80
      targetPort: 8000

Pontos fortes: É conceitualmente simples, você pode testar a configuração exata de produção antes que os usuários a vejam e a reversão é quase instantânea. Fraquezas: Infraestrutura duplicada pode ser cara, um bug que passa despercebido nos testes atinge todos ao mesmo tempo, e sessões abertas e trabalho em andamento precisam de cuidados durante a mudança. Se você usar DNS para o switch, os registros em cache poderão atrasá-lo. Novo nos conceitos? Veja nosso tutorial do Kubernetes para iniciantes.

Como funciona a implantação canário

  1. Implante a nova versão junto com a estável.
  2. Direcione uma pequena parcela do tráfego, por exemplo 5%, para o canário.
  3. Compare taxas de erro, latência e métricas de negócios com a versão estável.
  4. Se estiver saudável, aumente para 25%, depois 50% e depois 100%.
  5. Se alguma coisa degradar, envie todo o tráfego de volta para a versão estável.

Muitas equipes iniciam um canário com funcionários internos, depois com uma região de baixo risco e só então com o público em geral.

Pontos fortes: Um lançamento incorreto afeta apenas um pequeno grupo, e você aprende com o tráfego real que nenhum ambiente de teste pode ser totalmente reproduzido. Pontos fracos: você precisa de roteamento baseado em porcentagem e métricas por versão, as implementações demoram mais e duas versões são executadas juntas por um tempo. Um canário pequeno também pode ser silencioso demais para emitir um sinal significativo, principalmente em horários de baixo tráfego.

Roteamento de usuário estável

Escolher uma versão aleatoriamente em cada solicitação proporciona aos usuários uma experiência confusa, pois eles podem alternar entre o antigo e o novo. Uma solução comum é fazer o hash de um ID de usuário estável em um bucket, para que cada usuário sempre obtenha a mesma resposta:

import hashlib

def bucket(user_id):
    digest = hashlib.sha256(user_id.encode()).hexdigest()
    return int(digest, 16) % 100

def version_for(user_id, canary_percent):
    return "v2" if bucket(user_id) < canary_percent else "v1"

users = [f"user-{i}" for i in range(10000)]
for percent in (5, 25, 50, 100):
    share = sum(version_for(u, percent) == "v2" for u in users) / len(users)
    print(percent, round(share * 100, 1))

# 5 5.0
# 25 24.5
# 50 49.9
# 100 100.0

A participação real seguiu de perto a meta. Este método tem mais duas propriedades úteis e nossa execução confirmou ambas. O mesmo usuário sempre recebeu a mesma versão. E todos no grupo de 5% ainda estavam incluídos em 25%, então ninguém que já tinha a nova versão retrocedeu à medida que o lançamento crescia.

Em sistemas reais, uma malha de serviço, balanceador de carga ou uma ferramenta como Argo Rollouts ou Flagger geralmente cuida desse roteamento, portanto você não precisa escrevê-lo sozinho. Ainda é útil entender o que eles estão fazendo.

Automatizando a decisão

Um canário só funciona se alguém estiver realmente comparando as versões. As verificações automatizadas são mais confiáveis ​​do que uma pessoa observando os gráficos. Aqui está a ideia central, comparando a taxa de erro do canário com a da versão estável:

def should_rollback(canary_errors, canary_total, base_errors, base_total,
                    tolerance=1.5, min_requests=500):
    if canary_total < min_requests:
        return False   # not enough data to decide
    return (canary_errors / canary_total) > (base_errors / base_total) * tolerance

should_rollback(3, 100, 10, 5000)        # False: too few requests
should_rollback(30, 1000, 100, 10000)    # True:  3% against 1%
should_rollback(12, 1000, 100, 10000)    # False: 1.2% is within tolerance

Observe o primeiro caso. Sua taxa de erro parece alta, mas com apenas 100 solicitações, ainda não há evidências suficientes. Ferramentas reais aplicam estatísticas mais cuidadosas e analisam vários sinais em conjunto:

Sinal Exemplo
Erros Taxa de 5xx respostas
Latência p95 e p99, conforme explicado em teste de carga versus teste de estresse
Saturação CPU, memória, pools de conexão
Negócios Inscrições, checkouts, sucesso de pagamento

Dica: compare o canário com a versão estável no mesmo intervalo de tempo, em vez de com os números da semana passada. O tráfego e o comportamento mudam a cada hora, portanto, uma comparação lado a lado fornece um sinal muito mais justo.

O problema do banco de dados

O código do aplicativo pode ser trocado em segundos, mas os dados não. Ambas as estratégias geralmente compartilham um banco de dados, portanto, durante uma implementação e após uma reversão, as versões antiga e nova devem funcionar com o mesmo esquema.

A resposta padrão é o padrão expandir e contrair. Suponha que você queira renomear name para full_name:

  1. Expandir: adicione a nova coluna. O código antigo não é afetado.
  2. Migrar: libera código que grava em ambas as colunas e preenche linhas antigas.
  3. Switch: libera o código que lê a nova coluna.
  4. Contrato: quando nada usar a coluna antiga, remova-a em uma versão posterior.

Isso requer vários lançamentos, mas cada etapa pode ser revertida com segurança. Executar RENAME COLUMN de uma só vez quebraria qualquer versão que esperasse o outro nome. Tenha cuidado também com alterações de esquema de longa duração, pois elas podem conter bloqueios. Para saber mais sobre isso, leia sobre transações SQL.

Rolamento e outras estratégias

Estratégia Como funciona Bom para
Recriar Pare de usar o que é antigo e comece de novo, com tempo de inatividade Ferramentas internas, sistemas em lote
Rolando Substitua as instâncias algumas de cada vez Um padrão comum, inclusive no Kubernetes
Azul esverdeado Alternar entre dois ambientes Corte e reversão rápidos
Canário Expanda uma pequena parcela gradualmente Alto tráfego, alto risco
Sombra Copie o tráfego para a nova versão e descarte suas respostas Testando com carga real, sem impacto no usuário

Uma implantação do Kubernetes faz uma atualização contínua por padrão, o que é adequado para muitos serviços. Uma atualização contínua também muda gradualmente, mas sua parcela está vinculada ao número de instâncias e não analisa resultados por si só ou faz uma pausa em métricas ruins.

E quanto aos sinalizadores de recursos?

A implantação coloca o código nos servidores e o lançamento disponibiliza um recurso para os usuários. Os sinalizadores de recursos os mantêm separados, permitindo que você ative um recurso para usuários escolhidos sem implantar nada. Eles funcionam muito bem com ambas as estratégias: implantar com o sinalizador desativado e ativá-lo gradualmente. Eles não substituem essas estratégias, pois um sinalizador não pode protegê-lo de uma versão que trava na inicialização. Lembre-se de remover sinalizadores antigos, pois eles se acumulam como dívida técnica.

Como escolher

Sua situação Escolha razoável
Aplicativo simples e poucos usuários Atualização contínua
Precisa de transição e reversão muito rápidas Azul esverdeado
Quer testar em produção antes da mudança Azul esverdeado
Alto tráfego e alto custo de falha Canário
Monitoramento forte e métricas por versão Canário
Baixo tráfego Azul esverdeado, já que os sinais canários são muito fracos
Orçamento apertado para infraestrutura Canário ou rolante

Eles também podem ser combinados. Algumas equipes implantam um ambiente verde e depois transferem o tráfego para ele gradualmente, obtendo um ambiente limpo e um raio de explosão limitado. Seja qual for sua escolha, automatize-o por meio de seu pipeline de CI/CD, conforme explica nosso guia de ações do GitHub.

Erros comuns

  • Fazer alterações significativas no esquema. A reversão não ajuda se o código antigo não conseguir ler os dados.
  • Não ter critérios de reversão. Decida o que “ruim” significa antes do início do lançamento, não durante um incidente.
  • Deixando os ambientes flutuarem. Se o verde for diferente do azul, seus testes provarão menos. Defina ambos com infraestrutura como código.
  • Medindo apenas métricas técnicas. Uma versão pode estar livre de erros e ainda assim interromper a finalização da compra.
  • Nunca pratique rollback. Ensaie para que funcione quando você estiver sob pressão.
  • Esquecer trabalhos em segundo plano. Trabalhadores e tarefas agendadas também precisam de um plano durante uma mudança.

Considerações finais

Azul esverdeado oferece uma troca limpa e rápida. Canary oferece uma exposição pequena e medida. Se o seu monitoramento ainda for básico, comece com atualizações contínuas ou azul esverdeado e invista em métricas por versão antes de tentar canários. Em seguida, ensaie uma reversão em sua próxima versão, incluindo o banco de dados. Esse único exercício tende a revelar o que realmente precisa ser consertado.

Perguntas frequentes

Qual é a diferença entre implantação azul-verde e canário?

Azul-verde alterna todo o tráfego de um ambiente completo para outro de uma só vez. Canary envia uma pequena parcela do tráfego para a nova versão e a expande gradativamente.

O que é mais seguro, azul esverdeado ou canário?

Canary limita quantos usuários um lançamento incorreto afeta e o azul esverdeado oferece uma reversão muito rápida. A escolha mais segura depende do seu tráfego, ferramentas e monitoramento.

A implantação azul-verde é cara?

Pode ser, já que você pode executar dois ambientes completos durante um lançamento. O escalonamento automático da nuvem e o encerramento do ambiente ocioso podem reduzir o custo.

Com que porcentagem um canário deve começar?

As equipes geralmente começam com cerca de 1 a 5 por cento, desde que isso forneça tráfego suficiente para um sinal significativo. Os sistemas de baixo tráfego podem necessitar de uma parcela maior.

Como o canário e o azul-verde lidam com as alterações no banco de dados?

Geralmente com alterações compatíveis com versões anteriores, como expandir e contrair, porque ambas as versões podem compartilhar um banco de dados e devem funcionar durante a implementação.

Continue aprendendo

Trabalhe com Stack Quora

Precisa de ajuda com testes, WordPress ou SEO?

Ajudamos as equipes a fornecer software melhor e a expandir seus sites. Conte-nos no que você está trabalhando e sugeriremos um próximo passo claro.

Continue lendo

Mais guias sobre testes, IA e desenvolvimento moderno

Gostou deste artigo? Escolha um tópico e vá direto para nossos tutoriais mais recentes.

Inteligência artificial

Explicação das alucinações de IA: por que os modelos de linguagem inventam as coisas e como reduzi-las

Explicação das alucinações de IA: o que são, por que os modelos de linguagem as produzem, tipos comuns, como reduzi-las com aterramento e instruções…

Leia o artigo →
DevOps

Variáveis de ambiente explicadas: arquivos .env, segredos e configuração bem feitos

Variáveis de ambiente explicadas com exemplos de Python que executamos: leitura e configuração, por que cada valor é uma string, arquivos .env, hera…

Leia o artigo →
Desenvolvimento de software

Explicação da limitação de taxa de API: algoritmos, cabeçalhos e tratamento de erros 429

Limitação de taxa de API explicada com uma simulação que executamos: token bucket, janela fixa, janela deslizante, 429 respostas, cabeçalhos de limi…

Leia o artigo →
Automação de testes

Zombando em Python: unittest.mock, patch e os erros que fazem os testes mentirem

Zombaria em Python com unittest.mock, testado: Mock e return_value, side_effect, patch onde um nome é usado, especificação e autospec, zombaria de d…

Leia o artigo →
Teste de software

Cobertura de código explicada: cobertura de linha versus filial e o que 100% realmente significa

Cobertura de código explicada com uma execução cobertura.py real: cobertura de linha, ramal e condição, leitura de um relatório, por que 100% de cob…

Leia o artigo →
Bancos de dados e SQL

DELETE vs TRUNCATE vs DROP em SQL: diferenças, reversão e quando usar cada um

DELETE vs TRUNCATE vs DROP explicado com SQL testado: o que cada um remove, rollback, aciona, redefinição de identidade, velocidade e como PostgreSQ…

Leia o artigo →
Bancos de dados e SQL

Exibições SQL explicadas: crie, use e evite as armadilhas, com exemplos

Visualizações SQL explicadas com consultas que executamos: criação de uma visualização, resultados ao vivo, ocultação de colunas, desempenho, visual…

Leia o artigo →
Desenvolvimento de software

Interface TypeScript vs tipo: diferenças reais, testadas com o compilador

Interface TypeScript versus tipo, verificada com o compilador real: o que ambos podem fazer, o que apenas um pode fazer, mesclagem de declarações, e…

Leia o artigo →
Desenvolvimento de software

Python *args e **kwargs explicados: funções flexíveis com exemplos claros

Python *args e **kwargs explicados com o código que executamos: empacotamento e descompactação, ordem dos parâmetros, argumentos somente de palavras…

Leia o artigo →
Desenvolvimento de software

Funções Python Lambda: sintaxe, usos reais e quando não usá-los

Funções lambda do Python explicadas com o código que executamos: sintaxe, classificação com chave, mapa e filtro, fechamentos, armadilha de ligação …

Leia o artigo →
Inteligência artificial

O que são agentes de IA? Como eles funcionam, com um loop de agente simples que você pode executar

O que são agentes de IA? Um guia simples para o loop do agente, ferramentas, memória e proteções, com um pequeno loop Python que executamos, riscos …

Leia o artigo →
DevOps

Monitoramento versus observabilidade: a verdadeira diferença, com logs, métricas e rastreamentos

Explicação do monitoramento versus observabilidade: falhas conhecidas e desconhecidas, logs, métricas e rastreamentos, um passo a passo do incidente…

Leia o artigo →
DevOps

Docker Volumes vs Bind Mounts: persista os dados do contêiner da maneira certa

Volumes Docker versus montagens de ligação explicadas: por que os dados do contêiner desaparecem, volumes nomeados, montagens de ligação, tmpfs, exe…

Leia o artigo →
Automação de testes

TDD vs BDD: principais diferenças, um recurso criado de ambas as maneiras e quando usar cada um

TDD vs BDD explicado com um recurso de desconto construído em ambos os sentidos: refatoração vermelho-verde com o código que executamos, cenários da…

Leia o artigo →
Teste de software

Teste de aceitação do usuário (UAT): processo, lista de verificação e exemplos reais

Explicação do teste de aceitação do usuário: quem o executa, como ele difere do controle de qualidade, um processo de sete etapas, um modelo de caso…

Leia o artigo →
Bancos de dados e SQL

Valores SQL NULL explicados: IS NULL, COALESCE, NULLIF e as armadilhas a serem evitadas

Valores SQL NULL explicados com consultas que executamos: lógica de três valores, IS NULL, COALESCE, NULLIF, como agregações, junções e classificaçã…

Leia o artigo →
Bancos de dados e SQL

Instrução SQL CASE WHEN: sintaxe, exemplos reais e erros comuns

SQL CASE WHEN explicado com consultas que executamos: formulários simples e pesquisados, ordem de condição, pivôs com SUM, truques COUNT, classifica…

Leia o artigo →
Desenvolvimento de software

O que é JWT? JSON Web Tokens explicados com um exemplo prático

O que é JWT? JSON Web Tokens explicados: as três partes, um token construído e adulterado no código que executamos, JWT vs sessões, armazenamento, t…

Leia o artigo →
Desenvolvimento de software

Loop de eventos JavaScript explicado: pilha de chamadas, microtarefas e temporizadores com exemplos

O loop de eventos JavaScript explicado com o código que executamos: pilha de chamadas, filas de tarefas e microtarefas, por que setTimeout 0 não é i…

Leia o artigo →
Desenvolvimento de software

Geradores Python e rendimento explicado: economize memória com exemplos reais

Geradores Python e rendimento explicados com o código que executamos: como eles pausam e reiniciam, medem economia de memória, pipelines, sequências…

Leia o artigo →
Inteligência artificial

O que são incorporações? Similaridade de vetores e cossenos explicada de forma simples

O que são incorporações? Um guia em linguagem simples para vetores, similaridade de cossenos e pesquisa semântica, com um pequeno exemplo que execut…

Leia o artigo →
DevOps

Implantação azul-verde vs canário: diferenças, compensações e como escolher

Explicação da implantação azul-verde versus canário: como cada um funciona, custo, risco e reversão, agrupamento estável de usuários que testamos, m…

Leia o artigo →
Automação de testes

Testes instáveis: o que os causa e como corrigi-los para sempre

Testes instáveis explicados com demonstrações que executamos: as principais causas, como confirmar e diagnosticar uma, soluções adequadas para tempo…

Leia o artigo →
Teste de software

Teste de carga versus teste de estresse: diferenças, métricas e exemplos k6

Teste de carga versus teste de estresse explicado: o que cada um prova, testes de pico e absorção, as métricas que importam, por que as médias engan…

Leia o artigo →
Teste de software

Caso de teste versus cenário de teste: principais diferenças, exemplos e quando usar cada um

Caso de teste vs cenário de teste explicado: definições claras, uma tabela lado a lado, um recurso de redefinição de senha retirado de cenários para…

Leia o artigo →
Bancos de dados e SQL

Otimização de consultas SQL: leia planos de execução e corrija consultas lentas, com intervalos

Otimização de consulta SQL testada em um milhão de linhas: leia planos de execução, adicione os índices corretos, corrija filtros não sargáveis, use…

Leia o artigo →
Bancos de dados e SQL

SQL UNION vs UNION ALL: diferenças, exemplos e desempenho testado

SQL UNION vs UNION ALL explicado com consultas que executamos: duplicatas, as regras que ambos seguem, um bug de dados real, desempenho medido, INTE…

Leia o artigo →
Desenvolvimento de software

Tutorial da API JavaScript Fetch: GET, POST, tratamento de erros e tempos limite

Um tutorial da API JavaScript Fetch testado em um servidor local: GET e POST, por que 404 não lança, um auxiliar reutilizável, strings de consulta, …

Leia o artigo →
Desenvolvimento de software

Manipulação de arquivos Python: leitura, gravação, CSV, JSON e pathlib com exemplos

Manipulação de arquivos Python explicada com código que executamos: modos abertos, com, leitura de arquivos grandes, CSV, JSON, pathlib, arquivos bi…

Leia o artigo →
Desenvolvimento de software

Classes e objetos Python: tutorial OOP com exemplos reais

Classes e objetos Python explicados com código que executamos: __init__, métodos, atributos de classe vs instância, herança, propriedades, métodos d…

Leia o artigo →
Inteligência artificial

O que é um modelo de linguagem grande? Como funcionam os LLMs, explicado sem exageros

O que é um modelo de linguagem grande? LLMs explicados em linguagem simples: tokens, incorporações, atenção, treinamento, temperatura e janelas de c…

Leia o artigo →
DevOps

Comandos Linux para iniciantes: o guia essencial do terminal com exemplos

Comandos Linux para iniciantes, agrupados por tarefa: navegação, arquivos, visualização de logs, grep, pipes, permissões, processos e arquivos, com …

Leia o artigo →
Automação de testes

Selenium vs Playwright: principais diferenças, código comparado e qual escolher

Selenium vs Playwright comparado: arquitetura, espera, suporte a navegador e linguagem, depuração, o mesmo teste em ambas as ferramentas, conselhos …

Leia o artigo →
Teste de software

Particionamento de equivalência: técnica de design de teste explicada com exemplos resolvidos

Explicação do particionamento de equivalência: como encontrar partições válidas e inválidas, exemplos resolvidos para idades, senhas e cupons, teste…

Leia o artigo →
Teste de software

Gravidade vs Prioridade em Testes de Software: Diferenças, Matriz e Exemplos Reais

Explicação da gravidade versus prioridade em testes de software: definições claras, uma matriz de quatro vias com exemplos, escalas de nível, quem d…

Leia o artigo →
Bancos de dados e SQL

Tutorial de subconsultas SQL: tipos, subconsultas correlacionadas e EXISTS com exemplos

Um tutorial de subconsultas SQL com consultas que executamos: subconsultas escalares, IN, FROM e SELECT, subconsultas correlacionadas, EXISTS, a arm…

Leia o artigo →
Bancos de dados e SQL

Transações SQL e ACID explicados: COMMIT, ROLLBACK e níveis de isolamento

Transações SQL e ACID explicadas com uma transferência bancária que executamos: COMMIT, ROLLBACK, savepoints, locks, níveis de isolamento, leituras …

Leia o artigo →
Desenvolvimento de software

Git merge vs rebase: diferenças, exemplos e quando usar cada um

Git merge vs rebase explicado com saída real do log, uma tabela comparativa, a regra de ouro do rebase e um fluxo de trabalho seguro para equipes.

Leia o artigo →
Desenvolvimento de software

List comprehension em Python: sintaxe, exemplos e quando evitar

List comprehension em Python explicada: sintaxe, filtros, if-else, laços aninhados, tempos medidos e quando um laço for comum é a melhor escolha.

Leia o artigo →
Bancos de dados e SQL

SQL JOIN explicado com exemplos (Inner, Left, Right, Full)

Entenda os joins SQL passo a passo com tabelas e consultas de exemplo: INNER, LEFT, RIGHT, FULL, CROSS e SELF, além de erros comuns e dicas de desem…

Leia o artigo →