Architecture logicielle et conception de systèmes: guide général et ressources

Bonjour chers collègues.

Aujourd'hui, une traduction de l'article de Tugberk Ugurlu, qui a pris un volume relativement faible pour énoncer les principes de conception de systèmes logiciels modernes, est proposée à votre tribunal. Voici ce que l'auteur dit de lui en fin de compte:


Puisqu'il est absolument impossible de couvrir un sujet aussi colossal dans un article architectural que les modèles architecturaux + les modèles de conception à partir de 2019, nous recommandons non seulement le texte de M. Uruglu, mais aussi les nombreux liens qu'il y a aimablement mis. Si vous l'aimez, nous publierons un texte plus spécialisé sur la conception de systèmes distribués.



Isaac Smith a tiré de 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 commencez un tel travail, il n'est parfois même pas clair par où commencer. Je crois que vous devez d'abord définir les limites afin d'imaginer avec plus ou moins de confiance ce que vous allez concevoir exactement, puis retrousser vos manches et travailler sans dépasser ces limites. Comme point de départ, vous pouvez prendre un produit ou un service (idéalement - celui que vous aimez vraiment) et comprendre sa mise en œuvre. Vous pourriez être étonné de la simplicité de ce produit et de sa grande complexité cachée. N'oubliez pas: simple est généralement complexe , et c'est normal.

Je pense que le meilleur conseil que je puisse donner à ceux qui commencent à concevoir le système est le suivant: ne faites aucune hypothèse! Dès le début, il est nécessaire de concrétiser les faits connus sur ce système et les attentes qui lui sont associées. Voici quelques bonnes questions qui peuvent vous aider à commencer à concevoir:

  • 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 seront utilisés avec nous?
  • Quels sont les échecs attendus, comment allons-nous y faire face?
  • Quelles sont les attentes en matière de cohérence et de disponibilité du système?
  • Devez-vous tenir compte des exigences liées à la vérification et à la réglementation externes?
  • Quels types de données confidentielles allons-nous stocker?

Ce ne sont que quelques questions qui m'ont été utiles à la fois pour moi et pour les équipes auxquelles j'ai eu la chance de participer au fil des années d'activité professionnelle. Si vous connaissez les réponses à ces questions (et à toutes celles qui sont pertinentes dans le contexte dans lequel vous devez travailler), vous pouvez progressivement vous plonger dans les détails techniques de la tâche.

Définissez le niveau initial

Qu'est-ce que je veux dire ici par «référence»? 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. En conséquence, en étant guidé dans ce paysage, vous obtenez une certaine longueur d'avance, face à des tâches que quelqu'un devait 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 nécessaire de se souvenir? Peut-être que dans votre système de coordonnées, vous aimez chercher des solutions uniques pour toutes les tâches, car vous pensez, "quel genre de programmeur suis-je si je suis partout des modèles?" En fait, l' art ici est de prendre des décisions sur où et quoi faire . Bien sûr, chacun de nous doit de temps en temps faire face à des problèmes uniques, chacun étant un véritable défi. Cependant, si notre niveau initial est clairement défini, nous savons alors sur quoi dépenser notre énergie: rechercher des solutions toutes faites au problème qui nous est posé, ou étudier plus avant et approfondir notre compréhension.

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

OK, alors par où commencer? Donna Martin possède un référentiel sur GitHub appelé system-design-primer , sur la base duquel vous pouvez apprendre à concevoir des systèmes à grande échelle, ainsi que préparer des entretiens sur ce sujet. Le référentiel a une section avec des exemples d' architectures réelles , où, en particulier, il est examiné comment certaines entreprises bien connues , telles que Twitter, Uber, etc., abordent la conception de leurs systèmes.

Cependant, avant de passer à ce matériau, examinons de plus près les défis architecturaux les plus importants auxquels nous devons faire face dans la pratique. Ceci est important, car vous devez spécifier de NOMBREUX aspects du problème insoluble et multiforme, puis le résoudre dans le cadre de la réglementation en vigueur dans ce système. Jackson Gabbard , un ancien employé de Facebook, a enregistré une vidéo de 50 minutes sur les entretiens de conception de systèmes , où il a partagé sa propre expérience en examinant des centaines de demandeurs d'emploi. Malgré le fait que la vidéo se réfère expressément à la conception de grands systèmes et à des critères de réussite qui sont importants lors de la recherche d'un candidat pour un tel poste, elle servira néanmoins de ressource exhaustive sur les éléments les plus importants lors de la conception de systèmes. Je vous propose également un résumé de cette vidéo.

