DEV Community

Cover image for Como implementar Feature Flags em seu Backend NestJS
José Paulo Marinho
José Paulo Marinho

Posted on

Como implementar Feature Flags em seu Backend NestJS

Antes de mais nada, estarei introduzindo o significado e o poder que as Feature Flags tem em seu software.

Imagine comigo: digamos que sua aplicação tem uma funcionalidade de pagamentos, ou validação se um usuário existe, envio de email, push notification, etc. E essa funcionalidade não está funcionando corretamente em produção, o que fazer? O que fazer quando sua aplicação está enfrentando problemas em uma determinada funcionalidade que pode ser crítica na sua aplicação?

A resposta é simples: Feature Toggle.

De acordo com a wikipedia:

Feature toggle, em português alternância de recursos (também chamado de feature switch, feature flag, feature gate, feature flipper, conditional feature etc.) é uma técnica de desenvolvimento de software que tenta fornecer uma alternativa para manter várias ramificações no código-fonte (conhecidos como ramificações de recurso), de forma que um recurso de software possa ser testado antes mesmo de ser concluído e estar pronto para o lançamento. Um alternador de recurso é usado para ocultar, habilitar ou desabilitar o recurso durante o tempo de execução.

Ou seja,a gente implementa um "liga e desliga" para uma determinada funcionalidade se ela estiver dando problemas enquanto investigamos para achar a solução, acompanhe o desenho.

Desenho arquitetura simples Pagamento

O desenho acima é bem simples, bem enxuto para representar um sistema de pagamento. O que acontece se acontece um problema entre a confirmação de pagamento do usuário e o gateway de pagamento, como por exemplo:

  • Falha de integração
  • Bugs no código(falta de homologação) devido a urgência da demanda
  • Problemas com perfomance/escalabilidade
  • Risco de fraudes/segurança

Entre muitos outros problemas que podem ocorrer. Dessa forma no desenho acima, não tem como desabilitar essa funcionalidade sem retirar totalmente a aplicação do ar. Veja esse outro desenho abaixo:

Desenho arquitetura simples Pagamento com feature toggle

No desenho acima, algumas coisas novas apareceram, nele estamos verificando se a "flag" PAGAMENTO está habilitada, se está ela segue para o fluxo padrão, do contrário finalizamos o fluxo. É literamente uma estrutura de decisão na qual pode ser alterada em TEMPO REAL sem que haja alteração no código, gerado um novo build, deploy, etc.

No desenho nota-se que aparece um cara chamando Unleash, ele será nossa ferramenta para gestão de Feature Toggles, mas você pode usar o que precisar, desde um banco de dados não relacional, um banco de dados em memória, etc.

O Unleash, é uma solução poderosa de código aberto para gerenciamento de recursos. Ele simplifica seu fluxo de trabalho de desenvolvimento, acelera a entrega de software e capacita as equipes a controlar como e quando elas lançam novos recursos para os usuários finais. Com o Unleash, você pode implantar código para produção em lançamentos menores e mais gerenciáveis ​​no seu próprio ritmo. Repositório aqui: github

Estarei executando o Unleash utilizando docker para facilitar. Não estarei ensinando a utilizar o Unleash, só como integrar em seu aplicativo NestJS.

Unleash interface

Após já configurar o ambiente do unleash, nota-se que eu criei uma flag chamada PAYMENT_IS_ENABLED, ela está habilitada em ambiente de Desenvolvimento e Produção. No unleash é necessário que você crie um token de API para continuar com o desenvolvimento. Vamos para nossa aplicação NestJS. Nosso token só permite ver se a flag está habilitada em desenvolvimento.

Para integrar nossa aplicação NestJS com o Unleash, estarei utilizando a lib @josemarinho/unleash no NPM

Para instalar a dependência, basta rodar o comando abaixo:

$ npm install @josemarinho/unleash
Enter fullscreen mode Exit fullscreen mode

Após instalação, basta configurar o módulo presente na lib no app.module.ts:

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UnleashModule } from '@josemarinho/unleash';

@Module({
  imports: [
    UnleashModule.forRoot({
      appName: 'unleash-onboarding-node',
      url: 'http://localhost:4242/api/',
      global: true,
      apiKey: 'default:development.f73da5a65c1e5c097ccaaacaa8f9eab5a27f3d8b45ea34c4d8b4b035'
    })
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
Enter fullscreen mode Exit fullscreen mode

Fiz uma controller simples, só para trazer o resultado das features flags:

import { Controller, Get, Param } from '@nestjs/common';
import { UnleashService } from '@josemarinho/unleash';

@Controller()
export class FeatureToggleController {
  constructor(private readonly featureToggleService: UnleashService) {}

  @Get(':flag')
  async getHello(@Param('flag') flag: string): Promise<any> {
    return {
        enabled: await this.featureToggleService.isEnabled(flag)
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Depois só executar o comando

$ nest start
Enter fullscreen mode Exit fullscreen mode

Run execution nest start

Vimos que todos os módulos foram iniciados corretamente e sua aplicação está pronta para gerenciar estados. Vamos testar?

Executando o comando curl abaixo:

curl --location 'localhost:3000/PAYMENT_IS_ENABLED'
Enter fullscreen mode Exit fullscreen mode

Veremos o seguinte resultado:

HTTP Status Code - 200 OK
{
    "enabled": true
}
Enter fullscreen mode Exit fullscreen mode

Vimos que ela realmente está ligada, vamos desligar e testar novamente:

Unleash interface flag desligada

A flag está desligada, solicitando a requisição novamente:

HTTP Status Code - 200 OK
{
    "enabled": false
}
Enter fullscreen mode Exit fullscreen mode

Utilizar feature toggles é uma estratégia eficiente para mitigar riscos e garantir controle em sistemas críticos. Elas permitem ativar, desativar ou ajustar funcionalidades rapidamente sem necessidade de novos deploys, reduzindo o impacto de falhas. Isso assegura maior estabilidade, flexibilidade e uma melhor experiência para o usuário.

Chegamos ao final de mais um post. Estarei deixando alguns links de referência:

Docker Unleash
Feature Toggle
Prós e Contras

Um abraço e bons estudos! Até mais.

Top comments (0)