Skip to main content

12 Fatores na Construção de um Aplicativo Web

The Twelve-Factor App é um conjunto de recomendações muito popular para desenvolvimento de aplicações web, que é resultado de anos de experiência do pessoal da Heroku na administração de centenas de milhares de aplicações na forma de software-como-serviço.

Os 12 fatores é um conjunto de soluções conceituais que visa tornar as aplicações mais portáveis, escaláveis e fáceis de serem desenvolvidas e implantadas. Pode ser aplicado a projetos escritos em qualquer linguagem de programação.

12 Fatores

Base de Código

O código do projeto deve estar em um repositório de um controle de versão tal como o Git, Subversion ou Mercurial. E deve haver apenas um projeto por repositório. Todas as implantações do projeto devem partir desse mesmo repositório. Tudo bem usar ramos para manter variações do mesmo projeto, mas não diferentes repositórios.

Nível de importância: Fundamental. Não dá pra trabalhar de outra forma.

Dependências

Toda aplicação não trivial precisa usar software de terceiros. No entanto, essas dependências externas devem ficar explícitas e serem controladas através de um gerenciador de pacotes, que existem comumente em várias linguagens, tal como o Pipenv no Python e o npm para Node.js.

Mesmo ferramentas do sistema que forem usadas pela aplicação, tal como curl por exemplo, devem ser gerenciadas de alguma forma para garantir sua disponibilidade.

Nível de importância: Alto. Dependências externas podem se tornar um pesadelo se não forem gerenciadas corretamente.

Configurações

Configuração é a parte do projeto que varia conforme o ambiente que está sendo usado. O código-fonte é a parte que não varia.

Por exemplo, a parte da aplicação que lida com o banco de dados é sempre a mesma, mas a localização do banco de dados varia entre um ambiente de desenvolvimento e o de produção.

Senha de acesso é outro exemplo. O usuário e a senha de um banco de dados são diferentes em desenvolvimento e em produção, mas, em ambos os casos, o código-fonte que obtém a conexão é o mesmo.

A recomendação é que a configuração deve ser obtida durante a execução da aplicação a partir de variáveis de ambiente. Não deve ser mantida no controle de versão de modo algum porque representa risco à segurança (no caso de senhas, por exemplo) ou porque atrapalhariam o trabalho em equipe, quando a configuração pessoal de uma pessoa entra em conflito com a de outra.

Nível de importância: Alto. Com a virtualização dos ambientes, a configuração da aplicação ficou mais simples, mas ainda necessária.

Serviços de Apoio

Um serviço de apoio é qualquer serviço que a aplicação consome via rede como parte de sua operação normal, tais como banco de dados, sistemas de mensagens/filas e cache e serviços de SMTP para email.

Serviços de apoio devem ser desacoplados da aplicação, de modo que possam ser substituídos facilmente através de alterações na configuração, como a substituição de uma URL por exemplo.

Nível de importância: Alto. Torna a aplicação mais simples de configurar e manter.

Construir, Lançar e Executar

A construção transforma a configuração de uma revisão do repositório em algo pronto pra ser executado. O lançamento envia esse pacote a um servidor específico junto com as configurações necessárias para esse ambiente e a aplicação pode rodar nesses servidores.

A ideia é que o processo de lançamento seja o mais automatizado possível para que ocorra sem surpresas e sem intervenção manual nos últimos estágios. Isso significa que não deve ser permitido fazer alterações diretamente no ambiente de produção.

Nível de importância: Conceitual. Integração, entrega e implantação contínuas são desejáveis e indicam maturidade do processo de desenvolvimento, mas não são essenciais.

Processos

Algumas aplicações rodam em vários servidores para serem mais tolerante a falhas ou simplesmente para lidar com mais tráfego.

Os processos devem ser stateless, isto é, o estado de cada transação não é definido no processo em si, mas sim por um registro armazenado em um banco de dados ou outro local de armazenamento compartilhado entre os processos.

Nível de importância: Alto. Aplicações stateless são mais robustas e fáceis de gerenciar.

Vínculo de Portas

Da mesma forma que os serviços de apoio são acessados por uma URL, sua aplicação também deve poder ser acessada por outros da mesma forma.

Nível de importância: Médio. Geralmente isso é obtido automaticamente quando a aplicação é fornecida através de um servidor web.

Concorrência

Sua aplicação deve ser planejada para distribuir sua carga em processos independentes. Desse modo, a capacidade de processamento pode ser escalado implantando mais cópias da aplicação (mais processos) em mais servidores ao invés de tentar fazer a aplicação maior, isto é, rodar uma única instância em uma máquina maior.

Nível de importância: Baixa. A escalabilidade é uma preocupação para aplicações que já conseguiram um grande nível de sucesso. A prioridade inicial é conseguir esse sucesso e não a escalabilidade em si.

Descartabilidade

A aplicação deve ser projetada para começar rapidamente e encerrar graciosamente. Deve ser capaz de começar a processar o quanto antes quando for iniciada. Quando for encerrada, deve deixar o sistema em um estado correto, lidando com casos de encerramento normais, tal como o recebimento de um sinal SIGTERM, até os casos de encerramentos bruscos.

Nível de importância: Médio. Depende do grau de escalabilidade necessário da aplicação.

Paridade entre Desenvolvimento e Produção

Os ambientes de desenvolvimento, homologação e produção devem ser tão similares quanto possível. Segundo os 12 fatores, o processo de desenvolvimento deve visar a implantação contínua.

Nível de importância: Alto. Além de importante por melhorar a qualidade e a velocidade do desenvolvimento, atualmente é fácil de manter esses ambientes mais próximos com o uso de containers.

Logs

Logs são uma fonte importante de informações sobre o funcionamento de uma aplicação. A sugestão aqui é enviar os registros de log diretamente pra saída stdout. Caberá ao ambiente de execução (homologação ou produção) capturar essa saída e direcionar para um destino mais adequado para visualização e registro.

Nível de importância: Alto. É possível e desejável extrair informações importantes do log tais como tendências, heurísticas e alertas.

Processos Administrativos

Processos administrativos, tais como a migração de um banco de dados, também fazem parte da aplicação e devem ser entregues junto com o resto do sistema.

Devem rodar a partir do mesmo ambiente da aplicação.

Nível de importância: Alto. Tarefas administrativas também devem ser consideradas parte da aplicação.

Conclusão

Os 12 fatores não são recentes e foram definidos tendo em mente as necessidades da plataforma Heroku. Ainda assim, fornecem um bom conjunto de diretrizes que deve ser seguido no desenvolvimento de aplicações web modernas que rodam na nuvem para que sejam escaláveis, robustas e confiáveis.

Referências

Comments

Comments powered by Disqus