Acquérir des connaissances sur le stockage et la récupération de données

En règle générale, votre décision sur la façon dont vous stockerez et afficherez vos données pendant une longue période affecte de manière critique les performances du système. Par conséquent, vous devez d'abord comprendre les caractéristiques attendues de l'écriture et de la lecture des données dans votre système. Ensuite, vous devez être en mesure d'évaluer ces indicateurs et de faire un choix en fonction des estimations faites. Cependant, vous ne pouvez gérer efficacement ce travail que si vous comprenez les modèles existants de stockage de données. En principe, cela implique une connaissance fiable liée à la sélection de la base de données .

Les bases de données peuvent être considérées comme des structures de données caractérisées par une évolutivité et une durabilité exceptionnelles. Par conséquent, la connaissance des structures de données devrait vous être très utile lors du choix de l'une ou l'autre base de données. 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, de lire des données en utilisant des algorithmes bien connus, par exemple LRU , en organisant ce travail dans un style durable et très accessible.



Instantané de Samuel Zeller de Unsplash

Lorsque vous avez une bonne compréhension des différents modèles de stockage de données, continuez à étudier la cohérence et la disponibilité des données. Tout d'abord, vous devrez apprendre le théorème du CAP, au moins en termes généraux, puis affiner ces connaissances en examinant plus en détail les modèles établis de cohérence et d' accessibilité . Ainsi, vous développerez vos horizons dans ce domaine et comprendrez que la lecture et l'écriture de données sont en réalité deux problèmes très différents, et chacun d'eux a ses propres défis particuliers. Armé de plusieurs modèles pour garantir la cohérence et l'accessibilité, vous pouvez augmenter considérablement les performances du système tout en garantissant un flux de données ininterrompu vers vos applications.

Enfin, pour conclure la discussion sur les problèmes de stockage des données, il convient également de mentionner la mise en cache. Doit-il s'exécuter à la fois sur le client et sur le serveur? Quelles données seront dans votre cache? Et pourquoi? Comment organisez-vous l'invalidation du cache? Cela se fera-t-il régulièrement, à intervalles réguliers? Si oui, à quelle fréquence? Je recommande de commencer l'étude de ces sujets avec la section suivante de l' amorce susmentionnée sur la conception du système.

Modèles de communication

Les systèmes se composent de divers composants; il peut s'agir de différents processus exécutés à l'intérieur du même nœud physique ou de différentes machines fonctionnant dans 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, ici encore, nous sommes confrontés à un ensemble de nouveaux défis uniques. Nous découvrons comment les flux de tâches asynchrones peuvent être utiles et quels sont les différents modèles de communication disponibles .



Instantané de Tony Stoddard de Unsplash

Lors de l'organisation de la communication avec le monde extérieur, la sécurité est toujours très importante, qui doit également être abordée avec sérieux et implication active.

Distribution de connexion

Je ne suis pas sûr que placer ce sujet dans une section indépendante semblera justifié pour tout le monde. Néanmoins, je vais exposer ce concept ici, et je crois que le contenu de cette section est décrit avec le plus de précision par le terme «distribution de connexion».

Les systèmes sont formés en connectant correctement de nombreux composants, et leur communication les uns avec les autres est souvent organisée sur la base de protocoles établis, par exemple, TCP et UDP. Cependant, ces protocoles en tant que tels ne sont souvent pas suffisants pour satisfaire tous les besoins des systèmes modernes, qui sont souvent exploités sous une charge élevée, et dépendent également largement des besoins des utilisateurs. Il est souvent nécessaire de trouver des moyens de distribuer les composés pour faire face à ces charges élevées du système.

Cette distribution est basée sur le système de noms de domaine bien connu (DNS). Un tel système vous permet de convertir un nom de domaine, par exemple, un round robin pondéré et des méthodes basées sur les retards, qui aident à répartir la charge.

