Matheus Breguêz (matbrgz)
Implementando Feature Flags e Rollouts Graduais em Produção
Desenvolvimento

Implementando Feature Flags e Rollouts Graduais em Produção

Índice

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

graph TD
    A[Feature Pronta] -->|5%| B[Usuários Beta]
    B -->|25%| C[Usuários Ativos]
    C -->|50%| D[Maioria dos Usuários]
    D -->|100%| E[Todos os Usuários]

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

# Feature Flag: new-checkout-flow-v2

## Descrição
Implementação da nova versão do fluxo de checkout.

## Estados
- Development: ✅ Enabled
- Staging: ✅ Enabled
- Production: 🟡 Gradual (25%)

## Dependências
- Payment Gateway v2
- Address Validation Service

## Rollout Plan
1. 5% - Usuários beta
2. 25% - Usuários ativos
3. 50% - Maioria
4. 100% - Todos

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

sequenceDiagram
    participant Dev as Desenvolvedor
    participant Flag as Feature Flag
    participant Monitor as Monitoramento
    participant Alert as Sistema de Alertas
    
    Dev->>Flag: Ativa flag (5%)
    Flag->>Monitor: Coleta métricas
    Monitor->>Alert: Verifica thresholds
    Alert->>Dev: Notifica se necessário

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!

Feature Flags DevOps Deploy Continuous Delivery Monitoramento

Compartilhe este artigo

Transforme suas ideias em realidade

Vamos trabalhar juntos para criar soluções inovadoras que impulsionem seu negócio.