Arquitetura de Software • Nathan Geeksman

Como usar feature flags para deploys seguros

A gestão de mudanças no código-fonte de um sistema é uma tarefa constante e desafiadora para os desenvolvedores. Com a crescente complexidade dos sistemas de software, é cada vez mais difícil garantir que as alterações não causem problemas inesperados. Nesse contexto, surge a necessidade de encontrar estratégias eficazes para minimizar riscos durante os processos de deploy.

A gestão de mudanças no código-fonte de um sistema é uma tarefa constante e desafiadora para os desenvolvedores. Com a crescente complexidade dos sistemas de software, é cada vez mais difícil garantir que as alterações não causem problemas inesperados. Nesse contexto, surge a necessidade de encontrar estratégias eficazes para minimizar riscos durante os processos de deploy.

Feature flags (bandeiras de recursos) são uma abordagem comprovada e cada vez mais utilizada por equipes de desenvolvimento para gerenciar mudanças no código de forma segura. Essa técnica permite que as funcionalidades sejam ativadas ou desativadas dinamicamente, sem a necessidade de recompilar o código.

Neste artigo, vamos explorar como usar feature flags para deploys mais seguros e confiáveis em projetos de desenvolvimento de software. Aprenderemos sobre os benefícios dessas bandeiras, como implementá-las corretamente e como elas podem contribuir para melhorar a qualidade dos sistemas.

A motivação por trás do uso

Feature Flags, também conhecidas como Bandeiras de Recursos, são uma técnica de desenvolvimento de software que permite ativar ou desativar funcionalidades específicas no código-fonte de um sistema sem a necessidade de recompilar o código. Essas bandeiras são variáveis de configuração que podem ser alteradas em tempo real, permitindo que as funcionalidades sejam implantadas e testadas de forma isolada.

A motivação por trás do uso das Feature Flags é evitar a necessidade de fazer releases de software regulares para implantar novas funcionalidades. Com essa abordagem, os desenvolvedores podem liberar mudanças no código sem interrupções nos serviços existentes, reduzindo assim o risco de bugs ou falhas inesperadas.

As Feature Flags também permitem uma maior flexibilidade e controle sobre as funcionalidades implantadas, pois essas bandeiras podem ser ativadas ou desativadas em diferentes ambientes de desenvolvimento, testes e produção. Isso facilita a implantação de mudanças no código com base nas necessidades específicas de cada ambiente.

Além disso, a utilização de Feature Flags melhora significativamente o processo de depuração de bugs e problemas, pois permite que as alterações sejam revertidas facilmente caso algo não funcione como esperado. Isso reduz o tempo necessário para a identificação e resolução de problemas críticos.

Com Feature Flags, os desenvolvedores podem melhorar a qualidade dos sistemas implementando mudanças de forma mais segura, confiável e eficaz.

A utilização na prática

A utilização de Feature Flags envolve uma série de etapas para implantar e gerenciar bandeiras de recursos no sistema.

  • A criação das bandeiras: As Feature Flags são criadas com um nome único e identificador, que é associado a uma funcionalidade específica do código.
  • Integração com o sistema: As bandeiras são integradas ao sistema através da configuração de variáveis de ambiente ou do uso de bibliotecas de gerenciamento de flags.
  • Ativação e desativação: As bandeiras podem ser ativadas ou desativadas em diferentes ambientes, como desenvolvimento, testes e produção.
  • Controle de acesso: O controle de acesso às bandeiras pode ser feito por meio de permissões ou tokens específicos para cada usuário ou grupo.

Em termos técnicos, as Feature Flags funcionam como variáveis booleanas que indicam a presença ou ausência de uma funcionalidade. Quando a bandeira é ativada, o sistema executa a lógica associada à funcionalidade, e quando desativada, a lógica é ignorada.

Além disso, as Feature Flags podem ser integradas com ferramentas de monitoramento e log para ajudar no processo de depuração e análise de problemas.

Exemplo de aplicação

Aqui está um exemplo de como usar Feature Flags em uma aplicação Java Spring Boot:

// Criação das bandeiras:
public enum FeatureFlag {
    // Ativar a funcionalidade de busca avançada
    BUSCA_AVANÇADA,
    
    // Desativar a funcionalidade de notificação por e-mail
    NOTIFICACAO_EMAIL;
}

// Integração com o sistema:
@Configuration
public class ApplicationConfig implements EnvironmentAware {
    
    @Override
    public void setEnvironment(Environment environment) {
        // Ativar a bandeira de busca avançada apenas no ambiente produção
        if (environment.getProperty("spring.profiles.active").equals("prod")) {
            System.setProperty("feature.flag.BUSCA_AVANÇADA", "true");
        } else {
            System.setProperty("feature.flag.BUSCA_AVANÇADA", "false");
        }
    }
}

