Partager via


Styles d’architecture

Un style d’architecture est une famille d’architectures qui partagent des caractéristiques spécifiques. Par exemple, le niveau N est un style d’architecture courant. Plus récemment, les architectures de microservice commencent à gagner en faveur. Les styles d’architecture ne nécessitent pas l’utilisation de technologies spécifiques, mais certaines technologies sont mieux adaptées à certaines architectures. Par exemple, les conteneurs sont bien adaptés aux microservices.

Nous avons identifié un ensemble de styles d’architecture couramment trouvés dans les applications cloud. L’article pour chaque style comprend les composants suivants :

  • Description et diagramme logique du style
  • Recommandations pour quand choisir ce style
  • Avantages, défis et meilleures pratiques
  • Déploiement recommandé qui utilise des services Azure pertinents

Une visite guidée rapide des styles

Cette section présente rapidement les styles d’architecture que nous avons identifiés, ainsi que quelques considérations générales pour leur utilisation. Cette liste n’est pas exhaustive. Pour plus d’informations, consultez les articles liés.

Niveau N

Diagramme logique d’un style d’architecture de niveau N.

La couche N est une architecture traditionnelle pour les applications d’entreprise qui divise une application en couches logiques et niveaux physiques. Chaque couche a une responsabilité spécifique et les couches gèrent les dépendances en appelant uniquement les couches sous elles. Les couches classiques incluent la présentation, la logique métier et l’accès aux données.

Les architectures multiniveau conviennent parfaitement à la migration d’applications existantes qui utilisent déjà une architecture en couches. Cette approche nécessite des modifications minimales lorsque vous passez à Azure et prend en charge des environnements mixtes avec des composants locaux et cloud. Toutefois, la superposition horizontale peut compliquer l’introduction de modifications sans affecter plusieurs parties de l’application, ce qui limite l’agilité pour les mises à jour fréquentes.

Web-File d’attente-Worker

Diagramme logique du style d’architecture Web-Queue-Worker.

Web-Queue-Worker est une architecture qui se compose d’un serveur frontal web, d’une file d’attente de messages et d’un worker back-end. Le serveur frontal web gère les requêtes HTTP et les interactions avec l'utilisateur, tandis que l'agent effectue des tâches gourmandes en ressources, des workflows de longue durée ou des opérations par lots. La communication entre l'interface utilisateur et le processus de travail se produit via une file d’attente de messages asynchrone.

Cette architecture est idéale pour les applications avec des domaines relativement simples qui ont des exigences de traitement gourmandes en ressources. Il est facile de comprendre et de déployer avec des services Azure gérés comme App Service et Azure Functions. Vous pouvez mettre à l’échelle le serveur frontal et le processus de travail indépendamment pour offrir une flexibilité dans l’allocation des ressources. Mais sans conception minutieuse, les deux composants peuvent devenir volumineux et monolithiques.

Microservices

Diagramme logique du style d’architecture des microservices.

Le diagramme illustre une architecture de microservices distribuée organisée en couches fonctionnelles distinctes. À gauche, les applications clientes et les systèmes externes lancent des requêtes qui transitent par une passerelle API centralisée, qui sert de point d’entrée unique et de mécanisme de routage pour l’ensemble du système. La passerelle d’API dirige les requêtes vers la couche de microservices appropriée, qui contient plusieurs types de services : les services de domaine qui encapsulent des fonctionnalités métier spécifiques, les services de composition qui orchestrent les interactions entre les services de domaine et les services individuels qui gèrent des fonctions discrètes. Chaque microservice conserve l’autonomie des données via sa propre base de données dédiée. Le diagramme montre une approche de persistance polyglotte à l’aide de bases de données SQL et NoSQL adaptées aux exigences spécifiques de chaque service en matière de données. Les microservices communiquent de façon asynchrone via un intergiciel orienté message. Cette approche permet un couplage libre par le biais de modèles de publication-abonnement et d’interactions pilotées par les événements. Trois couches d’infrastructure fondamentales prennent en charge cette architecture distribuée : les systèmes d’observabilité fournissent une surveillance complète, la journalisation et le suivi distribué entre les limites du service. Les plateformes de gestion et d’orchestration gèrent le déploiement automatisé, la mise à l’échelle et la découverte de services. Les chaînes d’outils DevOps permettent l’intégration, le test et les pipelines de livraison continus pour les déploiements de services indépendants.

L’architecture des microservices décompose les applications en une collection de petits services autonomes. Chaque service implémente une seule fonctionnalité métier dans un contexte limité et est autonome avec son propre stockage de données. Les services communiquent via des API bien définies et peuvent être développés, déployés et mis à l’échelle indépendamment.

