Compartilhar via


Estilos de arquitetura

Um estilo de arquitetura é uma família de arquiteturas que compartilham características específicas. Por exemplo, N camadas é um estilo de arquitetura comum. Mais recentemente, as arquiteturas de microsserviço estão começando a ganhar favores. Os estilos de arquitetura não exigem o uso de tecnologias específicas, mas algumas tecnologias são mais adequadas para determinadas arquiteturas. Por exemplo, os contêineres são adequados para microsserviços.

Identificamos um conjunto de estilos de arquitetura que geralmente são encontrados em aplicativos de nuvem. O artigo para cada estilo inclui os seguintes componentes:

  • Uma descrição e um diagrama lógico do estilo
  • Recomendações para quando escolher esse estilo
  • Benefícios, desafios e práticas recomendadas
  • Uma implantação recomendada que usa serviços relevantes do Azure

Um tour rápido pelos estilos

Esta seção fornece um tour rápido dos estilos de arquitetura que identificamos, juntamente com algumas considerações de alto nível para seu uso. Essa lista não é completa. Leia mais detalhes nos artigos vinculados.

N-camadas de serviço

Diagrama lógico de um estilo de arquitetura de N camadas.

N-tier é uma arquitetura tradicional para aplicativos empresariais que divide um aplicativo em camadas lógicas e níveis físicos. Cada camada tem uma responsabilidade específica, e as camadas gerenciam dependências ao chamarem só as camadas abaixo delas. As camadas típicas incluem apresentação, lógica de negócios e acesso a dados.

As arquiteturas de N camadas são adequadas para migrar aplicativos existentes que já usam uma arquitetura em camadas. Essa abordagem requer alterações mínimas quando você se move para o Azure e dá suporte a ambientes mistos com componentes locais e de nuvem. Mas as camadas horizontais podem dificultar a introdução de alterações sem afetar várias partes do aplicativo, o que limita a agilidade para atualizações frequentes.

Trabalhador de fila da Web

Diagrama lógico do estilo de arquiteturaQueue-Worker Web.

Web-Queue-Worker é uma arquitetura que consiste em um front-end da Web, uma fila de mensagens e um trabalho de back-end. O front-end da Web lida com solicitações HTTP e interações do usuário, enquanto o worker executa tarefas que exigem muitos recursos, fluxos de trabalho de longa duração ou operações em lote. A comunicação entre o frontend e o trabalhador ocorre por meio de uma fila de mensagens assíncronas.

Essa arquitetura é ideal para aplicativos com domínios relativamente simples que têm alguns requisitos de processamento com uso intensivo de recursos. É fácil entender e implantar com serviços gerenciados do Azure, como o Serviço de Aplicativo e o Azure Functions. Você pode dimensionar o front-end e o trabalho de forma independente para fornecer flexibilidade na alocação de recursos. Mas sem um design cuidadoso, ambos os componentes podem se tornar grandes e monolíticos.

Microsserviços

Diagrama lógico do estilo de arquitetura de microsserviços.

O diagrama ilustra uma arquitetura de microsserviços distribuída organizada em camadas funcionais distintas. À esquerda, aplicativos cliente e sistemas externos iniciam solicitações que fluem por meio de um gateway de API centralizado, que serve como o ponto de entrada único e o mecanismo de roteamento para todo o sistema. O gateway de API direciona solicitações para a camada de microsserviços apropriada, que contém vários tipos de serviço: serviços de domínio que encapsulam recursos de negócios específicos, serviços de composição que orquestram interações entre serviços de domínio e serviços individuais que lidam com funções discretas. Cada microsserviço mantém a autonomia de dados por meio de seu próprio banco de dados dedicado. O diagrama mostra uma abordagem de persistência poliglota usando bancos de dados SQL e NoSQL adaptados aos requisitos de dados específicos de cada serviço. Os microsserviços se comunicam de forma assíncrona por meio do middleware orientado a mensagens. Essa abordagem permite o acoplamento flexível por meio de padrões de publicação-assinatura e interações controladas por eventos. Três camadas de infraestrutura fundamental dão suporte a essa arquitetura distribuída: os sistemas de observabilidade fornecem monitoramento abrangente, registro em log e rastreamento distribuído entre limites de serviço. As plataformas de gerenciamento e orquestração lidam com implantação automatizada, dimensionamento e descoberta de serviços. As cadeias de ferramentas de DevOps permitem pipelines contínuos de integração, teste e entrega para implantações de serviço independentes.

