Architecture logicielle et conception de systèmes : vue d'ensemble et guide de ressources

Bonjour chers collègues.

Aujourd'hui, nous vous proposons une traduction d'un article de Tugberk Ugurlu, qui a entrepris de décrire dans un volume relativement petit les principes de la conception de systèmes logiciels modernes. Voici ce que l'auteur dit de lui-même en résumé :

Architecture logicielle et conception de systèmes : vue d'ensemble et guide de ressources
Puisqu'il est absolument impossible d'aborder dans un article habro un sujet aussi colossal que les modèles architecturaux + modèles de conception à partir de 2019, nous recommandons non seulement le texte de M. Uruglu lui-même, mais également les nombreux liens qu'il y a aimablement inclus. Si vous l'aimez, nous publierons un texte plus spécialisé sur la conception de systèmes distribués.

Architecture logicielle et conception de systèmes : vue d'ensemble et guide de ressources

Photo Isaac Smith depuis Unsplash

Si vous n'avez jamais eu à faire face à des défis tels que la conception d'un système logiciel à partir de zéro, alors lorsque vous démarrez un tel travail, vous ne savez parfois même pas par où commencer. Je crois que vous devez d'abord tracer des limites afin d'avoir une idée plus ou moins sûre de ce que vous allez concevoir exactement, puis retrousser vos manches et travailler dans ces limites. Comme point de départ, vous pouvez prendre un produit ou un service (idéalement celui que vous aimez vraiment) et découvrir comment le mettre en œuvre. Vous pourriez être étonné de voir à quel point ce produit semble simple et à quel point il est complexe. N'oubliez pas: simple - généralement complexe, et ce n'est pas grave.

Je pense que le meilleur conseil que je puisse donner à quiconque commence à concevoir un système est le suivant : ne faites aucune hypothèse ! Dès le début, vous devez préciser les faits connus sur ce système et les attentes qui y sont associées. Voici quelques bonnes questions à poser pour vous aider à démarrer votre conception :

  • Quel est le problème que nous essayons de résoudre ?
  • Quel est le nombre maximal d’utilisateurs qui interagiront avec notre système ?
  • Quels modèles d’écriture et de lecture des données allons-nous utiliser ?
  • Quels sont les cas d’échec attendus, comment allons-nous les gérer ?
  • Quelles sont les attentes en matière de cohérence et de disponibilité du système ?
  • Devez-vous prendre en compte des exigences liées à la vérification externe et à la réglementation lorsque vous travaillez ?
  • Quels types de données sensibles allons-nous stocker ?

Ce ne sont là que quelques questions qui m’ont été utiles ainsi qu’aux équipes auxquelles j’ai participé au fil des années d’activité professionnelle. Si vous connaissez les réponses à ces questions (et à toutes autres questions pertinentes au contexte dans lequel vous devez travailler), vous pouvez alors approfondir progressivement les détails techniques du problème.

Définir le niveau initial

Qu’est-ce que j’entends par « référence » ici ? En fait, à notre époque, la plupart des problèmes de l’industrie du logiciel « peuvent » être résolus en utilisant les méthodes et technologies existantes. Ainsi, en naviguant dans ce paysage, vous obtenez une certaine longueur d’avance face à des problèmes que quelqu’un d’autre a dû résoudre avant vous. N'oubliez pas que les programmes sont écrits pour résoudre les problèmes des entreprises et des utilisateurs, nous nous efforçons donc de résoudre le problème de la manière la plus directe et la plus simple (du point de vue de l'utilisateur). Pourquoi est-ce important de s’en souvenir ? Peut-être que dans votre système de coordonnées, vous aimez rechercher des solutions uniques à tous les problèmes, parce que vous vous demandez : « quel genre de programmeur suis-je si je suis des modèles partout » ? En fait, l'art ici consiste à prendre des décisions sur où et quoi faire. Bien entendu, chacun de nous doit faire face de temps à autre à des problèmes uniques, qui constituent chacun un véritable défi. Cependant, si notre niveau initial est clairement défini, alors nous savons à quoi consacrer notre énergie : rechercher des options toutes faites pour résoudre le problème qui nous est posé, ou l'étudier plus en profondeur et acquérir une compréhension plus profonde.

Je pense avoir pu vous convaincre que si un spécialiste comprend avec confiance ce qu'est la composante architecturale de certains merveilleux systèmes logiciels, alors cette connaissance sera indispensable pour maîtriser l'art d'un architecte et développer une base solide dans ce domaine.

D'accord, alors par où commencer ? U Donna Martina Il existe un référentiel sur GitHub appelé amorce-de-conception-de-système, à partir duquel vous pourrez apprendre à concevoir des systèmes à grande échelle, ainsi que vous préparer à des entretiens sur ce sujet. Le référentiel a une section avec des exemples architectures réelles, où, en particulier, il est examiné comment ils abordent la conception de leurs systèmes quelques entreprises bien connuespar exemple Twitter, Uber, etc.