Les microservices permettent aux équipes de travailler de manière autonome et de prendre en charge les mises à jour fréquentes avec une vitesse de mise en production plus élevée. Cette architecture est bien adaptée aux domaines complexes qui nécessitent des changements fréquents et une innovation. Toutefois, il introduit une complexité significative dans les domaines tels que la découverte de services, la cohérence des données et la gestion du système distribué. La réussite nécessite un développement mature et des pratiques DevOps, ce qui le rend plus adapté aux organisations qui ont des fonctionnalités techniques avancées.

Architecture basée sur les événements

Diagramme d’un style d’architecture piloté par les événements.

Le diagramme illustre un modèle de communication asynchrone découplé fondamental pour les architectures pilotées par les événements. Plusieurs producteurs d’événements fonctionnent indépendamment. Flux générés d’événements basés sur les activités métier, les interactions utilisateur ou les modifications d’état du système sans connaître les consommateurs en aval. Les producteurs alimentent leurs événements dans un système centralisé d’ingestion d’événements qui sert de répartiteur intelligent. Le répartiteur reçoit, valide, conserve et distribue de manière fiable les événements dans l’architecture. Le composant d’ingestion d’événement sert de point de découplage critique. Il garantit que les producteurs restent isolés des consommateurs tout en offrant des garanties autour de la livraison, de la commande et de la durabilité des événements. À partir de ce hub central, les événements sont distribués par le biais d’un modèle de fan-out à plusieurs consommateurs d’événements indépendants positionnés sur le côté droit du diagramme. Chaque consommateur représente une fonctionnalité métier ou un service distinct qui s’abonne à des types d’événements spécifiques correspondant à ses responsabilités de domaine. Les consommateurs traitent les événements de manière asynchrone et en parallèle, ce qui permet au système de s’adapter horizontalement tout en conservant un couplage libre. Ce modèle architectural supprime les dépendances directes entre les producteurs et les consommateurs. Il permet à chaque composant d’évoluer, de mettre à l’échelle et de déployer indépendamment tout en conservant la résilience du système via les fonctionnalités de mise en mémoire tampon et de nouvelle tentative du répartiteur d’événements.

Les architectures pilotées par les événements utilisent un modèle d’abonnement de publication où les producteurs d’événements génèrent des flux d’événements et les consommateurs d’événements répondent à ces événements en quasi-temps réel. Les producteurs et les consommateurs sont découplés les uns des autres, la communication se produisant par le biais de canaux d’événements ou de répartiteurs. Cette architecture prend en charge le traitement d’événements simple et l’analyse complexe des modèles d’événements.

Les architectures pilotées par les événements excellent dans les scénarios qui nécessitent un traitement en temps réel avec une latence minimale. Voici quelques exemples de solutions IoT, de systèmes de trading financiers ou d’applications qui doivent traiter des volumes élevés de données de streaming. Les architectures pilotées par les événements offrent une excellente scalabilité et une isolation des pannes, mais présentent des défis autour de la livraison garantie, de l’ordre des événements et de la cohérence éventuelle entre les composants distribués.

Big Data

Diagramme logique d’un style d’architecture Big Data.

Le diagramme présente une architecture big data complète avec deux pipelines de traitement complémentaires qui gèrent différentes vitesses de données et exigences analytiques. Le pipeline de traitement par lots commence par diverses sources de données qui alimentent des systèmes de stockage de données évolutifs, généralement des lacs de données ou des systèmes de fichiers distribués capables de stocker des volumes massifs de données structurées, semi-structurées et non structurées. Le composant de traitement par lots effectue des transformations, des agrégations et des calculs analytiques à grande échelle sur les données historiques. Il fonctionne à intervalles planifiés ou lorsque des données suffisantes s’accumulent. Les résultats du traitement par lots transitent par deux voies : directement vers les systèmes d’analyse et de création de rapports pour une consommation immédiate et vers les magasins de données analytiques où les données traitées sont conservées dans des formats optimisés pour les requêtes complexes et l’analyse historique. Simultanément, le pipeline de traitement en temps réel capture les données de streaming via des systèmes d’ingestion de messages en temps réel qui gèrent des flux de données à haute vitesse à partir de sources telles que des appareils IoT, des applications web ou des systèmes transactionnels. Les composants de traitement de flux analysent ces données en mouvement, effectuant des agrégations en temps réel, le filtrage et la détection de modèles pour générer des insights immédiats. Les résultats en temps réel suivent également deux voies, alimentant directement l'analyse et la création de rapports pour les tableaux de bord et les alertes instantanées, ainsi que dans les mêmes magasins de données analytiques afin de créer une représentation unifiée combinant les données historiques et actuelles. La couche d’orchestration s’étend sur les deux pipelines. Il coordonne les flux de travail complexes, gère les dépendances entre les travaux de traitement par lots et de streaming, planifie les tâches de traitement et garantit la cohérence des données dans l’ensemble de l’architecture. Cette orchestration vous permet de créer des architectures lambda où le traitement par lots et en temps réel peut fonctionner sur les mêmes jeux de données, fournissant à la fois une analyse historique complète et une intelligence opérationnelle immédiate.