A arquitetura de microsserviços decompõe aplicativos em uma coleção de serviços pequenos e autônomos. Cada serviço implementa uma única capacidade de negócios dentro de um contexto delimitado e é auto-suficiente com seu próprio armazenamento de dados. Os serviços se comunicam por meio de APIs bem definidas e podem ser desenvolvidos, implantados e dimensionados de forma independente.

Os microsserviços permitem que as equipes trabalhem de forma autônoma e ofereçam suporte a atualizações frequentes com maior velocidade de lançamento. Essa arquitetura é adequada para domínios complexos que exigem alterações frequentes e inovação. Mas ele introduz uma complexidade significativa em áreas como descoberta de serviço, consistência de dados e gerenciamento de sistema distribuído. O sucesso requer o desenvolvimento maduro e as práticas de DevOps, o que o torna mais adequado para organizações que têm funcionalidades técnicas avançadas.

Arquitetura baseada em evento

Diagrama de um estilo de arquitetura controlado por eventos.

O diagrama ilustra um padrão de comunicação assíncrono desacoplado fundamental para arquiteturas controladas por eventos. Vários produtores de eventos operam de forma independente. Os fluxos de eventos gerados com base em atividades comerciais, interações do usuário ou alterações de estado do sistema, sem qualquer conhecimento dos consumidores subsequentes. Os produtores alimentam seus eventos em um sistema centralizado de ingestão de eventos que serve como um agente inteligente. O corretor recebe, valida, persiste e distribui eventos de forma confiável por toda a arquitetura. O componente de ingestão de eventos serve como um ponto de desacoplamento crítico. Ele garante que os produtores permaneçam isolados dos consumidores, enquanto fornece garantias em torno da entrega de eventos, pedidos e durabilidade. Nesse hub central, os eventos são distribuídos por meio de um padrão de disseminação para vários consumidores de eventos independentes que estão posicionados à direita no diagrama. Cada consumidor representa uma capacidade de negócio ou serviço distinto que se inscreve em tipos específicos de eventos relevantes para suas responsabilidades de domínio. Os consumidores processam eventos de forma assíncrona e paralela, permitindo que o sistema seja dimensionado horizontalmente, mantendo o acoplamento flexível. Esse padrão arquitetônico remove dependências diretas entre produtores e consumidores. Ele permite que cada componente evolua, dimensione e implante de forma independente, mantendo a resiliência do sistema por meio dos recursos de buffer e repetição do agente de eventos.

As arquiteturas orientadas a eventos usam um modelo de publicação/assinatura em que os produtores de eventos geram fluxos de eventos e os consumidores de eventos respondem a esses eventos quase em tempo real. Produtores e consumidores são separados uns dos outros, com a comunicação acontecendo por meio de canais de eventos ou agentes. Essa arquitetura dá suporte ao processamento de eventos simples e à análise de padrões de eventos complexos.

As arquiteturas orientadas a eventos se destacam em cenários que exigem processamento em tempo real com latência mínima. Alguns exemplos são soluções de IoT, sistemas de negociação financeira ou aplicativos que precisam processar grandes volumes de dados de streaming. As arquiteturas controladas por eventos fornecem excelente escalabilidade e isolamento de falhas, mas introduzem desafios em relação à entrega garantida, à ordenação de eventos e à consistência eventual entre componentes distribuídos.

Big Data

Diagrama lógico de um estilo de arquitetura de Big Data.

O diagrama apresenta uma arquitetura abrangente de Big Data com dois pipelines de processamento complementares que lidam com diferentes velocidades de dados e requisitos analíticos. O pipeline de processamento em lote começa com diversas fontes de dados que alimentam sistemas de armazenamento de dados escalonáveis, normalmente data lakes ou sistemas de arquivos distribuídos capazes de armazenar volumes maciços de dados estruturados, semiestruturados e não estruturados. O componente de processamento em lote executa transformações, agregações e cálculos analíticos em larga escala nos dados históricos. Ele opera em intervalos agendados ou quando dados suficientes se acumulam. Resultados do fluxo de processamento em lote passam por dois caminhos: diretamente para sistemas de análise e relatórios para uso imediato, e para armazenamentos de dados analíticos onde os dados processados são armazenados em formatos otimizados para consultas complexas e análise histórica. Simultaneamente, o pipeline de processamento em tempo real captura dados de streaming por meio de sistemas de ingestão de mensagens em tempo real que lidam com fluxos de dados de alta velocidade de fontes como dispositivos IoT, aplicativos Web ou sistemas transacionais. Os componentes de processamento de fluxo analisam esses dados em movimento, executando agregações em tempo real, filtragem e detecção de padrões para gerar insights imediatos. Os resultados em tempo real seguem caminhos duplos, alimentando diretamente tanto a análise quanto o relatório para dashboards e alertas instantâneos, e também nos mesmos repositórios de dados analíticos para criar uma visão unificada, combinando dados históricos e atuais. A camada de orquestração abrange ambos os pipelines. Ele coordena fluxos de trabalho complexos, gerencia dependências entre trabalhos em lote e streaming, agenda tarefas de processamento e garante a consistência de dados em toda a arquitetura. Essa orquestração permite que você crie arquiteturas lambda em que o processamento em lotes e em tempo real possa operar nos mesmos conjuntos de dados, fornecendo análise histórica abrangente e inteligência operacional imediata.

