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

Bonjour, collègues.

Aujourd'hui, nous vous proposons la traduction d'un article de Tugberk Ugurlu, qui s'est attelé à décrire, de manière relativement succincte, les principes de conception des systèmes logiciels modernes. Voici ce que l'auteur dit de lui dans l'intervalle :

Architecture logicielle et conception de systèmes : vue d'ensemble et guide des ressources
Étant donné qu'il est absolument impossible de couvrir dans un compte-rendu une telle vaste thématique que les modèles architecturaux + modèles de conception à l'état de 2019, nous recommandons non seulement le texte de M. Ugurlu, mais aussi les nombreuses références qu'il a gentiment fournies. Si cela vous plaît, nous publierons également 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 des ressources

Image d'Isaac Smith provenant du site Unsplash

Si vous n'avez jamais été confronté à des défis tels que la conception d'un système logiciel à partir de zéro, alors, en commençant ce travail, il est parfois difficile de savoir par où commencer. Je pense qu'il est d'abord nécessaire de définir les limites afin d'avoir une idée relativement claire de ce que vous allez concevoir, puis de retrousser vos manches et de 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 beaucoup) et analyser sa réalisation. Vous pourriez être surpris de voir à quel point ce produit semble simple, alors qu'en réalité, une immense complexité y est cachée. N'oubliez pas : le simple est généralement complexe, et c'est normal.

Je pense que le meilleur conseil que je puisse donner à ceux qui commencent à concevoir un système est le suivant : ne faites aucune hypothèse ! Dès le début, il faut préciser les faits connus sur ce système et les attentes qui l'entourent. Voici quelques bonnes questions dont les réponses vous aideront à commencer la 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 de données allons-nous utiliser ?
  • Quels sont les scénarios d'échec prévus, comment allons-nous y faire face ?
  • Quelles sont les attentes en matière de cohérence et de disponibilité du système ?
  • Faut-il tenir compte de certaines exigences liées à la vérification externe et à la réglementation ?
  • Quelles catégories de données confidentielles allons-nous stocker ?

Ce ne sont là que quelques questions qui m'ont été utiles dans mon travail, tant pour moi que pour les équipes avec lesquelles j'ai eu l'occasion de collaborer au cours de ma carrière professionnelle. Si vous connaissez les réponses à ces questions (et à toute autre question pertinente dans le contexte dans lequel vous travaillez), nous pouvons progressivement plonger dans les détails techniques de la tâche.

Définissons le niveau de référence