Les architectures Big Data gèrent l’ingestion, le traitement et l’analyse des données trop volumineuses ou complexes pour les systèmes de base de données traditionnels. Ces architectures incluent généralement des composants pour le stockage des données (comme les lacs de données), le traitement par lots pour l’analyse historique, le traitement de flux pour les insights en temps réel et les magasins de données analytiques pour la création de rapports et la visualisation.

Les architectures Big Data sont essentielles pour les organisations qui doivent extraire des insights à partir de jeux de données massifs, prendre en charge l’analytique prédictive à l’aide du Machine Learning ou traiter des données de streaming en temps réel à partir d’appareils IoT. Les implémentations modernes utilisent souvent des services managés comme Microsoft Fabric pour simplifier la création et la maintenance de solutions Big Data.

Big Compute

Diagramme illustrant un style d’architecture de calcul volumineux.

Le diagramme illustre une distribution et un système d’exploitation sophistiqués conçus pour les charges de travail de calcul hautes performances. Au point d’entrée, les applications clientes envoient des travaux gourmands en calcul via une interface de file d’attente de travaux qui agit comme un mécanisme de mémoire tampon et d’entrée pour les demandes de travail entrantes. Les travaux circulent dans un planificateur centralisé ou un composant coordinateur qui sert de cerveau intelligent du système, responsable de l’analyse des caractéristiques du travail, des besoins en ressources et des dépendances de calcul. Le planificateur exécute des fonctions critiques, notamment la décomposition des travaux, la planification de l’allocation des ressources et l’optimisation de la charge de travail en fonction des ressources informatiques disponibles et des interdépendances des tâches. À partir de ce point de coordination central, le planificateur achemine intelligemment le travail sur deux voies d’opération distinctes en fonction des caractéristiques de calcul de chaque travail. La première voie dirige le travail vers des environnements de gestion de tâches parallèles conçus pour des charges de travail parallèles embarrassantes où les tâches individuelles peuvent s’exécuter indépendamment sans nécessiter de communication entre les unités de traitement. Ces tâches parallèles sont réparties simultanément sur des centaines ou des milliers de cœurs, chaque cœur traitant en isolation des unités de travail discrètes. La deuxième voie gère des tâches étroitement couplées qui nécessitent une communication interprocessus fréquente, un accès à la mémoire partagée ou des modèles d’opération synchronisés. Ces charges de travail étroitement couplées utilisent généralement des interconnexions à grande vitesse telles que InfiniBand ou des réseaux d’accès direct à distance (RDMA) pour permettre un échange rapide de données entre les nœuds de traitement. Le planificateur surveille en permanence les deux environnements d’opération, gère l’allocation des ressources, gère la tolérance de panne et optimise les performances en ajustant dynamiquement la distribution du travail en fonction de la capacité du système, des priorités de travail et des exigences d’achèvement. L’approche bifurcatée permet à l’architecture de gérer efficacement diverses charges de travail de calcul tout en optimisant l’utilisation des ressources dans l’ensemble de l’infrastructure informatique.

Les architectures de calcul volumineuses prennent en charge les charges de travail à grande échelle qui nécessitent des centaines ou des milliers de cœurs pour des opérations nécessitant beaucoup de ressources de calcul. Le travail peut être divisé en tâches discrètes qui s'exécutent simultanément sur de nombreux cœurs, chaque tâche effectuant sa prise d'entrée, son traitement, et sa production de sortie. Les tâches peuvent être indépendantes (embarrassantement parallèles) ou étroitement couplées nécessitant une communication haute vitesse.

Le big compute est essentiel pour les simulations, la modélisation des risques financiers, l’informatique scientifique, l’analyse du stress technique et le rendu 3D. Azure fournit des options telles qu’Azure Batch pour les charges de travail de calcul volumineuses gérées ou HPC Pack pour une gestion de cluster plus traditionnelle. Ces architectures peuvent augmenter la capacité de manière élastique à la demande et s'étendre à des milliers de cœurs si nécessaire.

Styles d’architecture en tant que contraintes

Un style d’architecture place des contraintes sur la conception, y compris l’ensemble d’éléments qui peuvent apparaître et les relations autorisées entre ces éléments. Les contraintes guident la « forme » d’une architecture en limitant l’univers des choix. Lorsqu’une architecture est conforme aux contraintes d’un style particulier, certaines propriétés souhaitables émergent.