Cependant, avant de passer à ce sujet, examinons de plus près les défis architecturaux les plus importants auxquels nous sommes confrontés dans la pratique. Ceci est important car il faut préciser de NOMBREUX aspects d’un problème tenace et multiforme, puis le résoudre dans le cadre des réglementations en vigueur dans un système donné. Jackson Gabbard, un ancien employé de Facebook, a écrit Vidéo de 50 minutes sur les entretiens de conception de systèmes, où il a partagé sa propre expérience de sélection de centaines de candidats. Même si la vidéo se concentre fortement sur la conception de grands systèmes et sur les critères de réussite importants lors de la recherche d'un candidat pour un tel poste, elle servira néanmoins de ressource complète sur les éléments les plus importants lors de la conception de systèmes. Je suggère également sommaire cette vidéo.

Développer des connaissances sur le stockage et la récupération de données

En règle générale, votre décision concernant la manière dont vous stockez et récupérez vos données à long terme a un impact critique sur les performances du système. Par conséquent, vous devez d’abord comprendre les caractéristiques d’écriture et de lecture attendues de votre système. Il faut ensuite être capable d'évaluer ces indicateurs et de faire des choix en fonction des évaluations réalisées. Cependant, vous ne pouvez effectuer efficacement ce travail que si vous comprenez les modèles de stockage de données existants. En principe, cela implique de solides connaissances liées à sélection de base de données.

Les bases de données peuvent être considérées comme des structures de données extrêmement évolutives et durables. Par conséquent, la connaissance des structures de données devrait vous être très utile lors du choix d’une base de données particulière. Par exemple, Redis est un serveur de structure de données qui prend en charge différents types de valeurs. Il vous permet de travailler avec des structures de données telles que des listes et des ensembles, et de lire des données à l'aide d'algorithmes bien connus, par exemple : Lru, organisant ce travail dans un style durable et hautement accessible.

Architecture logicielle et conception de systèmes : vue d'ensemble et guide de ressources

Photo Samuel Zeller depuis Unsplash

Une fois que vous avez une compréhension suffisante des différents modèles de stockage de données, passez à l’étude de la cohérence et de la disponibilité des données. Tout d'abord, vous devez comprendre Théorème du CAP au moins en termes généraux, puis peaufiner ces connaissances en examinant de plus près les modèles établis cohérence и la disponibilité. De cette façon, vous développerez une compréhension du domaine et comprendrez que la lecture et l’écriture de données sont en fait deux problèmes très différents, chacun avec ses propres défis. Armé de quelques modèles de cohérence et de disponibilité, vous pouvez augmenter considérablement les performances du système tout en garantissant un flux de données fluide vers vos applications.

Enfin, pour conclure la conversation sur les problèmes de stockage des données, nous devrions également mentionner la mise en cache. Doit-il fonctionner simultanément sur le client et le serveur ? Quelles données seront dans votre cache ? Et pourquoi? Comment organiser l’invalidation du cache ? Est-ce que cela sera fait régulièrement, à certains intervalles ? Si oui, à quelle fréquence ? Je recommande de commencer à étudier ces sujets avec section suivante l’introduction à la conception du système susmentionnée.

Modèles de communication

Les systèmes sont constitués de divers composants ; il peut s'agir de différents processus exécutés au sein du même nœud physique ou de différentes machines exécutées sur différentes parties de votre réseau. Certaines de ces ressources au sein de votre réseau peuvent être privées, mais d'autres doivent être publiques et ouvertes aux consommateurs qui y accèdent de l'extérieur.

Il est nécessaire d'assurer la communication de ces ressources entre elles, ainsi que l'échange d'informations entre l'ensemble du système et le monde extérieur. Dans le contexte de la conception de systèmes, nous sommes là encore confrontés à un ensemble de défis nouveaux et uniques. Voyons comment ils peuvent être utiles flux de tâches asynchrones, et quoi pUne variété de modèles de communication sont disponibles.

Architecture logicielle et conception de systèmes : vue d'ensemble et guide de ressources

Photo Tony Stoddard depuis Unsplash

Lors de l'organisation de la communication avec le monde extérieur, il est toujours très important sécurité, dont la mise en place doit également être prise au sérieux et activement poursuivie.

Répartition des connexions

Je ne suis pas sûr que placer ce sujet dans une section distincte semble justifié à tout le monde. Néanmoins, je présenterai ce concept en détail ici, et je pense que le matériel de cette section est décrit le plus précisément par le terme « distribution de connexions ».

Les systèmes sont formés en connectant correctement de nombreux composants, et leur communication entre eux est souvent organisée sur la base de protocoles établis, par exemple TCP et UDP. Cependant, ces protocoles en tant que tels sont souvent insuffisants pour répondre à tous les besoins des systèmes modernes, qui fonctionnent souvent sous des charges élevées et dépendent également fortement des besoins des utilisateurs. Il est souvent nécessaire de trouver des moyens de répartir les connexions pour faire face à des charges aussi élevées sur le système.

