9 min leitura • Guide 797 of 877
Feature Flags e Rollout Progressivo
Feature flags separam implantação de lançamento. GitScrum ajuda equipes a rastrear funcionalidades sinalizadas e coordenar rollouts progressivos.
Conceitos Básicos de Feature Flags
Por Que Feature Flags
BENEFÍCIOS DOS FEATURE FLAGS:
┌─────────────────────────────────────────────────────────────┐
│ │
│ SEM FLAGS: │
│ ────────── │
│ Implantar = Lançar │
│ Todos usuários recebem funcionalidade imediatamente │
│ Rollback requer nova implantação │
│ Risco de big bang │
│ │
│ COM FLAGS: │
│ ────────── │
│ Implantar ≠ Lançar │
│ Ativar quando pronto │
│ Desativar instantaneamente se houver problemas │
│ Rollout gradual possível │
│ │
│ ─────────────────────────────────────────────────────────── │
│ │
│ CASOS DE USO DE FLAGS: │
│ │
│ INTERRUPTORES DE LANÇAMENTO: │
│ Implantar funcionalidade incompleta, ativar quando pronta │
│ "Ship dark" - código em prod mas desativado │
│ │
│ INTERRUPTORES DE EXPERIMENTO: │
│ Testes A/B de funcionalidades │
│ Comparar métricas entre variantes │
│ │
│ INTERRUPTORES DE OPS: │
│ Kill switch para funcionalidades problemáticas │
│ Degradação graciosa │
│ │
│ INTERRUPTORES DE PERMISSÃO: │
│ Funcionalidades premium para usuários pagantes │
│ Funcionalidades beta para early adopters │
│ │
│ ─────────────────────────────────────────────────────────── │
│ │
│ EXEMPLO DE CÓDIGO: │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ if (featureFlags.isEnabled('new-search')) { ││
│ │ return <NewSearchComponent />; ││
│ │ } ││
│ │ return <OldSearchComponent />; ││
│ └─────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘
Rollout Progressivo
Estratégia de Rollout
ESTÁGIOS DE ROLLOUT PROGRESSIVO:
┌─────────────────────────────────────────────────────────────┐
│ │
│ ESTÁGIO 1: INTERNO (0.1%) │
│ ────────────────────────── │
│ • Apenas equipe de desenvolvimento │
│ • Capturar problemas óbvios │
│ • Duração: 1-2 dias │
│ │
│ ESTÁGIO 2: FUNCIONÁRIOS (1%) │
│ ─────────────────────────── │
│ • Todos funcionários da empresa │
│ • Teste no mundo real │
│ • Duração: 1-3 dias │
│ │
│ ESTÁGIO 3: USUÁRIOS BETA (5%) │
│ ─────────────────────────── │
│ • Early adopters que optaram │
│ • Coletar feedback │
│ • Duração: 3-5 dias │
│ │
│ ESTÁGIO 4: CANARY (10%) │
│ ─────────────────────── │
│ • Amostra aleatória de usuários │
│ • Monitorar métricas │
│ • Duração: 2-3 dias │
│ │
│ ESTÁGIO 5: PARCIAL (25%, 50%) │
│ ──────────────────────────── │
│ • População maior │
│ • Confirmar em escala │
│ • Duração: 1-2 dias cada │
│ │
│ ESTÁGIO 6: ROLLOUT COMPLETO (100%) │
│ ──────────────────────────────── │
│ • Todos usuários │
│ • Continuar monitorando │
│ • Remover flag após estabilizar │
│ │
│ ─────────────────────────────────────────────────────────── │
│ │
│ EM CADA ESTÁGIO: │
│ • Monitorar taxas de erro │
│ • Observar métricas de performance │
│ • Coletar feedback de usuários │
│ • Pronto para pausar ou fazer rollback │
└─────────────────────────────────────────────────────────────┘
Rastreamento de Rollout
RASTREAMENTO DE ROLLOUTS:
┌─────────────────────────────────────────────────────────────┐
│ │
│ TAREFA DE FEATURE FLAG: │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ FLAG-012: Rollout de Nova Experiência de Busca ││
│ │ ││
│ │ NOME DO FLAG: new-search-experience ││
│ │ CRIADO: 10 Jan 2025 ││
│ │ RESPONSÁVEL: @product-lead ││
│ │ ││
│ │ PLANO DE ROLLOUT: ││
│ │ ☑ 12 Jan: Interno (0.1%) ││
│ │ ☑ 14 Jan: Funcionários (1%) ││
│ │ ☑ 17 Jan: Usuários beta (5%) ││
│ │ ☑ 20 Jan: Canary (10%) ││
│ │ ☐ 22 Jan: 25% (aguardando aprovação) ││
│ │ ☐ 24 Jan: 50% ││
│ │ ☐ 27 Jan: 100% ││
│ │ ☐ 10 Feb: Remover flag ││
│ │ ││
│ │ MÉTRICAS PARA OBSERVAR: ││
│ │ • Latência de busca (p95 < 200ms) ││
│ │ • Taxa de cliques (≥ baseline) ││
│ │ • Taxa de erro (< 0.1%) ││
│ │ ││
│ │ STATUS ATUAL: Rollout 10% ││
│ │ Métricas: Todas verdes ✅ ││
│ │ ││
│ │ GATILHO DE ROLLBACK: ││
│ │ • Taxa de erro > 1% ││
│ │ • Latência p95 > 500ms ││
│ │ • CTR cai > 20% ││
│ └─────────────────────────────────────────────────────────┘│
│ │
│ VERIFICAÇÃO DIÁRIA: │
│ • Métricas estão dentro dos limites? │
│ • Há reclamações de usuários? │
│ • Pronto para próximo estágio? │
└─────────────────────────────────────────────────────────────┘
Gerenciamento de Flags
Ciclo de Vida de Flags
CICLO DE VIDA DE FEATURE FLAGS:
┌─────────────────────────────────────────────────────────────┐
│ │
│ ESTÁGIOS DO CICLO DE VIDA: │
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ CRIAR │──→│ ROLLOUT │──→│ ESTÁVEL │──→│ REMOVER │ │
│ │ │ │ │ │ │ │ │ │
│ │ Flag │ │ 0%→100% │ │ 100% │ │ Código │ │
│ │ definido│ │ monitor │ │ confirmar│ │ │ │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
│ │
│ ─────────────────────────────────────────────────────────── │
│ │
│ DOCUMENTAÇÃO DE FLAGS: │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ REGISTRO DE FLAGS ││
│ │ ││
│ │ FLAG PROPÓSITO STATUS DONO ││
│ │ ──── ───────── ────── ───── ││
│ │ new-search Toggle lançamento Rollout @alex ││
│ │ dark-mode Toggle lançamento 100% @jordan││
│ │ premium-export Permissão Ativo @sam ││
│ │ experimental-ai Experimento 5% @pat ││
│ │ kill-notifications Toggle ops Pronto @ops ││
│ │ ││
│ │ LIMPEZA NECESSÁRIA: ││
│ │ • old-checkout: 100% por 30 dias → remover ⚠️ ││
│ │ • beta-dashboard: 100% por 60 dias → remover 🔴 ││
│ └─────────────────────────────────────────────────────────┘│
│ │
│ REGRAS DE LIMPEZA: │
│ ───────────────── │
│ • Flag em 100% por 2+ semanas → Agendar remoção │
│ • Flag em 0% por 4+ semanas → Considerar exclusão │
│ • Criar tarefa de limpeza quando flag atingir 100% │
│ • Revisar inventário de flags mensalmente │
└─────────────────────────────────────────────────────────────┘
Evitando Dívida Técnica
HIGIENE DE FLAGS:
┌─────────────────────────────────────────────────────────────┐
│ │
│ O PROBLEMA: │
│ ─────────── │
│ Flags se acumulam se não limpos │
│ Código fica confuso com muitas ramificações │
│ "Qual caminho de código está realmente executando?" │
│ │
│ PREVENÇÃO: │
│ ────────── │
│ │
│ DATAS DE EXPIRAÇÃO: │
│ Todo flag tem data planejada de remoção │
│ Definir ao criar flag │
│ Tarefa criada para limpeza │
│ │
│ LIMITES DE FLAGS: │
│ Máximo 20 flags ativos por serviço │
│ Deve remover um para adicionar um (no limite) │
│ │
│ REVISÃO REGULAR: │
│ Revisão mensal do inventário de flags │
│ "Quais flags podemos remover?" │
│ │
│ ─────────────────────────────────────────────────────────── │
│ │
│ TAREFA DE LIMPEZA: │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ TECH-045: Remover flag new-search ││
│ │ ││
│ │ FLAG: new-search-experience ││
│ │ STATUS: 100% por 3 semanas ││
│ │ ESTÁVEL: Sim, todas métricas normais ││
│ │ ││
│ │ TAREFAS: ││
│ │ ☐ Remover verificações de feature flag do código ││
│ │ ☐ Remover caminho de código antigo ││
│ │ ☐ Remover flag da configuração ││
│ │ ☐ Atualizar testes ││
│ │ ☐ Implantar e verificar ││
│ │ ││
│ │ ESTIMATIVA: 2 pontos ││
│ │ PRIORIDADE: Média (dívida técnica) ││
│ └─────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘
Procedimentos de Rollback
Lidando com Problemas
PROCESSO DE ROLLBACK:
┌─────────────────────────────────────────────────────────────┐
│ │
│ QUANDO FAZER ROLLBACK: │
│ ────────────────────── │
│ • Taxa de erro excede limite │
│ • Degradação de performance │
│ • Reclamações críticas de usuários │
│ • Problema de segurança descoberto │
│ │
│ COMO FAZER ROLLBACK: │
│ ───────────────────── │
│ 1. Definir flag para 0% │
│ 2. Verificar comportamento antigo restaurado │
│ 3. Notificar equipe │
│ 4. Investigar problema │
│ │
│ ─────────────────────────────────────────────────────────── │
│ │
│ TAREFA DE ROLLBACK: │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ INCIDENTE: Nova busca causando erros de timeout ││
│ │ ││
│ │ DETECTADO: 20 Jan, 14:15 ││
│ │ Taxa de erro: 5% (limite: 1%) ││
│ │ ││
│ │ AÇÃO TOMADA: ││
│ │ 14:17 - Flag definido para 0% ││
│ │ 14:18 - Taxa de erro retornando ao normal ││
│ │ 14:20 - Confirmado todo tráfego no caminho antigo ││
│ │ ││
│ │ ACOMPANHAMENTO: ││
│ │ ☐ Análise de causa raiz ││
│ │ ☐ Corrigir problema identificado ││
│ │ ☐ Adicionar teste para prevenir regressão ││
│ │ ☐ Replanejar rollout ││
│ │ ││
│ │ CAUSA RAIZ: ││
│ │ Query de banco não otimizada para carga de 10% ││
│ │ Precisa de índice antes de retomar rollout ││
│ └─────────────────────────────────────────────────────────┘│
│ │
│ CHAVE: Rollback NÃO é falha │
│ É o sistema funcionando como projetado │
│ Melhor capturar problemas cedo │
└─────────────────────────────────────────────────────────────┘