Par exemple, les contraintes dans les microservices sont les suivantes :

  • Un service représente une responsabilité unique.
  • Chaque service est indépendant des autres.
  • Les données sont privées au service qui le possède. Les services ne partagent pas de données.

Lorsque vous respectez ces contraintes, vous bénéficiez d’un système qui vous permet d’effectuer les actions suivantes :

  • Déployez des services indépendamment.
  • Isoler les pannes.
  • Envoyer des mises à jour plus fréquentes.
  • Introduisez plus facilement de nouvelles technologies dans l’application.

Chaque style d’architecture a ses propres compromis. Avant de choisir un style architectural, il est essentiel de comprendre les principes et contraintes sous-jacents. Sans cette compréhension, vous risquez de créer une conception qui se conforme superficiellement au style sans réaliser ses avantages complets. Concentrez-vous davantage sur la raison pour laquelle vous sélectionnez un style spécifique que sur la façon de l’implémenter. Soyez pratique. Parfois, il est préférable de détendre une contrainte que de chercher la pureté architecturale.

Dans l’idéal, le choix du style architectural doit être effectué avec des commentaires des parties prenantes de la charge de travail informées. L’équipe de charge de travail doit commencer par identifier la nature du problème qu’elle résout. Ils doivent ensuite définir les principaux facteurs métier et les caractéristiques d’architecture correspondantes, également appelées exigences non fonctionnelles, et les hiérarchiser. Par exemple, si le temps de commercialisation est critique, l’équipe peut hiérarchiser la maintenance, la testabilité et la fiabilité pour permettre un déploiement rapide. Si l’équipe a des contraintes budgétaires serrées, la faisabilité et la simplicité peuvent être prioritaires. La sélection et la prise en charge d’un style architectural ne sont pas une tâche ponctuelle. Elle nécessite une mesure, une validation et un affinement continus. Étant donné que la modification de la direction architecturale peut être coûteuse ultérieurement, il est souvent utile d’investir davantage d’efforts pour soutenir l’efficacité à long terme et réduire les risques.

Le tableau suivant résume la façon dont chaque style gère les dépendances et les types de domaine les mieux adaptés à chaque style.

Style d’architecture Gestion des dépendances Type de domaine
Niveau N Niveaux horizontaux divisés par sous-réseau Domaine métier traditionnel. La fréquence des mises à jour est faible.
Web-Queue-Worker Tâches de développement front-end et back-end, découplées par la communication asynchrone. Domaine relativement simple avec certaines tâches gourmandes en ressources.
Microservices Les services décomposés verticalement (fonctionnellement) qui s’appellent les uns les autres par le biais d’API. Domaine compliqué. Mises à jour fréquentes.
Architecture pilotée par les événements Producteur ou consommateur. Vue indépendante pour chaque sous-système. Internet des objets (IoT) et systèmes en temps réel.
Big Data Divisez un jeu de données énorme en petits blocs. Traitement parallèle sur les jeux de données locaux. Analyse des données par lots et en temps réel. Analyse prédictive à l’aide du Machine Learning.
Calcul intensif Allocation des données à des milliers de cœurs. Domaines gourmands en calcul, tels que la simulation.

Prendre en compte les défis et les avantages

Les contraintes créent également des défis, il est donc important de comprendre les compromis lorsque vous adoptez l’un de ces styles. Déterminez si les avantages du style d’architecture l’emportent sur les défis, pour ce sous-domaine et ce contexte limité.

Tenez compte des types de défis suivants lorsque vous sélectionnez un style d’architecture :

  • Complexité: La complexité de l’architecture doit correspondre au domaine. Si c’est trop simpliste, cela peut entraîner une grosse boule de boue, où les dépendances ne sont pas bien gérées et la structure se décompose.

  • Messagerie asynchrone et cohérence éventuelle : La messagerie asynchrone est utilisée pour dissocier les services et améliorer la fiabilité, car les messages peuvent être retentés. Il améliore également l’extensibilité. Toutefois, la messagerie asynchrone crée également des difficultés pour gérer la cohérence éventuelle et la possibilité de dupliquer les messages.

  • Communication interservice : La décomposition d’une application en services distincts peut augmenter la surcharge de communication. Dans les architectures de microservices, cette surcharge entraîne souvent des problèmes de latence ou une congestion du réseau.

  • Gérabilité: La gestion de l’application inclut des tâches telles que la surveillance, le déploiement de mises à jour et la maintenance de l’intégrité opérationnelle.

  • Dix principes de conception pour les applications Azure

Étapes suivantes