L'équilibrage de charge est fondamentalement important, et presque tous les grands systèmes sur Internet auxquels nous devons faire face aujourd'hui se trouvent derrière un ou plusieurs équilibreurs de charge. Les équilibreurs de charge vous aident à répartir les demandes des clients sur les nombreuses instances disponibles. Les équilibreurs de charge peuvent être du matériel ou des logiciels, cependant, dans la pratique, vous devez souvent gérer des logiciels, par exemple HAProxy et ELB . Les procurations inverses sont conceptuellement très similaires aux équilibreurs de charge, bien qu'il existe un certain nombre de différences distinctes entre le premier et le second. Ces différences doivent être prises en compte lors de la conception du système selon vos besoins.

Vous devez également connaître les réseaux de diffusion de contenu (CDN). CDN est un réseau mondial distribué de serveurs proxy qui fournit des informations à partir des nœuds qui sont géographiquement situés plus près d'un utilisateur spécifique. Les CDN sont préférés si vous travaillez avec des fichiers statiques écrits en JavaScript, CSS et HTML. De plus, de tels services cloud sont populaires aujourd'hui et fournissent des gestionnaires de trafic, par exemple, Azure Traffic Manager , qui vous offre une distribution globale et des délais réduits 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 enregistrer l'état.

Parlons de la 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 de l'infrastructure 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 inquiète pas du tout. L'utilisateur souhaite savoir comment interagir avec votre système, ce qui peut être réalisé en le faisant, et comment le système exécute les commandes utilisateur, quoi et comment faire avec les données utilisateur.

Comme le nom de cet article l'indique, j'allais y parler d'architecture logicielle et de conception de systèmes. En conséquence, je n'avais pas prévu de couvrir les modèles de conception de logiciels qui décrivent comment 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 de logiciels et les modèles architecturaux est très floue, et ces deux concepts sont étroitement liés. Prenons, par exemple, le sourcing d'événements. Si vous adoptez ce modèle architectural, il affectera presque tous les aspects de votre système: stockage de données à long terme, niveau de cohérence adopté dans votre système, contour des composants qu'il contient, etc., etc. J'ai donc décidé de mentionner quelques modèles architecturaux directement liés à la logique métier. Même si dans cet article vous devez vous limiter à une simple liste, je vous recommande de vous familiariser avec elle et de réfléchir aux idées liées à ces modèles. Vous voilà:


Approches collaboratives

Il est extrêmement improbable que vous vous retrouviez sur le projet en tant que participant seul responsable du processus de conception du système. Au contraire, vous devrez probablement interagir avec des collègues travaillant à la fois dans votre tâche et au-delà. Dans ce cas, vous devrez peut-être évaluer les solutions technologiques sélectionnées avec vos collègues, isoler les besoins de l'entreprise et comprendre comment mieux paralléliser les tâches.



Instantané Kaleidico de Unsplash

Tout d'abord, il sera nécessaire de développer une idée précise et universellement reconnue de l'objectif commercial que vous essayez d'atteindre et des éléments en mouvement avec lesquels vous devrez faire face. Les techniques de modélisation de groupe, en particulier les tempêtes d'événements, peuvent accélérer considérablement ce processus et augmenter vos chances de succès. Vous pouvez effectuer ce travail avant ou après avoir défini les limites de vos services , puis l'approfondir à mesure que le produit mûrit. En fonction du niveau de cohérence qui sera atteint ici, vous pouvez également formuler une seule langue pour le contexte limité dans lequel vous travaillez. Lorsque vous avez besoin de parler de l'architecture de votre système, vous pouvez utiliser le modèle C4 proposé par Simon Brown pour cela , surtout lorsque vous devez comprendre combien vous devrez approfondir les détails du problème en visualisant les choses que vous souhaitez signaler.

Il existe probablement une autre technologie mature dans ce sujet, non moins utile que la conception orientée sujet. Cependant, d'une manière ou d'une autre, nous revenons à la compréhension du domaine, donc les connaissances et l'expérience dans le domaine de la conception orientée sujet devraient vous être utiles.

Source: https://habr.com/ru/post/fr461283/


All Articles