
Feature Flags e Deployments Progressivos: Lançando com Segurança
Imagine lançar uma nova funcionalidade para 100 milhões de usuários e, minutos depois, descobrir um bug catastrófico. No modelo tradicional de "tudo ou nada", você entraria em pânico, correria para fazer um rollback e rezaria para que nem todos fossem afetados. Agora, imagine um cenário diferente: você libera a novidade para apenas 1% dos usuários, monitora as métricas por uma hora e, se algo der errado, aperta um botão e desliga tudo em segundos. Sem deploys de emergência, sem stress.
Essa é a promessa das Feature Flags e dos Deployments Progressivos. Mais do que meras ferramentas, essas técnicas representam uma mudança cultural profunda: a separação total entre o ato de "subir código" e o ato de "lançar uma funcionalidade". Vamos entender como gigantes como Netflix e Facebook mantêm a sanidade enquanto evoluem seus produtos em tempo real, sem nunca quebrar a experiência do usuário final.
1. O Que São Feature Flags
1.1 Conceito Fundamental
Uma feature flag (ou feature toggle) é simplesmente uma condição no código que determina se uma funcionalidade está ativa ou não. Na forma mais básica:
if (featureFlags.newCheckoutEnabled) {
showNewCheckout();
} else {
showOldCheckout();
}O poder está em quem controla o valor dessa flag. Em vez de ser uma constante no código (que requer novo deploy para mudar), o valor vem de uma configuração externa que pode ser alterada em runtime. Você pode ligar ou desligar funcionalidades sem fazer novo deploy.
1.2 Tipos de Feature Flags
Release Flags: Controlam lançamento de novas funcionalidades. São temporárias — após a feature estar estável e 100% ativada, você remove a flag do código.
Experiment Flags: Controlam testes A/B. Usuários são divididos em grupos para medir qual versão performa melhor.
Ops Flags: Permitem desligar funcionalidades que estão causando problemas em produção. "Kill switches" para emergências.
Permission Flags: Controlam acesso a funcionalidades baseado em plano (free vs premium), região, ou outros critérios de negócio.
A distinção importa porque o ciclo de vida é diferente. Release flags devem ser removidas; permission flags podem existir indefinidamente.
2. Estratégias de Rollout Progressivo
2.1 Canary Releases
O termo vem dos canários em minas de carvão: se o canário morresse, os mineiros sabiam que o ar estava tóxico. Em software, um canary release expõe a nova versão a uma pequena porcentagem de tráfego enquanto monitora métricas. Se erros aumentam, latência piora, ou métricas de negócio caem, o canary é descartado antes de afetar a maioria dos usuários.
O percentual típico começa em 1-5%, aumentando gradualmente (10%, 25%, 50%, 100%) conforme confiança cresce. Cada estágio inclui período de "soaking" (espera) para observar se problemas emergem.
2.2 Blue-Green Deployments
Blue-green é uma estratégia onde você mantém dois ambientes de produção idênticos: "blue" (versão atual) e "green" (versão nova). O load balancer aponta para blue. Você faz deploy no green, testa, e então muda o load balancer para apontar para green. Se algo der errado, reverter é instantâneo — apenas mude o load balancer de volta para blue.
A desvantagem é custo: você precisa de infraestrutura duplicada. A vantagem é simplicidade e rollback instantâneo.
2.3 Ring Deployments
Microsoft usa "ring deployments" onde usuários são organizados em anéis concêntricos. O anel interno (desenvolvedores e dogfooding) recebe primeiro. Depois, funcionários internos. Depois, usuários beta. Depois, porcentagens crescentes de usuários gerais. Isso permite que problemas sejam encontrados por audiências tolerantes antes de atingir o público geral.
3. Implementação de Feature Flags
3.1 Abordagens de Armazenamento
Configuração no Código: A forma mais simples é ter flags em arquivos de configuração que são deployados. Mudar requer novo deploy — perde a principal vantagem.
Variáveis de Ambiente: Flags como variáveis de ambiente. Permite mudança sem deploy de código (apenas restart), mas sem granularidade por usuário.
Banco de Dados/Cache: Flags armazenadas externamente (Redis, database). Permite mudanças em runtime sem restart. A aplicação consulta periodicamente ou em cada request.
Serviços Especializados: Produtos como LaunchDarkly, Split, Unleash, ou ConfigCat oferecem SDKs que gerenciam cache, fallbacks, e targeting avançado.
3.2 Targeting: Quem Vê o Quê
Flags simples são globais: ligado para todos ou desligado para todos. Flags sofisticadas permitem targeting: ativar para usuários específicos (por ID, email, ou atributos), para porcentagens (5% dos usuários), para segmentos (usuários premium, região Brasil), ou combinações complexas.
O targeting é o que permite canary releases eficazes: você não ativa para 5% aleatórios — você ativa para 5% consistentes (o mesmo usuário sempre vê a mesma versão). Isso é feito hashing o user ID junto com o flag name para determinar bucket.
3.3 Avaliação no Backend vs Frontend
Flags podem ser avaliadas no backend (mais seguro, flag decisions não expostas ao cliente) ou no frontend (mais flexível para experiências de UI). Muitos sistemas fazem ambos, com o backend servindo as decisões para o frontend consumir.
4. Boas Práticas e Armadilhas
4.1 Technical Debt de Flags
Flags não removidas se tornam dívida técnica. O código se torna cheio de condicionais, difícil de entender e testar. Release flags devem ter data de remoção planejada. Após uma feature estar 100% ativada e estável por semanas, remova a flag e o código do caminho antigo.
4.2 Testes com Flags
Flags multiplicam o espaço de estados do sistema. Se você tem 10 flags booleanas, há 1024 combinações possíveis. Testar todas é impraticável. A abordagem pragmática é testar cada flag em ambos os estados, mas não todas as combinações. Flags devem ser independentes sempre que possível.
4.3 Observabilidade
Monitore métricas segmentadas por flag: taxa de erro quando feature nova está ligada vs desligada, latência, métricas de negócio. Isso permite detectar rápido se a nova versão está causando problemas e fornece dados para decisão de rollout.
4.4 Kill Switches
Tenha flags de emergência para desligar funcionalidades problemáticas. A capacidade de desligar algo em segundos sem deploy é valiosa durante incidentes.
5. Ferramentas do Mercado
5.1 LaunchDarkly
Líder de mercado em feature flags. SDKs para todas as linguagens, targeting avançado, integração com CI/CD, analytics integrado. Preço enterprise.
5.2 Split
Forte em experimentação e testes A/B. Foco em métricas de impacto e significância estatística.
5.3 Unleash
Open source, auto-hospedável. Menos features que opções pagas, mas gratuito e controle total sobre dados.
5.4 Flagsmith
Open source com opção cloud. Bom balanço entre funcionalidades e custo.
6. Conclusão
As Feature Flags e os Deployments Progressivos transformam o "dia do lançamento" de um evento de alta tensão em uma terça-feira comum. A capacidade de separar o deploy (enviar o código) do lançamento (ativar a funcionalidade para o usuário) é o que dá aos times modernos a agilidade necessária para inovar sem comprometer a estabilidade.
Começar pode ser simples: um if/else alimentado por uma variável de ambiente já é o primeiro passo. Conforme a complexidade aumenta, as ferramentas especializadas entram em cena para oferecer o controle fino que o seu sistema exige. O segredo não está na ferramenta, mas no mindset: em um mundo onde falhas são inevitáveis, a melhor estratégia é garantir que elas aconteçam em um ambiente pequeno, controlado e fácil de reverter.
7. Apêndice A: Glossário de Termos
- Blue-Green Deployment: Estratégia com dois ambientes de produção alternando.
- Canary Release: Lançamento gradual para pequeno percentual de usuários.
- Dark Launch: Funcionalidade em produção mas não visível para usuários.
- Feature Flag/Toggle: Condição que controla ativação de funcionalidade.
- Kill Switch: Flag de emergência para desligar funcionalidade.
- Ops Flag: Flag para controle operacional em runtime.
- Release Flag: Flag temporária para controlar lançamento.
- Ring Deployment: Lançamento em anéis concêntricos de usuários.
- Rollback: Reverter para versão anterior.
- Rollout: Processo de lançamento gradual.
- Soaking: Período de espera para observar comportamento.
- Targeting: Regras que determinam quais usuários veem uma feature.
8. Apêndice B: Referências
- Fowler, M. Feature Toggles. martinfowler.com/articles/feature-toggles.html.
- Hodgson, P. Feature Toggle Types. martinfowler.com.
- LaunchDarkly Blog. Best practices for feature flags.
- Netflix Tech Blog. How we use feature flags.
- Forsgren, N., Humble, J., & Kim, G. (2018). Accelerate. IT Revolution.
- Humble, J., & Farley, D. (2010). Continuous Delivery. Addison-Wesley.
- Kim, G., et al. (2016). The DevOps Handbook. IT Revolution.
Este artigo foi desenvolvido com base em práticas da indústria e documentação técnica.