As arquiteturas de Big Data lidam com a ingestão, o processamento e a análise de dados muito grandes ou complexos para sistemas de banco de dados tradicionais. Essas arquiteturas normalmente incluem componentes para armazenamento de dados (como data lakes), processamento em lote para análise histórica, processamento de fluxo para insights em tempo real e armazenamentos de dados analíticos para relatórios e visualização.

As arquiteturas de Big Data são essenciais para organizações que precisam extrair insights de conjuntos de dados maciços, dar suporte à análise preditiva usando aprendizado de máquina ou processar dados de streaming em tempo real de dispositivos IoT. Implementações modernas geralmente usam serviços gerenciados como o Microsoft Fabric para simplificar a complexidade da criação e manutenção de soluções de Big Data.

Computação em grande escala

Diagrama que ilustra um grande estilo de arquitetura de computação.

O diagrama ilustra um sofisticado sistema de distribuição e operação de trabalho projetado para cargas de trabalho de computação de alto desempenho. No ponto de entrada, os aplicativos cliente enviam tarefas computacionalmente intensivas por meio de uma interface de fila de trabalho que atua como um mecanismo de buffer e entrada para solicitações de trabalho recebidas. Os trabalhos fluem para um agendador centralizado ou componente coordenador que serve como o cérebro inteligente do sistema, responsável por analisar características do trabalho, requisitos de recursos e dependências computacionais. O agendador executa funções críticas, incluindo decomposição de trabalho, planejamento de alocação de recursos e otimização de carga de trabalho com base em recursos de computação disponíveis e interdependências de tarefas. Nesse ponto de coordenação central, o agendador roteia de forma inteligente o trabalho em duas vias de operação distintas com base nas características computacionais de cada trabalho. O primeiro caminho direciona o trabalho para ambientes paralelos de tratamento de tarefas projetados para cargas de trabalho paralelas, em que tarefas individuais podem ser executadas de forma independente sem a necessidade de comunicação entre unidades de processamento. Essas tarefas paralelas são distribuídas entre centenas ou milhares de núcleos simultaneamente, com cada núcleo processando unidades discretas de trabalho isoladamente. O segundo caminho lida com tarefas firmemente acopladas que exigem comunicação interprocessa frequente, acesso de memória compartilhada ou padrões de operação sincronizados. Essas cargas de trabalho fortemente acopladas normalmente usam interconexões de alta velocidade, como InfiniBand ou redes RDMA (acesso remoto direto à memória) para habilitar a troca rápida de dados entre nós de processamento. O agendador monitora continuamente os dois ambientes de operação, gerencia a alocação de recursos, lida com a tolerância a falhas e otimiza o desempenho ajustando dinamicamente a distribuição do trabalho com base na capacidade do sistema, prioridades de trabalho e requisitos de conclusão. A abordagem bifurcada permite que a arquitetura lide com eficiência com cargas de trabalho computacionais diversas, maximizando o uso de recursos em toda a infraestrutura de computação.

As arquiteturas de computação grande dão suporte a cargas de trabalho em larga escala que exigem centenas ou milhares de núcleos para operações computacionalmente intensivas. O trabalho pode ser dividido em tarefas discretas que são executadas em vários núcleos simultaneamente, com cada tarefa recebendo entrada, processando-a e produzindo saída. As tarefas podem ser independentes (embaraçosamente paralelas) ou firmemente acopladas, exigindo comunicação de alta velocidade.

A computação grande é essencial para simulações, modelagem de risco financeiro, computação científica, análise de estresse de engenharia e renderização 3D. O Azure fornece opções como o Azure Batch para cargas de trabalho de computação de grande porte gerenciadas ou o HPC Pack para gerenciamento de cluster mais tradicional. Essas arquiteturas podem aumentar a capacidade conforme a demanda e escalar para milhares de núcleos quando necessário.

Estilos de arquitetura como restrições

