Base para desenvolvimento, descoberta de dados e setup do ambiente.
Arquitetura é gerenciar trade-offs. Não existe "Bala de Prata".
Método oficial do SEI (Software Engineering Institute) para avaliar se uma arquitetura atende aos Quality Attributes (Performance, Segurança, Modificabilidade) desejados.
// Decisão Arquitetural Implícita:
// Acoplamento forte com Banco de Dados
public class PedidoService {
// Dependência direta = Difícil testar
private SqlConnection _conn = new SqlConnection("...");
public void Criar() {
_conn.Open(); // Bloqueante
// ...
}
}
Um método estruturado (SEI/CMU) para avaliar se a arquitetura suporta os Atributos de Qualidade.
A "Árvore de Utilidade" é a ferramenta #1 para definir o que "Qualidade" significa para O SEU sistema.
Uma propriedade do componente que é crítica para alcançar um atributo de qualidade específico.
Exemplo:
"O nível de criptografia (AES-256 vs AES-128)"
Isso é um ponto de sensibilidade para a SEGURANÇA.
Quando um Sensitivity Point afeta mais de um atributo, de formas opostas.
Exemplo:
"Usar Criptografia Pesada (AES-256)"
Ao final da análise, cada decisão arquitetural cai em uma categoria:
Decisão que não atende aos cenários de alta prioridade.
Ex: "Usar polling SQL a cada 1s para dashboard real-time (Cenário de Latência < 100ms)."
Decisão validada pelos cenários.
Ex: "Usar WebSockets para notificações push."
Uma lista de Riscos Arquiteturais priorizados. Isso vira o Backlog Técnico!
Define o propósito, o escopo e as políticas do sistema. Não fala de bits e bytes, mas de regras e valor.
Define a semântica e a estrutura das informações processadas. É o modelo conceitual dos dados.
{ "id": 1, "status": "ATIVO" }
Decompõe o sistema em Objetos Funcionais e suas Interfaces. Aqui nasce a arquitetura de software lógica.
Foca na decomposição funcional sem se preocupar (ainda) em qual servidor isso vai rodar.
Define a distribuição física e a infraestrutura necessária para suportar os objetos computacionais.
A escolha das ferramentas e padrões concretos. É onde o "martelo bate o prego".
Forças internas ou externas que ditam o sucesso do negócio. A arquitetura deve habilitar esses drivers, não bloqueá-los.
Cenário: "Precisamos lançar features novas toda sexta-feira antes do concorrente."
Impacto Arquitetural:
Cenário: "Se vazarmos dados, pagamos 50 milhões de multa."
Impacto Arquitetural:
Cenário: "A conta da AWS está matando nossa margem de lucro."
Impacto Arquitetural:
Cenário: "No dia 25/11, teremos 100x mais acessos que o normal."
Impacto Arquitetural:
Na arquitetura, Persona não é só "nome e idade". É comportamento de IO (Input/Output).
Descreve a interação entre um Ator e o Sistema para atingir um objetivo.
Quem interage com o sistema. Pode ser uma Pessoa (Trader) ou outro Sistema (Banco Central).
Uma funcionalidade ou objetivo específico. Sempre no formato Verbo + Substantivo (ex: "Validar Saldo").
Define o escopo. O que está dentro é software a ser construído; o que está fora são atores externos.
<<include>>
<<extend>>
Para Fazer Pedido, o sistema OBRIGATORIAMENTE exige Pagar e Logar.
O cliente PODE Aplicar Cupom, mas não é obrigado.
"O sistema DISPARA o ator secundário para completar o objetivo do primário."
"Dá conta" é opinião. NFR é métrica.
Requisitos não funcionais dizem como medir sucesso, falha e risco técnico.
"Nosso sistema dá conta."
Agora dá para testar, dimensionar e estimar custo.
"Quais estruturas e componentes sustentam os requisitos?"
O diagrama de classes mostra estrutura, não fluxo.
Ele responde: "o que existe e como se conecta".
"Qual tecnologia reduz risco técnico e acelera valor?"
Tecnologia é meio, não fim. A escolha deve proteger arquitetura e evolução.
Ideal para dashboards robustos feitos do zero.
Excelente para descrever um caso de uso crítico e seus passos técnicos.
Complementa o diagrama de classes (estrutura) com comportamento.
O ERP não falava com o CRM, que não falava com o E-commerce. Integrações ponto-a-ponto viravam um "Espaguete".
O Enterprise Service Bus centraliza e padroniza.
O ESB atua como "Hub Universal", evitando conexões N x N.
Ponto de Falha Único e Lógica Centralizada ("Smart Pipes")
SOA permite compor serviços com contratos claros, reduzindo acoplamento entre domínios.
O foco é interoperabilidade, não velocidade bruta.
Um maestro (Controller Central) diz:
Gargalo Central! Se o maestro morre, a música para.
Ninguém manda. Eventos acontecem.
PRODUTO_CRIADOAutonomia Total!
Ao contrário do RabbitMQ (que apaga a mensagem após o consumo), o Kafka retém os eventos.
Utilizando a biblioteca Confluent.Kafka.
using Confluent.Kafka;
var config = new ProducerConfig { BootstrapServers = "localhost:9092" };
using var producer = new ProducerBuilder<Null, string>(config).Build();
var mensagem = "{ 'postId': 456, 'comentarioId': 789, 'autor': 'João', 'texto': 'Ótimo post!', 'timestamp': '2024-01-15T10:30:00Z' }";
// Fire and Forget (Assíncrono)
await producer.ProduceAsync("blog-comentarios-events",
new Message<Null, string> { Value = mensagem });
Console.WriteLine("Evento emitido! Comentário publicado no sistema de eventos.");
O Serviço de Analytics fica escutando os eventos de comentários...
var config = new ConsumerConfig {
GroupId = "analytics-group", // Importante para load balancing
BootstrapServers = "localhost:9092",
AutoOffsetReset = AutoOffsetReset.Earliest
};
using var consumer = new ConsumerBuilder<Null, string>(config).Build();
consumer.Subscribe("blog-comentarios-events");
while (true) {
try {
var cr = consumer.Consume(CancellationToken.None);
Console.WriteLine($"Recebi evento de comentário: {cr.Message.Value}");
// Lógica Autônoma de Analytics:
// AtualizarContagemComentarios(postId);
// CalcularSentimento(texto);
// NotificarDashboard(metricas);
}
catch (Exception e) { Console.WriteLine($"Erro: {e.Message}"); }
}
O Backend (ASP.NET Core) consome o Kafka e avisa o Blazor via SignalR.
// Componente Blazor Dashboard de Analytics (.razor)
@code {
private List<string> _metricasComentarios = new();
private int totalComentarios = 0;
private double sentimentoMedio = 0;
protected override async Task OnInitializedAsync() {
// Conecta ao Hub SignalR que está "bridged" com o Kafka
hubConnection.On<string>("ReceberMetricaComentario", (metrica) => {
_metricasComentarios.Add(metrica);
totalComentarios++;
// Mágica do Blazor: "Renderize de novo, algo mudou!"
StateHasChanged();
});
}
}
Sem StateHasChanged(), o dashboard não atualiza! Cada novo comentário dispara uma atualização visual instantânea.
Cenário: Vocês vão criar um Dashboard Gerencial.
Pesquisa (15 min):