Que comprends-je ici par « niveau de référence » ? En réalité, de nos jours, la plupart des problèmes dans l'industrie du logiciel peuvent être « résolus » à l'aide des méthodes et technologies déjà disponibles. Ainsi, en vous orientant dans ce paysage, vous bénéficiez d'un certain avantage en face de problèmes que d'autres ont dû résoudre avant vous. N'oublions pas que les programmes sont écrits pour résoudre des problèmes d'entreprises et d'utilisateurs, c'est pourquoi nous cherchons à aborder les problèmes de la manière la plus directe et simple (du point de vue de l'utilisateur). Pourquoi est-il important de se rappeler cela ? Peut-être aimez-vous chercher des solutions uniques à chaque problème dans votre système de références, car vous pensez : « quel genre de programmeur suis-je si je suis toujours des modèles » ? En réalité, l'art ici consiste à prendre des décisions sur où et quoi faire. Bien sûr, chacun de nous est parfois confronté à des problèmes uniques, chacun d'eux représentant un véritable défi. Cependant, si notre niveau de référence est clairement défini, nous savons où concentrer nos efforts : soit chercher des solutions toutes faites au problème posé, soit approfondir son étude et sa compréhension.

Je pense avoir réussi à vous convaincre que, si un spécialiste maîtrise bien l'architecture de certains systèmes logiciels remarquables, ces connaissances seront indispensables pour maîtriser l'art de l'architecture et établir une solide base dans ce domaine.

Bien, par quoi commencer ? Donna Martin dispose d'un dépôt sur GitHub intitulé system-design-primer, à partir duquel vous pourrez apprendre à concevoir des systèmes à grande échelle, ainsi qu'à vous préparer à des entretiens sur ce sujet. Le dépôt comprend une section avec des exemples d'architectures réelles, où, en particulier, il est question de la manière dont ils abordent la conception de leurs systèmes certaines entreprises bien connues, comme Twitter, Uber, etc.

Cependant, avant d'aborder ce sujet, examinons plus en détail les défis architecturaux les plus importants auxquels on doit faire face dans la pratique. Cela est crucial, car il faut préciser de NOMBREUX aspects d'un problème complexe et multiforme, puis le résoudre dans le cadre de la réglementation en vigueur dans ce système. Jackson Gabbard, ancien employé de Facebook, a enregistré une vidéo de 50 minutes sur les entretiens consacrés à la conception de systèmes, où il a partagé son expérience après avoir examiné des centaines de candidats. Bien que la vidéo traite spécifiquement de la conception de grands systèmes et des critères de succès importants lors de la sélection d'un candidat pour ce poste, elle constituera néanmoins une ressource exhaustive sur les éléments les plus importants en matière de conception de systèmes. Je vous propose également un résumé de cette vidéo.

Acquérez des connaissances sur le stockage et l'extraction des données

En général, votre décision sur la manière dont vous allez stocker et fournir 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 attendues de l'écriture et de la lecture des données dans votre système. Ensuite, vous devez être capable d'évaluer ces indicateurs et de faire vos choix en conséquence. Cependant, vous ne pourrez bien gérer cette tâche que si vous maîtrisez les modèles de stockage de données existants. En principe, cela implique une connaissance approfondie du choix de la base de données.

Les bases de données peuvent être considérées comme des structures de données dotées d'une évolutivité et d'une durabilité exceptionnelles. Ainsi, la connaissance des structures de données vous sera très utile également lors du choix d'une base de données. Par exemple, Redis – est un serveur de structures de données qui prend en charge différents types de valeurs. Il permet de travailler avec des structures de données telles que des listes et des ensembles, de lire des données à l'aide d'algorithmes connus, par exemple, LRU, organisant ce travail de manière durable et hautement disponible.

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

Image Samuel Zeller provenant du site Unsplash

Une fois que vous avez compris les différents modèles de stockage des données, passez à l'étude de la cohérence et de la disponibilité des données. Vous devrez d'abord assimiler le théorème CAP , au moins dans ses grandes lignes, puis affiner ces connaissances en examinant plus en détail les modèles établis de cohérence et disponibilité. Cela vous permettra d'élargir votre perspective dans ce domaine et de comprendre que la lecture et l'écriture des données sont en réalité deux problèmes très différents, chacun présentant ses propres défis. Avec quelques modèles de garantie de cohérence et de disponibilité, vous pourrez considérablement améliorer la performance de votre système tout en garantissant un approvisionnement constant de données à vos applications.

Enfin, en terminant la discussion sur les questions de stockage des données, il convient également de parler de la mise en cache. Celle-ci doit-elle être effectuée simultanément sur le client et sur le serveur ? Quelles données allez-vous avoir en cache ? Et pourquoi ? Comment allez-vous organiser l'invalidation du cache ? Se fera-t-elle régulièrement, à intervalles réguliers ? Si oui, à quelle fréquence ? Je recommande de commencer à travailler sur ces sujets à partir de la section suivante du livre mentionné sur la conception de systèmes.

Modèles de communication

Les systèmes sont composés de différents composants ; il peut s'agir de divers processus fonctionnant sur le même nœud physique ou de différentes machines opérant dans différentes parties de votre réseau. Certains de ces ressources peuvent être privées à l'intérieur de votre réseau, mais d'autres doivent être publiques et accessibles aux consommateurs y accédant depuis 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 faisons face, encore une fois, à un ensemble de nouveaux défis uniques. Voyons comment les flux de tâches asynchrones, et quelles sont lesdivers modèles de communication disponibles.

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

Image Tony Stoddard provenant du site Unsplash

Lors de l'établissement de la communication avec le monde extérieur, il est toujours très important sécurité, pour lequel il faut également aborder sérieusement et activement.

Distribution des connexions

Je ne suis pas sûr que le fait de donner à ce sujet une section séparée semble justifié à tout le monde. Néanmoins, je vais développer ici ce concept et je pense que le matériel de cette section est le plus précisément décrit par le terme « distribution des connexions » (connection distribution).

Les systèmes se forment par le bon raccordement d'un grand nombre de composants, et leur communication entre eux est souvent organisée sur la base de protocoles établis, par exemple, TCP et UDP. Cependant, ces protocoles à eux seuls ne suffisent souvent pas à satisfaire tous les besoins des systèmes modernes, qui sont souvent soumis à de fortes charges, et qui dépendent également fortement des besoins des utilisateurs. Il est souvent nécessaire de trouver des moyens de distribuer les connexions pour faire face à ces charges élevées dans le système.

À la base de cette distribution se trouve un système de noms de domaine (DNS). Ce système permet de convertir un nom de domaine, par exemple, un algorithme de cycle pondéré (weighted round robin) et des méthodes basées sur la latence, pour aider à distribuer la charge.

Équilibrage de charge est fondamentalement important, et pratiquement tout grand système sur Internet, avec lequel nous devons aujourd'hui composer, se trouve derrière un ou plusieurs répartiteurs de charge. Les répartiteurs de charge aident à distribuer les requêtes des clients entre de nombreuses instances disponibles. Les répartiteurs de charge peuvent être matériels ou logiciels, mais en pratique, nous avons souvent affaire à des logiciels, par exemple à HAProxy et ELB. Les proxys inverses sont également conceptuellement très similaires aux répartiteurs de charge, bien qu'il existe plusieurs différences marquées. Ces différences doivent absolument être prises en compte lors de la conception d'un système en fonction de vos besoins.

Il convient également de connaître les réseaux de distribution de contenu (CDN). Un CDN est un réseau de proxy réparti à l'échelle mondiale, fournissant des informations à partir des nœuds qui sont géographiquement plus proches de l'utilisateur spécifique. Les réseaux CDN sont préférables lorsque vous travaillez avec des fichiers statiques écrits en JavaScript, CSS et HTML. De plus, de nos jours, des services cloud sont populaires, offrant des gestionnaires de trafic, par exemple, Azure Traffic Manager, vous assurant une distribution mondiale et des latences réduites lors de l'utilisation de contenu dynamique. Cependant, ces services sont généralement utiles dans les cas où l'on doit travailler avec des services web sans état.

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

Ainsi, nous avons eu l'occasion de discuter des divers aspects d'infrastructure du système. Il est probable que l'utilisateur ne se soucie même pas de tous ces éléments dans votre système et, honnêtement, il ne s'en préoccupe pas du tout. Ce qui intéresse l'utilisateur, c'est d'interagir avec votre système, ce qu'il peut accomplir en procédant ainsi, ainsi que comment le système exécute les commandes de l'utilisateur, ce qu'il fait et comment il traite les données de l'utilisateur.

Comme il est clair d'après le titre de cet article, je comptais parler ici d'architecture logicielle et de conception de systèmes. Par conséquent, je n'avais pas prévu d'aborder les modèles de conception logicielle, 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 logicielle et les modèles architecturaux est très floue, et que ces deux concepts sont étroitement liés. Prenons par exemple la gestion des événements (event sourcing). Dès que vous adoptez ce modèle architectural, il influence pratiquement tous les aspects de votre système : le stockage à long terme des données, le niveau de cohérence adopté dans votre système, la configuration des composants, etc. C'est pourquoi j'ai décidé de mentionner certains modèles architecturaux qui touchent directement à la logique métier. Même si cet article doit se 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. Voici quelques-uns :

Approches collaboratives

Il est extrêmement improbable que vous soyez le seul responsable du processus de conception du système dans un projet. Au contraire, il est fort probable que vous deviez collaborer avec des collègues travaillant à la fois dans le cadre de votre tâche et en dehors. Dans ce cas, il peut être nécessaire d'évaluer les solutions technologiques choisies avec vos collègues, d'identifier les besoins commerciaux et de comprendre comment diviser au mieux les tâches.

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

Image Kaleidico provenant du site Unsplash

Tout d'abord, il sera nécessaire de développer une vision précise et largement acceptée de quel est l'objectif commercial que vous tentez d'atteindre et avec quels éléments mobiles vous devrez traiter. Les techniques de modélisation collaborative, notamment, le brainstorming d'événements (event storming) aident à accélérer considérablement ce processus et augmentent vos chances de succès. Vous pouvez travailler sur cette tâche avant ou après avoir défini les frontières de vos services, puis approfondir ce travail à mesure que le produit mûrit. En fonction du niveau de consensus qui sera atteint ici, vous pourrez également formuler un langage commun pour le contexte limité dans lequel vous travaillez. Lorsque vous aurez besoin de parler de l'architecture de votre système, le modèle C4, proposé par Simon Brown, est particulièrement utile, surtout lorsque vous devez comprendre dans quelle mesure vous devrez entrer dans les détails du problème en visualisant les éléments que vous souhaitez communiquer.

Il existe probablement d'autres technologies matures dans ce domaine qui sont tout aussi utiles que la conception orientée objet. Cependant, nous revenons toujours à la compréhension du domaine, donc les connaissances et l'expérience dans le domaine de la conception orientée objet devraient vous être utiles.

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster