Twelve-Factor Apps: Boas Práticas para Desenvolvedores .NET (parte 2)
Continuando o post anterior (link)….
4. Backing Services (Serviços de Apoio)
O que são?
Serviços de apoio são recursos externos que sua aplicação usa, como bancos de dados, filas de mensagens ou serviços de cache. O conceito aqui é tratar esses serviços como recursos anexados, que podem ser substituídos sem alterações no código.
Como aplicar em .NET?
- Use conexões configuráveis para serviços externos.
- Utilize interfaces para implementar o uso destes serviços de forma que facilitem a troca caso seja necessário (exemplo: a troca de um serviço de cache in-memory por redis cache, ou de um banco sql por um no-sql).
- Armazene as credenciais e URLs desses serviços em variáveis de ambiente.
Exemplo:
var dbConnectionString = Environment.GetEnvironmentVariable("DB_CONNECTION_STRING");
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(dbConnectionString));Benefício: Trocar um banco de dados local por um banco em nuvem (ex: Azure SQL) não exigirá mudanças no código, apenas na configuração.
5. Build, Release, Run (Separação de Estágios)
O que é?
O processo de construção, liberação e execução deve ser claramente separado. Cada release deve ter um identificador único, e você deve ser capaz de fazer rollback facilmente.
Como aplicar em .NET?
- Use ferramentas como Azure DevOps ou GitHub Actions para automatizar o pipeline de CI/CD.
- Crie builds e releases com identificadores únicos (ex: versões ou timestamps).
Exemplo de pipeline no Azure DevOps:
- task: UseDotNet@2
inputs:
packageType: 'sdk'
version: '6.x'
- script: dotnet publish -c Release -o $(Build.ArtifactStagingDirectory)Benefício: Você pode implantar novas versões com confiança e reverter para uma versão anterior em caso de problemas
7. Port Binding (Vinculação de Porta)
O que é?
A aplicação deve ser auto-contida e expor sua própria porta, sem depender de servidores web externos.
Como aplicar em .NET?
- Use o Kestrel, o servidor web embutido no ASP.NET Core, para expor a aplicação diretamente.
- Configure a porta via variáveis de ambiente.
Exemplo:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>()
.UseUrls("http://*:5000");
});Benefício: Sua aplicação pode ser executada em qualquer ambiente sem depender de um servidor web específico.
8. Concurrency (Concorrência)
O que é?
A aplicação deve ser projetada para escalar horizontalmente, lidando com múltiplas instâncias rodando em paralelo.
Prepare as suas aplicações para serem executadas em várias instâncias.
Utilize Web-Api´s e Worker Services sem armazenamento de estado.
Como aplicar em .NET?
- Projete sua aplicação para ser stateless.
- Substitua “in-memory” cache por um cache distribuído para manter suas informações (ex: Redis Cache)
- Use filas de mensagens (ex: Azure Service Bus ou RabbitMQ) para processar tarefas em segundo plano e consuma utilizando Worker Services.
Veja o que são: Worker Services no .NET ! O que são ? para que servem ? Onde habitam? | by Marcio Nizzola | Medium
Benefício: Você pode escalar sua aplicação horizontalmente, adicionando mais instâncias conforme a demanda.
9. Disposability (Descartabilidade)
O que é?
Processos devem ser descartáveis, ou seja, podem ser iniciados e parados rapidamente, sem impactar a aplicação.
Como aplicar em .NET?
- Implemente shutdowns graciosos para garantir que a aplicação finalize tarefas pendentes antes de parar.
- Use o IHostApplicationLifetime para gerenciar o ciclo de vida da aplicação.
Exemplo:
public class Worker : IHostedService
{
private readonly IHostApplicationLifetime _appLifetime;
public Worker(IHostApplicationLifetime appLifetime)
{
_appLifetime = appLifetime;
}
public Task StartAsync(CancellationToken cancellationToken)
{
_appLifetime.ApplicationStopping.Register(OnStopping);
return Task.CompletedTask;
}
private void OnStopping()
{
// Finalizar tarefas pendentes
}
}Benefício: Sua aplicação pode ser reiniciada ou escalada sem causar problemas.
10. Dev/Prod Parity (Paridade entre Desenvolvimento e Produção)
O que é?
As diferenças entre os ambientes de desenvolvimento e produção devem ser mínimas.
Como aplicar em .NET?
- Use containers (Docker) para garantir que o ambiente seja consistente em todas as etapas.
- Use o mesmo tipo de banco de dados e serviços externos em todos os ambientes, com a mesma estrutura de tabelas, versão do serviço, etc.
Exemplo de docker-compose.yml:
version: '3.4'
services:
web:
image: myapp
environment:
- DB_CONNECTION_STRING=Server=db;Database=myapp;User=sa;Password=Password123;
db:
image: mcr.microsoft.com/mssql/server:2019-latest
environment:
- SA_PASSWORD=Password123
- ACCEPT_EULA=YBenefício: Reduz o risco de problemas ao implantar em produção.
12. Admin Processes (Processos Administrativos)
O que é?
Tarefas administrativas (ex: migrações de banco de dados) devem ser executadas como processos one-off no mesmo ambiente da aplicação.
Como aplicar em .NET?
- Use comandos CLI para executar tarefas administrativas.
- Exemplo: Migrações com o Entity Framework Core:
dotnet ef database updateOu crie comandos personalizados com o .NET CLI:
public class Program
{
public static void Main(string[] args)
{
if (args.Contains("--migrate"))
{
MigrateDatabase();
return;
}
CreateHostBuilder(args).Build().Run();
}
private static void MigrateDatabase()
{
// Lógica de migração
}
}Benefício: Tarefas administrativas são executadas de forma consistente e segura.
Conclusão
Ao seguir os Twelve-Factor Apps, você estará construindo aplicações .NET mais robustas, escaláveis e fáceis de manter. Esses princípios se alinham perfeitamente com as ferramentas e práticas modernas, como Docker, ASP.NET Core e Azure.
Se você ainda não adotou esses conceitos, comece aos poucos, aplicando um fator de cada vez. Com o tempo, você verá como sua aplicação se torna mais adaptável e pronta para os desafios do desenvolvimento moderno.
Esperem a parte 3 onde irei compartilhar uma planilha que permite medir o percentual de aderência da sua aplicação.
Referências
Cloud Computing + Boas Práticas em Aplicações: Twelve-Factor App | by Renato Groffe | Medium
