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.
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:
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.
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
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 {}
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)
}
}
}
Depois só executar o comando
$ 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'
Veremos o seguinte resultado:
HTTP Status Code - 200 OK
{
"enabled": true
}
Vimos que ela realmente está ligada, vamos desligar e testar novamente:
A flag está desligada, solicitando a requisição novamente:
HTTP Status Code - 200 OK
{
"enabled": false
}
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)