Cette distribution est basée sur le célèbre Système de noms de domaines (DNS). Un tel système permet des transformations de noms de domaine telles que des méthodes de round robin pondéré et basées sur la latence pour aider à répartir la charge.

L'équilibrage de charge est d'une importance fondamentale, et pratiquement tous les grands systèmes Internet avec lesquels nous traitons aujourd'hui sont situés derrière un ou plusieurs équilibreurs de charge. Les équilibreurs de charge aident à répartir les demandes des clients sur plusieurs instances disponibles. Les équilibreurs de charge sont à la fois matériels et logiciels, cependant, dans la pratique, vous devez le plus souvent faire face à des logiciels, par exemple HAProxy и ELB. Proxy inversés conceptuellement également très similaire aux équilibreurs de charge, bien qu'il existe une plage entre le premier et le deuxième différences distinctes. Ces différences doivent être prises en compte lors de la conception d'un système en fonction de vos besoins.

Vous devriez également connaître réseaux de diffusion de contenu (CAN). Un CDN est un réseau distribué mondial de serveurs proxy qui fournit des informations à partir de nœuds géographiquement situés plus près d'un utilisateur spécifique. Il est préférable d'utiliser les CDN si vous travaillez avec des fichiers statiques écrits en JavaScript, CSS et HTML. De plus, les services cloud fournissant des gestionnaires de trafic sont courants aujourd'hui, par exemple, Gestionnaire de trafic Azure, vous offrant une distribution mondiale et une latence réduite lorsque vous travaillez avec du contenu dynamique. Cependant, ces services sont généralement utiles dans les cas où vous devez travailler avec des services Web sans état.

Parlons de logique métier. Structuration de la logique métier, des flux de tâches et des composants

Nous avons donc réussi à discuter de divers aspects infrastructurels du système. Très probablement, l’utilisateur ne pense même pas à tous ces éléments de votre système et, franchement, ne s’en soucie pas du tout. L'utilisateur s'intéresse à ce que signifie interagir avec votre système, à ce qui peut être réalisé en faisant cela, ainsi qu'à la manière dont le système exécute les commandes utilisateur, à quoi et comment il fait avec les données utilisateur.

Comme le titre de cet article l’indique, j’allais parler d’architecture logicielle et de conception de systèmes. En conséquence, je n’avais pas prévu d’aborder les modèles de conception logicielle décrivant la manière dont les composants logiciels sont créés. Cependant, plus j’y pense, plus il me semble que la frontière entre les modèles de conception logicielle et les modèles architecturaux est très floue, et que les deux concepts sont étroitement liés. Prenons par exemple inscription à un événement (sourcing d'événements). Une fois que vous aurez adopté ce modèle architectural, il affectera presque tous les aspects de votre système : stockage à long terme des données, niveau de cohérence adopté dans votre système, forme des composants qui le composent, etc. Par conséquent, j'ai décidé de mentionner certains modèles architecturaux directement liés à la logique métier. Même si cet article devra se limiter à une simple liste, je vous encourage à en prendre connaissance et à réfléchir aux idées associées à ces modèles. Te voilà:

Approches collaboratives

Il est extrêmement improbable que vous vous retrouviez sur un projet en tant que participant seul responsable du processus de conception du système. Au contraire, vous serez très probablement amené à interagir avec des collègues travaillant à la fois dans le cadre et en dehors de votre tâche. Dans ce cas, vous devrez peut-être évaluer les solutions technologiques sélectionnées avec des collègues, identifier les besoins de l'entreprise et comprendre la meilleure façon de paralléliser les tâches.

Architecture logicielle et conception de systèmes : vue d'ensemble et guide de ressources

Photo Kaléidico depuis Unsplash

La première étape consiste à développer une compréhension précise et partagée de l'objectif commercial que vous essayez d'atteindre et des éléments mobiles auxquels vous devrez faire face. Techniques de modélisation de groupe, notamment événements d'assaut (event storming) contribuent à accélérer considérablement ce processus et à augmenter vos chances de succès. Ce travail peut être effectué avant ou après avoir décrit limites de vos services, puis approfondissez-le à mesure que le produit mûrit. En fonction du niveau de cohérence qui sera atteint ici, vous pouvez également formuler langue commune pour le contexte limité dans lequel vous travaillez. Lorsque vous avez besoin de parler de l'architecture de votre système, cela peut vous être utile modèle C4proposé Simon Brun, surtout lorsque vous avez besoin de comprendre à quel point vous devrez entrer dans les détails du problème, en visualisant les choses que vous souhaitez communiquer.

Il existe probablement une autre technologie mature sur ce sujet qui n'est pas moins utile que le Domain Driven Design. Cependant, nous revenons en quelque sorte à la compréhension du domaine, donc aux connaissances et à l'expérience dans le domaine Conception basée sur le domaine devrait vous être utile.

Source: habr.com

Ajouter un commentaire