// Ativação e desativação:
@RestController
public class MyController {
    
    @GetMapping("/busca-avançada")
    public String buscaAvancada() {
        // Verificar se a bandeira está ativada
        if (System.getProperty("feature.flag.BUSCA_AVANÇADA").equals("true")) {
            // Executar a lógica de busca avançada
            return buscarAvancado();
        } else {
            // Ignorar a solicitação
            return "A funcionalidade de busca avançada está desativada.";
        }
    }
    
    private String buscarAvancado() {
        // Implementação da lógica de busca avançada
        return "Resultados da busca avançada";
    }
}

Nesse exemplo, a bandeira BUSCA_AVANÇADA é criada com o nome único e identificador BUSCA_AVANÇADA. A integração com o sistema é feita através da configuração de variáveis de ambiente no método setEnvironment. A ativação e desativação da bandeira são realizadas na classe MyController, onde a lógica associada à funcionalidade de busca avançada é executada apenas quando a bandeira está ativada.

Dicas

Utilize um gerenciador de bandeiras

  • Utilize uma biblioteca ou framework de gerenciamento de bandeiras, como Feature Toggle ou Flagsmith, para simplificar a gestão das bandeiras e evitar erros manuais.
  • Isso pode incluir automatização do deployment da configuração das bandeiras.

Defina nomes significativos

  • Use nomes únicos e descritivos para as bandeiras, facilitando a compreensão da funcionalidade associada a cada uma delas.
  • Certifique-se de que os nomes estejam em inglês ou outra língua padrão para evitar problemas de comunicação.

Utilize uma abordagem escalável

  • Planeje sua estrutura de bandeiras e configuração com antecedência, considerando o crescimento futuro da aplicação.
  • Evite a criação de bandeiras isoladas que não estejam associadas à nenhuma funcionalidade, pois podem causar confusão.

Utilize logging

  • Habilite log de bandeira para entender qual está ativada e qual desativada em tempo real.
  • Isso também permite a identificação dos possíveis problemas que possam estar ocorrendo com a configuração das bandeiras.

Deprecação de código

  • Evite deixar o código funcional de forma que permaneça ativado após desativação da bandeira.
  • Quando uma bandeira é desativada, certifique-se de refatorar o código para não mais depender dela.

Bloat de configurações

  • Lembre-se de remover ou reutilizar as bandeiras quando a funcionalidade associada for obsoleta ou reescrita.
  • Isso ajuda na manutenção da aplicação e evita a acumulação de bandeiras desatualizadas.

Problemas de concorrência

  • Certifique-se de que o gerenciamento das bandeiras seja thread-safe para evitar problemas de concorrência.
  • Isso é especialmente importante em ambientes com alta atividade ou execução de tarefas assíncronas.

Em resumo...

O uso de feature flags é uma abordagem eficaz para realizar deploys seguros, permitindo a ativação ou desativação de funcionalidades específicas em tempo real. Ao definir nomes significativos e planejar uma estrutura escalável, é possível evitar problemas como a depreciação do código, o bloat de configurações e os problemas de concorrência.

Para garantir um sucesso contínuo na implementação de feature flags, certifique-se de:

  • Monitorar constantemente as bandeiras ativas e desativas para garantir que elas sejam utilizadas como intencionado.
  • Estabelecer políticas claras para a criação, edição e remoção das bandeiras.
  • Fornecer documentação adequada para os desenvolvedores sobre o uso correto das feature flags.

Além disso, é fundamental considerar áreas relacionadas, como:

  • Integração contínua e entrega contínua: use ferramentas de CI/CD para automatizar a compilação, teste e implantação do código.
  • Aprendizado contínuo: monitore o desempenho da aplicação e faça ajustes no uso das feature flags com base nos dados coletados.

Ao seguir essas diretrizes e considerar as áreas relacionadas, é possível garantir que a implementação de feature flags seja eficaz e contribua para a entrega de deploys mais seguros e escaláveis.

Referências

  • Fowler, M. Feature Toggles. Disponível em: https://martinfowler.com/articles/feature-toggles.html. Acesso: 2024.
  • TOGAF. Modularização de aplicativos. Disponível em: https://pubs.opengroup.org/togaf/. Acesso: 2024.
  • Martin, C., Fowler, M. Práticas de desenvolvimento ágil para construção de software. Disponível em: https://www.amazon.com.br/Pr%C3%A1ticas-desenvolvimento-%C3%A1gil-construo-brutalidade-Cristian-Marti/dp/8573042925/. Acesso: 2024.
  • ThoughtWorks. Diversão e Prática de Modularização. Disponível em: https://www.thoughtworks.com/pt/insights/blog/modularization-practice-entertainment. Acesso: 2024.
  • Amazon Web Services. Feature Management com AWS CodePipeline. Disponível em: https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-feature-management.html. Acesso: 2024.