Engenharia de Software Moderna
Cap. 7 - Arquitetura
Prof. Marco Tulio Valente
https://engsoftmoderna.info
1
Licença CC-BY; permite copiar, distribuir, adaptar etc; porém, créditos devem ser dados ao autor dos slides
Arquitetura
2
3
Software Design
Software Architecture
Padrões Arquiteturais
4
Sobre a importância de Arquitetura de Software
5
Debate Linus-Tanenbaum (1992)
6
Criador do sistema
operacional Linux
Autor de livros e do sistema operacional Minix
Início do debate: Mensagem do Tanenbaum (1992)
7
Argumento do Tanenbaum
8
Resposta do Linus
9
Argumento do Linus
10
Nova mensagem do Tanenbaum
11
Comentário do Ken Thompson (Unix)
12
Ken Thompson previu o futuro:
17 anos depois (2009) veja a declaração de Torvalds em uma conferência de Linux
13
14
Moral da história: os custos de uma decisão arquitetural podem levar anos para aparecer …
15
Arquitetura em Camadas
16
Arquitetura em Camadas
17
Vantagens
18
Variações para Sistemas de Informações
19
Arquitetura em Três Camadas
20
Arquitetura em Três Camadas
21
Arquitetura em Duas Camadas
22
Arquitetura Model-View-Controller (MVC)
23
Arquitetura MVC
24
MVC
25
MVC = (Visão + Controladores) + Modelo
= Interface Gráfica + Modelo
26
27
Modelo
Interface Gráfica 1
Interface Gráfica 2
Importante
28
MVC Tradicional (Smalltalk)
29
MVC nos dias de hoje
30
MVC Web
31
MVC Web
32
33
Páginas HTML, CSS, JavaScript (o que o usuário vai ver)
34
Recebem dados de entrada e fornecem informações para páginas de saída
35
Lógica da aplicação (regras de negócio) e fazem a interface com o banco de dados
Exemplo muito simples de um sistema MVC Web
https://github.com/mtov/ESM-ExemplosCodigo/tree/master/cap7/mvc
36
Este exemplo não usa nenhum framework e possui uma interface Web muito simples, tudo por motivos didáticos
Controlador
37
public class ControladorPesquisaLivros {
...
public void start() {
...
get("/", (req, res) -> {
res.redirect("index.html");
return null;
});
...
}
}
Browser (index.html)
38
Controlador
39
public class ControladorPesquisaLivros {
ServicoPesquisaLivros pesq;
PaginaDadosLivro pagina;
...
public void start() {
...
get("/pesquisa", (req, res) -> {
String autor = req.queryParams("autor");
Livro livro = pesq.pesquisaPorAutor(autor);
return pagina.exibeLivro(livro.getTitulo(),
livro.getAutor(), livro.getISBN());
});
...
}
}
Modelo
40
public class ServicoPesquisaLivros {
public Livro pesquisaPorAutor(String autor) {
try(Connection con = DriverManager.getConnection(...)) {
String query = "select * from livros where autor = ?";
PreparedStatement stmt = con.prepareStatement(query);
stmt.setString(1, autor);
ResultSet rs = stmt.executeQuery();
String isbn = rs.getString("isbn");
String titulo = rs.getString("titulo");
return new Livro(isbn, autor, titulo);
} catch (SQLException e) {
System.out.println(e.getMessage());
return null;
}
}
}
Controlador
41
public class ControladorPesquisaLivros {
ServicoPesquisaLivros pesq;
PaginaDadosLivro pagina;
...
public void start() {
...
get("/pesquisa", (req, res) -> {
String autor = req.queryParams("autor");
Livro livro = pesq.pesquisaPorAutor(autor);
return pagina.exibeLivro(livro.getTitulo(),
livro.getAutor(), livro.getISBN());
});
...
}
}
Visão
42
public class PaginaDadosLivro {
public String exibeLivro(String titulo, String autor, String isbn) {
String res = "<h4> Dados do Livro Pesquisado </h4>";
res += "<ul>";
res += "<li> Título: " + titulo + " </li>";
res += "<li> Autor: " + autor + " </li>";
res += "<li> ISBN: " + isbn + " </li>";
res += "</ul>";
return res;
}
}
Browser
43
44
Observação
45
MVC Frameworks continuam sendo relevantes!
46
https://rubyonrails.org (Maio 2025)
Pergunta: Conhece alguma empresa brasileira que usa frameworks MVC?
47
Single Page Applications (SPAs)
48
Aplicações Web Tradicionais
49
Browser
Server
Request
Response (HTML)
Request
Response (HTML)
Request
Response (HTML)
Problema: interface menos responsiva
Exemplo: Toda alteração que faz em um formulário, tem que clicar em “Salvar”
Multiple Page Applications (MPAs)
Single Page Applications
50
Exemplo: Aplicação Simples usando Vue.js
51
52
Interface (Web)
HTML
53
54
Dados
Métodos
Modelo
55
56
57
Resumo
MVC Tradicional (Smalltalk): aplicações gráficas, pré-Web
MVC Web: adaptação de MVC para Web (fullstack)
SPA: adaptação de MVC para uso no front-end
58
Arquiteturas baseadas em Microsserviços
59
Importante: o que vamos estudar no restante do capítulo diz respeito a arquiteturas de backend
60
Monolitos
61
Módulos (de implementação e compilação)
Mas em tempo de execução, tudo roda em único processo ou serviço
Problema #1: Single Point of Failure
62
Escalabilidade: Vertical vs Horizontal
63
https://www.section.io/blog/scaling-horizontally-vs-vertically/
Problema #2 com Monolitos: Escalabilidade
64
Problema #3: Release é mais lento
65
Exemplo
66
Riscos de adicionar novas features em um código existente (principalmente, se monolítico)
67
Microsserviços
68
Microsserviços
69
70
Arquitetura Monolítica
71
Arquitetura Monolítica
Arquitetura baseada em Microsserviços
Microsserviço com
1 módulo
Microsserviço com
3 módulos
microsserviço = processo (run-time, sistema operacional)
Microsserviço com
2 módulos
Vantagem #1: Escalabilidade
72
Só contém instâncias de M1, pois apenas ele é o gargalo de desempenho
Vantagem #2: Flexibilidade para Releases
73
Releases de microsserviços
74
Outras vantagens
75
Quem usa microsserviços?
76
Cada nodo é um microsserviço
Uber (~2018)
77
https://eng.uber.com/microservice-architecture/
Mercado Livre (maio 2025)
78
Pergunta: Conhece alguma empresa brasileira que usa microsserviços?
79
Exemplo de uma aplicação de ecommerce baseada em microsserviços
80
81
Gerenciamento de Dados com Microsserviços
82
Arquitetura que não é recomendada. Motivo: aumenta acoplamento entre M1 e M2
❌
Gerenciamento de Dados com Microsserviços
83
❌
✅
Quando não usar microsserviços?
84
Recomendação: começar com monolitos
85
Mas existem exceções
86
https://building.nubank.com/pt-br/microsservicos-no-nubank-uma-visao-geral/
"começamos com microsserviços desde o primeiro dia, desafiando o conselho padrão de começar com um monólito."
87
88
gRPC
89
gRPC: Linguagem para definição de interfaces
90
91
app.get('/shipping/:cep', (req,res,next) => {
shipping.GetShippingRate( {
cep: req.params.cep,
},
(err, data) => { …
server.addService(shippingProto.ShippingService.service, {
GetShippingRate: (_, callback) => {
const shippingValue = Math.random() * 100 + 1;
callback(null, {
value: shippingValue,
});
},
});
Arquitetura Orientada a Mensagens
92
Modelo de comunicação até agora: síncrono, request-response (REST, gRPC, GraphQL, etc)
93
Microsserviço
Micro
serviço
Micro
serviço
Micro
serviço
Micro
serviço
Problema?
request
response
response
response
request
request
response
request
Arquitetura orientada a Mensagens
94
Exemplo: RabbitMQ
Vantagem #1: Tolerância a Falhas
95
Vantagem #2: Escalabilidade
96
Comunicação Assíncrona
97
Arquitetura Publish/Subscribe
98
Publish/Subscribe
99
Publish/Subscribe
100
2
1
3
Exemplo: Kafka
Exemplo: Sistema de Companhia Aérea
101
Comunicação em grupo: um sistema publica eventos, n sistemas assinam e são notificados da publicação
102
Outros Padrões Arquiteturais
103
104
Filtro
Pipe
(2) Cliente/Servidor
105
(3) Peer-to-Peer
106
Anti-padrões Arquiteturais
107
Anti-padrão
108
Big Ball of Mud
109
Exemplo de Remodularização
110
Novembro, 2020 - Big Ball of Mud (com diversas dependências circulares)
111
Comentários dos desenvolvedores
112
Maio, 2024
113
https://antennapod.org/blog/2024/05/modernizing-the-code-structure
Exercícios
114
(a) Microsoft Excel (versão para desktop)
(b) Nubank App (mobile)
(c) Twitter Web (front-end)
(d) Google Slides (front-end)
(e) Twitter (backend)
(f) Moodle
115
2. Responda sobre microsserviços:
(a) Por que uma arquitetura baseada em microsserviços oferece flexibilidade para os times colocarem seu código em produção de forma independente?
(b) Por que isso é menos viável em uma arquitetura monolítica? Ou seja, por que não é recomendável que um time, ao fazer uma modificação em um monolito, coloque-a em produção imediatamente?
(c) Por que microsserviços não devem compartilhar o mesmo BD?
116
3. Suponha uma empresa de streaming que deseja implementar um sistema detector de problemas de qualidade em seus vídeos (por exemplo, problemas nas legendas, no áudio, congelamento de imagens, etc). Os vídeos estão todos armazenados em um sistema de storage, isto é, em memória secundária. A empresa está avaliando duas arquiteturas:
Arquitetura #1: cada detector é um microsserviço, que recebe o nome do vídeo como parâmetro, carrega o mesmo do storage e executa um algoritmo de detecção de problemas de qualidade nesse vídeo.
Arquitetura #2: os detectores são módulos de um monolito. Então, o vídeo é carregado uma única vez do storage para a memória principal e compartilhado por todos os detectores de qualidade.
117
Supondo que a empresa de streaming tem milhões de clientes (ou seja, é uma empresa do porte da Amazon Prime Video) qual arquitetura você considera mais escalável? Justifique.
Observação: este exercício é baseado em um artigo do blog da Amazon Prime Video
118
Fim
119