Feature Flags
DevOps
Deploy
Continuous Delivery
Monitoramento

Implementando Feature Flags e Rollouts Graduais em Produção

Feature flags são uma poderosa técnica que permite controlar a disponibilidade de funcionalidades em tempo real. Vamos explorar como implementá-las de forma efetiva em seu ambiente de produção.

O que são Feature Flags?

Feature flags (ou feature toggles) são mecanismos que permitem:

  • Ativar/desativar funcionalidades sem deploy
  • Testar features com usuários específicos
  • Fazer rollbacks rápidos em caso de problemas
  • Implementar rollouts graduais

Tipos de Feature Flags

1. Por Ambiente

interface EnvironmentFlag { name: string; environments: { development: boolean; staging: boolean; production: boolean; }; default: boolean; }

2. Por Usuário

interface UserFlag { name: string; type: 'percentage' | 'specific' | 'custom'; rules: { percentage?: number; userIds?: string[]; customRule?: (user: User) => boolean; }; }

Implementação Prática

1. Estrutura Base

class FeatureFlagManager { private flags: Map<string, FeatureFlag>; constructor() { this.flags = new Map(); } isEnabled(flagName: string, context: FlagContext): boolean { const flag = this.flags.get(flagName); if (!flag) return false; return flag.evaluate(context); } async updateFlag(flagName: string, config: FlagConfig): Promise<void> { // Implementação da atualização } }

2. Integração com Backend

// Exemplo com Express app.use(async (req, res, next) => { const context = { userId: req.user?.id, environment: process.env.NODE_ENV, timestamp: Date.now() }; req.featureFlags = await featureFlagManager.getFlags(context); next(); });

Rollouts Graduais

1. Estratégias de Rollout

Um rollout gradual avança em estágios, ampliando a exposição à medida que a confiança aumenta. Uma progressão típica parte da feature pronta e segue assim:

  1. 5%, usuários beta, o primeiro grupo a receber a novidade.
  2. 25%, usuários ativos, com a feature já validada no grupo inicial.
  3. 50%, maioria dos usuários.
  4. 100%, disponibilização para toda a base.

Cada salto só acontece depois que as métricas do estágio anterior confirmam estabilidade.

2. Monitoramento

interface RolloutMetrics { flagName: string; totalUsers: number; enabledUsers: number; errorRate: number; performanceMetrics: { responseTime: number; errorCount: number; }; }

Ferramentas e Serviços

1. Self-hosted

  • 🏠 Unleash

    • Open source
    • Controle total
    • API REST
    • Dashboard
  • 🏢 Flagsmith

    • SDKs para várias linguagens
    • A/B testing
    • Analytics

2. Cloud-based

  • ☁️ LaunchDarkly

    • Gerenciamento centralizado
    • Analytics avançados
    • Integrações prontas
  • 🌐 Split.io

    • Experimentação
    • Segmentação avançada
    • Monitoramento em tempo real

Boas Práticas

1. Nomenclatura

// Exemplos de nomes claros const FLAGS = { NEW_CHECKOUT_FLOW: 'new-checkout-flow-v2', DARK_MODE_BETA: 'dark-mode-beta-test', PAYMENT_GATEWAY_MIGRATION: 'payment-gateway-migration' };

2. Documentação

Cada flag merece uma ficha curta e padronizada. Para a new-checkout-flow-v2, por exemplo, a documentação cobriria:

  • Descrição: implementação da nova versão do fluxo de checkout.
  • Estados: Development habilitado, Staging habilitado, Production em rollout gradual (25%).
  • Dependências: Payment Gateway v2 e Address Validation Service.
  • Plano de rollout: 5% (beta), 25% (ativos), 50% (maioria), 100% (todos).

Esse registro evita que flags se tornem dívida técnica esquecida e dá contexto a quem precisa decidir avançar ou remover a flag.

Monitoramento e Alertas

1. Métricas Essenciais

interface FlagMetrics { name: string; enabledCount: number; totalRequests: number; errorRate: number; performanceImpact: { p50: number; p95: number; p99: number; }; }

2. Alertas

alerts: - name: high_error_rate condition: error_rate > 1% action: disable_flag - name: performance_degradation condition: p95 > 500ms action: notify_team

Casos de Uso

1. Rollout Seguro

O ciclo de um rollout seguro fecha um laço de feedback entre quatro atores. O desenvolvedor ativa a flag para uma fração inicial dos usuários (5%). A feature flag passa a alimentar o sistema de monitoramento com métricas de uso, erro e performance. O monitoramento compara esses números com os thresholds definidos e, sempre que algum limite é ultrapassado, o sistema de alertas notifica o desenvolvedor, que decide avançar o rollout ou reverter. É esse laço contínuo que torna a entrega incremental segura.

2. Rollback Rápido

async function handleError(flagName: string, error: Error) { // Desativa flag imediatamente await featureFlagManager.disable(flagName); // Notifica equipe await notifyTeam({ type: 'FLAG_ERROR', flagName, error: error.message, timestamp: new Date() }); // Registra métricas await metrics.recordRollback(flagName); }

Conclusão

Feature flags são essenciais para:

  1. Deploy seguro
  2. Testes em produção
  3. Rollbacks rápidos
  4. Experimentos controlados
  5. Monitoramento efetivo

Próximos Passos

  1. Escolha sua ferramenta
  2. Defina padrões de nomenclatura
  3. Implemente monitoramento
  4. Crie documentação
  5. Treine o time

Quer compartilhar sua experiência com feature flags? Deixe um comentário abaixo!

Leia também

Implementando Feature Flags e Rollouts Graduais em Produção | Matheus Breguêz