Um estilo de arquitetura coloca restrições no design, incluindo o conjunto de elementos que podem aparecer e as relações permitidas entre esses elementos. As restrições orientam a "forma" de uma arquitetura restringindo o universo de opções. Quando uma arquitetura está em conformidade com as restrições de um estilo específico, determinadas propriedades desejáveis surgem.

Por exemplo, as restrições em microsserviços incluem:

  • Um serviço representa uma única responsabilidade.
  • Cada serviço é independente dos outros.
  • Os dados são privados para o serviço que o possui. Os serviços não compartilham dados.

Ao aderir a essas restrições, você obtém um sistema que permite executar as seguintes ações:

  • Implantar serviços de forma independente.
  • Isolar falhas.
  • Envie mais atualizações frequentes.
  • Introduza novas tecnologias no aplicativo com mais facilidade.

Cada estilo de arquitetura tem suas próprias compensações. Antes de escolher um estilo arquitetônico, é essencial entender os princípios e restrições subjacentes. Sem esse entendimento, você corre o risco de criar um design que esteja superficialmente em conformidade com o estilo sem perceber seus benefícios completos. Concentre-se mais no motivo pelo qual você está selecionando um estilo específico do que em como implementá-lo. Seja prático. Às vezes é melhor relaxar uma restrição do que perseguir a puridade arquitetônica.

Idealmente, a escolha do estilo arquitetônico deve ser feita com a contribuição de partes interessadas informadas sobre a carga de trabalho. A equipe de carga de trabalho deve começar identificando a natureza do problema que está resolvendo. Em seguida, eles devem definir os principais drivers de negócios e as características de arquitetura correspondentes, também conhecidos como requisitos não funcionais, e priorizá-los. Por exemplo, se o tempo de comercialização for crítico, a equipe poderá priorizar a manutenção, a testabilidade e a confiabilidade para habilitar a implantação rápida. Se a equipe tiver restrições de orçamento apertadas, a viabilidade e a simplicidade poderão ter precedência. Selecionar e manter um estilo de arquitetura não é uma tarefa única. Requer medida contínua, validação e refinamento. Como a mudança da direção arquitetônica mais tarde pode ser dispendiosa, muitas vezes vale a pena investir mais esforços antecipadamente para dar suporte à eficiência de longo prazo e reduzir os riscos.

A tabela a seguir resume como cada estilo gerencia dependências e os tipos de domínio mais adequados para cada estilo.

Estilo de arquitetura Gerenciamento de dependências Tipo de domínio
N camadas Camadas horizontais divididas por sub-rede Domínio comercial tradicional. A frequência de atualizações é baixa.
Trabalhador de fila da Web Trabalhos de front-end e back-end, dissociados por mensagens assíncronas. Domínio relativamente simples com algumas tarefas com uso intensivo de recursos.
Microsserviços Serviços decompostos verticalmente (funcionalmente) que chamam uns aos outros por meio de APIs. Domínio complicado. Atualizações frequentes.
Arquitetura orientada a eventos Produtor ou consumidor. Exibição independente para cada subsistema. Internet das Coisas (IoT) e sistemas em tempo real.
Big Data Divida um enorme conjunto de dados em pequenos blocos. Processamento paralelo em conjuntos de dados locais. Análise de dados em lote e em tempo real. Análise preditiva usando machine learning.
Computação de grande porte Alocação de dados para milhares de núcleos. Domínios computacionais intensivos, como simulação.

Considere desafios e benefícios

As restrições também criam desafios, portanto, é importante entender as compensações quando você adota qualquer um desses estilos. Determine se os benefícios do estilo de arquitetura superam os desafios para esse subdomínio e contexto limitado.

Considere os seguintes tipos de desafios ao selecionar um estilo de arquitetura:

  • Complexidade: A complexidade da arquitetura deve corresponder ao domínio. Se for muito simplista, pode resultar em uma grande bola de lama, onde as dependências não são bem gerenciadas e a estrutura quebra.

  • Mensagens assíncronas e consistência eventual: As mensagens assíncronas são usadas para desacoplar serviços e melhorar a confiabilidade porque as mensagens podem ser repetidas. Ele também aprimora a escalabilidade. No entanto, o sistema de mensagens assíncrona também cria desafios para lidar com a consistência eventual e a possibilidade de mensagens duplicadas.

  • Comunicação entre serviços: Decompor um aplicativo em serviços separados pode aumentar a sobrecarga de comunicação. Em arquiteturas de microsserviços, essa sobrecarga geralmente resulta em problemas de latência ou congestionamento de rede.

  • Gerenciamento: O gerenciamento do aplicativo inclui tarefas como monitoramento, implantação de atualizações e manutenção da integridade operacional.

  • Dez princípios de design para aplicativos do Azure

Próximas etapas