[Conceito] - Tipos de Aplicações e Padrões de Deployment
Published: 2022-04-16 22:23:54

> Conteúdo original [nessa thread do Twitter](https://twitter.com/zanfranceschi/status/1515453787401453568)

---

Dev,

Queria falar sobre algumas formas de classificar aplicações que você vai encontrar na sua vida profissional. Possivelmente você já as conhece, mas talvez não tenha parado para pensar muito sobre elas.

Bora?

cc @sseraphini

🧵

![img](https://pbs.twimg.com/media/FQf5MCMVQAAf9WC?format=png&name=small)

---

Vou começar com um tipo de classificação:

Aplicações que expõem ou não uma ou mais portas.

É fácil fazer essa classificação. Vamos lá!

----

Aplicações que expõem uma ou mais portas:

Se a aplicação aceita conexões (TCP, UDP, etc) significa que é uma aplicação que expõe uma ou mais portas ─ óbvio. Exemplos:
- Web APIs;
- Bancos de dados;
- Sistemas de mensageria;
- Agregadores de log;
- Etc.

![img](https://pbs.twimg.com/media/FQf5MdSUcAAfbYU?format=jpg&name=medium)

---

Aplicações que não expõem portas:

São aplicações que não têm clientes, como uma web api, por exemplo. Exemplos:
- Agentes de atualizações;
- Consumidores de filas/tópicos;
- Processos em background;
- Etc.

![img](https://pbs.twimg.com/media/FQf5M3GVgAIIJEt?format=jpg&name=large)

---

Vale mencionar que, na classificação das aplicações que não expõem portas, desconsiderei a questão da exposição de portas para fins de, por exemplo, monitoramento, ok?

Fácil né?

---

Agora vamos falar de outra classificação relacionada ao ciclo de vida do runtime da aplicação. Ou seja, qual é o tempo desejado de execução da aplicação.

---

É super fácil fazer essa classificação também:

- Aplicações que devem funcionar contínua e ininterruptamente;

- Aplicações que funcionam por um período mais ou menos conhecido e param.

---

Vamos a exemplos de novo.

Aplicações que devem funcionar contínua e ininterruptamente. Exemplos:
- Web APIs;
- Bancos de dados;
- Sistemas de mensageria;
- Consumidores de filas/tópicos (geralmente);
- Etc.

---

Aplicações que funcionam por um período mais ou menos conhecido e param. Exemplos:
- Processos em batch (lote);
- Processos de limpeza de disco e/ou backup;
- Etc.

---

É quase certo afirmar que essa última categoria são de aplicações com execuções agendadas. Mas nem sempre é o caso. A execução delas pode se iniciar a partir da reação de uma mensagem consumida em uma fila, por exemplo.

---

Ter clareza sobre esses tipos de classificações faz com que também pensemos nos padrões de deployment/reserva de recursos computacionais para as aplicações.

Ou seja, dificilmente vc deveria executar um processamento pesado em lote no mesmo processo de uma API, né?

---

Um padrão comum é deixar cada tipo de aplicação ser executada em seu próprio processo separadamente.

---

Vamos a um exemplo de um serviço que oferece solicitações de estornos. Esse serviço também precisa reagir a eventos externos para dar prazos para a conclusão de análises desses pedidos. E além do mais, também existe um processo em lote para tratar trocas de arquivos dos estornos.

![img](https://pbs.twimg.com/media/FQf5OoAVkAALuPv?format=jpg&name=large)

---

Talvez o desenho de deployment mais trivial para essa solução fosse cada tipo de aplicação ser executada em um processo isolado ─ em seu próprio host, container, etc.

![img](https://pbs.twimg.com/media/FQf5PGCVEAA9GaQ?format=jpg&name=4096x4096)

---

Claro que existem outras forma de deployment. Você pode arranjar suas aplicações de formas diferentes, mas vale sempre pensar sobre isso. Aspectos como dependências, pontos únicos de falhas, economia de recursos, disponibilidade, segurança, precisam ser levadas em consideração.

---

Como sempre, se chegou até aqui, dá um abraço vai 🫂

Obrigado demais pela moral! Se vc curtiu, dá uma força com RT, likes, comentários, tá? Por favor. Isso me ajuda muito. 💕