O que são os 12 factor app? - Parte 3 \| TreinaWeb               Promoção no ar   Matricule-se agora e garanta **54% de desconto**  

  Termina em   Tempo restante da oferta: 17 Horas 

 49 Min 

 49 Seg 

   Tempo restante da oferta: 17 49 49 

  [Assinar →](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26) 

   [                ](https://www.treinaweb.com.br)  Explorar  

 [ Quanto custa? ](#assinatura) [ FAQ ](https://www.treinaweb.com.br#faq) [Matricule-se](#assinatura) [ Entrar ](https://www.treinaweb.com.br/login) 

     [ Início ](https://www.treinaweb.com.br) [ Artigos ](https://www.treinaweb.com.br/blog) O que são os 12 factor app? - Parte 3  [ Engenharia de Software ](https://www.treinaweb.com.br/blog/categoria/engenharia-de-software) 

# O que são os 12 factor app? - Parte 3

 Nesta terceira parte, iremos abordar mais três dos 12 princípios: port binding, concurrency e disposability.

 [ Marylene Guedes ](https://www.treinaweb.com.br/blog/autor/marylene-guedes) 6 anos atrás

  ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/03/TWELVE-FACTOR-APP.png)  

Nos [artigos anteriores](https://www.treinaweb.com.br/busca?source=blog&q=12+factor+app "artigos anteriores"), começamos a compreender o que são os 12 factor app. Trata-se de uma série de princípios estabelecidos por uma equipe de desenvolvedores da [Heroku](https://www.heroku.com/ "Heroku") para nortear o desenvolvimento de aplicações SaaS resilientes. Na [primeira parte](https://www.treinaweb.com.br/blog/o-que-sao-os-12-factor-app-parte-1/ "primeira parte"), vimos a definição do que são os 12 fatores, bem como analisamos três dos doze princípios: codebase, dependencies e configs.

Na [segunda parte](https://www.treinaweb.com.br/blog/o-que-sao-os-12-factor-app-parte-2/ "segunda parte"), vimos mais três dos 12 factor app: backing services, build, release and run; e processes. Nesta terceira parte, iremos abordar mais 3 dos 12 princípios: port binding, concurrency e disposability.

### Port Binding

Quando desenvolvemos aplicações web, é comum que estas sejam executadas em ambientes isolados, chamados servidores de aplicação. Por exemplo, aplicações PHP podem ser executadas em servidores PHP, aplicações Java podem ser executadas no Tomcat ou Netty; e aplicações .NET podem ser executadas dentro do Kestrel ou do IIS.

O princípio do port binding diz que aplicações web não devem depender diretamente destes ambientes de execução, seja com relação a dependências ou mesmo mecanismos em tempo de execução para exposição da aplicação para a interface web. Isso quer dizer que uma aplicação Java, por exemplo, tem que ser capaz de ser executada e exposta na web sendo implantada tanto no Tomcat como no Netty, sem que sejam necessárias modificações na aplicação. Ao invés de a aplicação depender explicitamente de recursos do servidor web, ela deve escutar requisições HTTP através de uma porta HTTP, garantindo que todas as requisições em uma determinada porta sejam encaminhadas à ela.

Resumidamente, uma porta HTTP, que pode variar de 0 a 65535, é um possível caminho (ou endpoint) para enviar requisições para um servidor dentro de um protocolo de transporte. Existem alguns protocolos que já são associados à algumas portas por padrão de mercado. Por exemplo, é comum que fluxos de comunicação FTP ocorram através da porta 21. Já fluxos de comunicação de servidores de e-mail através de SMTP utilizem a porta 25. Por fim, também é muito comum que servidores HTTP (como Tomcat, Netty, IIS e Apache) utilizem a porta 80 para receberem requisições HTTP ou 443 para HTTPS.

Segundo o 12 factor app, uma aplicação tem que ser acessível através de uma interface HTTP definida por uma porta, que deve ser única e exclusiva para aquela aplicação. Essa deve ser a única maneira para expor uma aplicação para a web. Isso faz com que sejam necessários acoplamentos entre as aplicações e algum servidor web específico, além de garantir que os padrões de mercado sejam seguidos.

### Concurrency

Quando as aplicações web são iniciadas em um servidor, naturalmente são definidas através de processos que são executados dentro do sistema operacional. Servidores web modernos, visando a melhor utilização de recursos das máquinas, têm apresentado outras maneiras para exporem aplicações web além de múltiplos processos. É comum que uma aplicação web se divida em processos-filhos do processo do servidor de aplicação, e estes sub-processos ainda podem ser divididos em mais unidades, como threads (caso de servidores como o Tomcat) ou até mesmo sub-rotinas (como as goroutines comuns no Go ou as coroutines comuns no Kotlin).

Servidores web ainda podem utilizar outras estratégias além destas, como o event looping comum no Node.js e no Netty Server. Por fim, isso ainda pode variar até mesmo com a linguagem e framework que é utilizado. Aplicações PHP geralmente são executadas como sub-processos do Apache, onde o servidor vai criando cada vez mais sub-processos à medida que a demanda da aplicação cresce. Já aplicações Java com frameworks como Spring utilizam o caminho inverso: na inicialização da JVM, uma quantidade considerável de recursos da máquina é pré-alocada previamente, sendo que estes recursos são gerenciados através de um processo de gestão de threads concorrentes. Ou, se falamos de aplicações Java com abordagem mais reativa, como aplicações que utilizam Vert.x, Webflux ou Micronaut, uma quantidade pequena de recursos e threads é inicialmente alocada, com estas aplicações usufruindo do conceito de event looping e sub-rotinas de web servers como o Netty. Claro que cada uma das abordagens tem pontos positivos e negativos, mas o ponto principal aqui é que esse processo todo de gestão de alocação e manipulação de recursos é praticamente transparente para o desenvolvedor.

O 12 factor app, através do fator concorrência (concurrency) prega que na verdade estes processos concorrentes são first class citizens, ou cidadãos de primeira classe. Isso quer dizer que os desenvolvedores devem levar em consideração também estes processos de gestão de concorrência para desenvolver aplicações mais resilientes e escaláveis ainda, se aproveitando das diferenças de cada um dos modelos de gestão.

Por exemplo, o processo principal de uma aplicação web pode ser definido dentro de um processo nativamente web, mas tarefas de background podem ser definidas em processos adjacentes e segregados, talvez até mesmo com um método de gestão diferente de um servidor web, desde que esse seja mais adequado. Além disso, estes modelos de gestão têm que estar preparados até mesmo para serem executados em ambientes fisicamente apartados e concorrentes entre si.

Isso quer dizer que uma aplicação deve conseguir ser capaz de escalar internamente dentro de um servidor web através de expansão dos processos de gestão de concorrências, como por exemplo, através de abertura de mais threads ou sub-processos e, se necessário, até mesmo suportar a execução em máquinas diferentes de maneira simultânea, tendo dois processos “mãe” rodando em ambientes diferentes com a mesma aplicação de maneira simultânea.

Atualmente, é comum lidarmos com os princípios de escalabilidade em máquinas diferentes através de ferramentas como o Docker, para garantir a exposição de aplicações em ambientes diferentes de maneira natural com o Kubernetes, auxiliando a fazer o processo de distribuição de carga entre os diferentes ambientes ou processos em execução simultâneos. Essa tem sido a linha adotada pelo mercado atualmente.

Porém, as aplicações em si também precisam ser escritas e arquitetadas de maneira que utilizem efetivamente os recursos das máquinas, seja através de uma distribuição inteligente de sub-processos, múltiplas threads ou estratégias como event looping. No fim, o grande foco do fator concurrency é garantir a escalabilidade e elasticidade das aplicações.

### Disposability

Quando falamos dos 12 factor app, é importante lembrarmos que as aplicações, que são tratadas como processos, têm que ser capazes de serem encerradas da mesma maneira que têm que ser capazes de serem criadas, ou seja, de maneira natural e sem a produção de efeitos colaterais. Da mesma maneira que uma aplicação não pode apresentar comportamentos indesejados caso haja múltiplas instâncias sendo executadas simultaneamente, o encerramento de um dos processos também não pode causar efeitos adversos. E mais: estes processos têm que ter a capacidade de serem iniciados e encerrados de maneira muito rápida. Estas características tornam a aplicação mais elástica e escalável ainda, tendo em vista que a aplicação, em questão de segundos, tem que ser capaz de iniciar ou encerrar processos concorrentes de acordo com a demanda. Estas são as principais diretivas do princípio disposability.

Disposability tem uma relação muito interessante com concurrency. Devemos ter aplicações que têm que ser capazes de serem executadas em múltiplos ambientes de maneira concorrente. Mas, um dos sub-processos de uma aplicação, como uma instância, pode falhar ao ser criado por uma série de razões (como falta de recursos do sistema operacional ou falha ao acessar serviços como bancos de dados).

Quando um desses processos falha (lembrando que aqui estamos considerando como sendo uma instância da aplicação), essa instância problemática precisa ser encerrada o mais rapidamente possível, pois ela não é mais operacional. Ao mesmo tempo, uma outra instância precisa ser criada para substituir a instância defeituosa. E tudo isso é necessário para que a experiência dos usuários destes processos não seja prejudicada: eles não podem perceber estas possíveis falhas.

Aqui entra o princípio de disposability. A instância defeituosa tem que ser capaz de se encerrar rapidamente sem provocar efeitos colaterais nas demais instâncias, ao mesmo tempo que a instância substituta precisa ser iniciada o mais rápido possível para evitar a sobrecarga das demais instâncias operacionais. Com isso, podemos ver que o princípio de disposability também tem uma relação muito forte com o aspecto de escalabilidade de uma aplicação.

Existem outros aspectos envolvidos com o fato de uma aplicação poder ser encerrada rapidamente. Se um processo que será encerrado estava no meio de um processamento, é altamente provável que o consumidor da aplicação irá repetir o comando. Até mesmo a repetição do comando não pode causar efeitos colaterais na aplicação: a mesma tem que processar o comando “repetido” de maneira completamente transparente. Isso é o que normalmente chamamos de idempotência, se tornando uma decorrência dos princípios de concurrency e disposability.

- [ #12 Factor App ](https://www.treinaweb.com.br/blog/tag/12-factor-app)
- [ #port binding ](https://www.treinaweb.com.br/blog/tag/port-binding)
- [ #concurrency ](https://www.treinaweb.com.br/blog/tag/concurrency)
- [ #disposability ](https://www.treinaweb.com.br/blog/tag/disposability)

Autor

 ![Marylene Guedes](//secure.gravatar.com/avatar/5b0ba52b3705f298802db58782656bbc?d=mm)

## Marylene Guedes

 Responsável pelo sucesso do cliente na TreinaWeb. Graduada em Gestão de Tecnologia da Informação pela FATEC Guaratinguetá, além de estudante de UX/UI. 

 [Todos os artigos](https://www.treinaweb.com.br/blog/autor/marylene-guedes)  

## Continue estudando

 Transforme leitura em prática com os cursos e formações da TreinaWeb.

 [Ver cursos](https://www.treinaweb.com.br/cursos)   

  Continue lendo

## Artigos relacionados

- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/01/TWELVE-FACTOR-APP-400x280.png)  [ Engenharia de Software ](https://www.treinaweb.com.br/blog/categoria/engenharia-de-software) 

     6 anos atrás

    ##  [ O que são os 12 Factor App? - Parte 1 ](https://www.treinaweb.com.br/blog/o-que-sao-os-12-factor-app-parte-1) 

     Se você trabalha desenvolvendo aplicativos que funcionam como um serviço, conheça os 12 (Twelve) Factor App, uma metodologia que te ajudará a criar aplicações melhores.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/02/TWELVE-FACTOR-APP-400x280.png)  [ Engenharia de Software ](https://www.treinaweb.com.br/blog/categoria/engenharia-de-software) 

     6 anos atrás

    ##  [ O que são os 12 Factor App? – Parte 2 ](https://www.treinaweb.com.br/blog/o-que-sao-os-12-factor-app-parte-2) 

     No artigo anterior, foi apresentado o conceito do 12 Factor App. Nessa segunda parte, veremos mais três fatores: Backing Services; Build, Release, Run e Processes.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/07/unidades_de_medidas_no_css-400x280.jpg)  [ Desenvolvimento Front-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-front-end) 

     4 anos atrás

    ##  [ Unidades de medidas no CSS ](https://www.treinaweb.com.br/blog/unidades-de-medidas-no-css) 

     Nesse artigo você irá entender de fato a diferença entre as várias opções de unidades medidas do CSS, como Rem, Em, %, Px, entre outras.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/07/05112250/SPRING-BOOT-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     7 anos atrás

    ##  [ Criando uma API REST com o Spring Boot ](https://www.treinaweb.com.br/blog/criando-uma-api-rest-com-o-spring-boot) 

     Todos os passos da criação de uma API REST com o framework Spring Boot do Java, no Visual Studio Code.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/lean-ux-como-potencializar-o-foco-na-experiencia-do-usuario-parte-1-400x280.png)  [ Acessibilidade e User Experience (UX) ](https://www.treinaweb.com.br/blog/categoria/acessibilidade-e-user-experience-ux) 

     6 anos atrás

    ##  [ Lean UX: como potencializar o foco na experiência do usuário – parte 2 ](https://www.treinaweb.com.br/blog/lean-ux-como-potencializar-o-foco-na-experiencia-do-usuario-parte-2) 

     Nessa segunda parte, veremos os 15 princípios que regem o Lean UX.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/01/20161707/PHP-PSR-1-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     7 anos atrás

    ##  [ O que são as PSRs do PHP ](https://www.treinaweb.com.br/blog/o-que-sao-as-psrs-do-php) 

     Neste artigo veremos o que são as PSRs do PHP. Entenderemos conceitos importantes, como, RFCs e a RFC2119, além de falar sobre o grupo responsável pelas PSRs, o PHP-FIG.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/08/o-que-e-ruby-on-rails-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     6 anos atrás

    ##  [ O que é Ruby on Rails? ](https://www.treinaweb.com.br/blog/o-que-e-ruby-on-rails) 

     Veja neste artigo o que é Ruby on Rails.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/03/01154814/NUGET-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     7 anos atrás

    ##  [ O que é o NuGet? ](https://www.treinaweb.com.br/blog/o-que-e-o-nuget) 

     Um gerenciador de pacote é essencial em qualquer plataforma de desenvolvimento moderna. Para o .NET há o Nuget, o conheça em detalhes neste artigo.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/09/27171418/loiane-groner-400x280.png)  [ Entrevistas ](https://www.treinaweb.com.br/blog/categoria/entrevistas) 

     8 anos atrás

    ##  [ TW Entrevista 12: Loiane Groner ](https://www.treinaweb.com.br/blog/tw-entrevista-12-loiane-groner) 

     Fizemos uma série de entrevistas chamada "TW Entrevista". A entrevistada de hoje é a Loiane Groner, que já escreveu diversos livros publicados internacionalmente e possui os títulos GDE (Google Developer Expert) e Microsoft MVP (Most Valuable Professional).

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/06/foreach-no-php-aprenda-ler-arrays-e-outras-estruturas-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     7 anos atrás

    ##  [ Foreach no PHP. Aprenda ler arrays e outras estruturas! ](https://www.treinaweb.com.br/blog/foreach-no-php-aprenda-ler-arrays-e-outras-estruturas) 

     O loop foreach no PHP é uma estrutura de repetição simples e flexível! Aprenda corretamente como utilizar para percorrer arrays e outras estruturas no PHP.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/03/iterators-php-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     7 anos atrás

    ##  [ Generators no PHP ](https://www.treinaweb.com.br/blog/generators-no-php) 

     Saiba o que são Iterators e Generators, bem como os seus casos de uso.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2017/11/30154906/TOP-5-1-400x280.png)  [ Desenvolvimento ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento) 

     9 anos atrás

    ##  [ Top 5 das linguagens de programação mais populares de 2017 ](https://www.treinaweb.com.br/blog/top-5-das-linguagens-de-programacao-mais-populares-de-2017) 

     O ano está acabando e você, sabe quais foram as linguagens de programação mais utilizadas / populares neste ano?

     Ler artigo

## Um ano de acesso total para você viver de programação.

 Todos os cursos e formações da TreinaWeb numa única assinatura, com professores que atuam no mercado, suporte direto e certificados. Do primeiro `console.log` ao mercado de trabalho.

- **1 ano** de acesso a **todos os cursos**
- Cursos novos **toda semana**
- Suporte **direto com professores**
- Plano de carreira **personalizado**
- **Certificados digitais** inclusos
- **Aplicativos** para Android e iOS, com **acesso offline**

    **Garantia incondicional de satisfação** 

 Teste por 7 dias e, se não fizer sentido para você, devolvemos seu dinheiro.

### Acesso completo a todos os cursos e dezenas de Formações.

 12 meses 

  Economize R$ 840,00  54% OFF 

 de 12x R$ 129,00 por apenas

 12x  R$ 59,00

 sem juros no cartão de crédito ou R$ 599,00 à vista

  Oferta termina em  **17h 49min 49s**

- Acesso imediato e ilimitado durante 1 ano.
- Plano de carreira personalizado.
- Suporte direto com professores.
- E muito mais!

 [Matricule-se agora](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26)

     [                ](https://www.treinaweb.com.br)

 Escola online de programação, tecnologia e IA.

- [  ](https://www.facebook.com/TreinaWeb/)
- [  ](https://www.instagram.com/treinaweb/)
- [  ](https://www.youtube.com/user/TreinaWeb)
- [  ](https://twitter.com/treinaweb)
- [  ](https://www.linkedin.com/company/treinaweb)
- [  ](https://github.com/treinaweb)

## Inscreva-se em nossa newsletter

Receba lançamentos, promoções e novidades.

   Seu nome     Seu WhatsApp     Seu melhor e-mail   Inscrever-se 

## Cursos

- [ Base para Devs ](https://www.treinaweb.com.br/categoria/base-para-devs)
- [ Front-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-front-end)
- [ Back-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-back-end)
- [ Mobile ](https://www.treinaweb.com.br/categoria/desenvolvimento-mobile)
- [ Bancos de Dados ](https://www.treinaweb.com.br/categoria/bancos-de-dados)
- [ Cloud ](https://www.treinaweb.com.br/categoria/cloud-computing)
- [ IA ](https://www.treinaweb.com.br/categoria/ia)
- [ E mais ](https://www.treinaweb.com.br/categoria/e-mais)
- [ Ver todos os cursos ](https://www.treinaweb.com.br/cursos)

## Conteúdo

- [ Formações ](https://www.treinaweb.com.br/formacoes)
- [ Projetos práticos ](https://www.treinaweb.com.br/projetos-praticos)
- [ Direto ao ponto ](https://www.treinaweb.com.br/direto-ao-ponto)
- [ Planos ](https://www.treinaweb.com.br#assinatura)
- [ Depoimentos ](https://www.treinaweb.com.br#depoimentos)
- [ Comunidade ](https://www.treinaweb.com.br#comunidade)
- [ Corpo docente ](https://www.treinaweb.com.br#docente)

## A empresa

- [ Sobre a TreinaWeb ](https://www.treinaweb.com.br#sobre)
- [ Perguntas frequentes ](https://www.treinaweb.com.br#faq)
- [ Vantagens de estudar na TreinaWeb ](https://www.treinaweb.com.br/vantagens-de-estudar-na-treinaweb)
- [ Cursos para empresas ](https://www.treinaweb.com.br/empresas)
- [ Sugira um novo curso ](https://www.treinaweb.com.br/sugerir-curso)
- [ Trabalhe conosco ](https://www.treinaweb.com.br/trabalhe-conosco)
- [ Artigos ](https://www.treinaweb.com.br/blog)
- [ Desenvolvedores e agentes ](https://www.treinaweb.com.br/developers)
- [ Contato ](https://www.treinaweb.com.br/contato)
- [ Política de privacidade ](https://www.treinaweb.com.br/politica-de-privacidade)
- [ Termos de uso ](https://www.treinaweb.com.br/termos-de-uso)

## Baixe nosso aplicativo

 [   Disponível na **App Store**  ](https://apps.apple.com/us/app/treinaweb/id1322729447) [   Disponível no **Google Play**  ](https://play.google.com/store/apps/details?id=br.com.treinaweb.mobile) 

  Av. Paulista, 1765, Conj 71 e 72 · Bela Vista · São Paulo · SP · 01311-200   © 2004 – 2026 TreinaWeb Tecnologia LTDA · CNPJ 06.156.637/0001-58
