Microservices, dessinés honnêtement
Tous les diagrammes de microservices se ressemblent et presque aucun ne répond à la seule question qui compte : peut-on en déployer un seul isolément ? Deux agencements des mêmes quatre services - l'un où c'est possible, l'autre non.
8 min de lectureUML 2.5.134 sur 35
La réponse courte
- La seule question à laquelle un diagramme de microservices doit répondre : l'une des boîtes pourrait-elle être livrée un jour à elle seule ?
- Suivez les flèches synchrones et comptez les sauts. Trois services ou plus qui doivent tous être debout pour une action utilisateur, c'est un monolithe distribué.
- Dessinez les appels en interfaces et les événements en signaux. Un jugement enfoui dans le code devient ainsi quelque chose qu'un relecteur peut contester.
- Une base par service, et hors de ce diagramme. Où elles tournent relève du déploiement ; ce qu'elles contiennent, du modèle propre à chaque service.
01La question à laquelle un diagramme de microservices doit répondre#
Pas "quels services existent" - une liste s'en charge, et cette liste est généralement dans les noms de dépôts. La question est : l'un quelconque d'entre eux peut-il être déployé seul ? Tout ce qu'on espère des microservices - des livraisons indépendantes, une montée en charge indépendante, une équipe qui livre sans réunion de coordination - découle du fait que la réponse soit oui, et aucune autre propriété du dessin ne compte si elle est non.
Un diagramme de composants y répond, à condition de dessiner les bonnes choses. Chaque service déployable est un composant ; chaque contrat publié une interface ; chaque événement un «signal». Couvrez ensuite un service de la main : si ce qui reste spécifie entièrement son remplaçant, ce service peut être livré à son propre rythme.
02Deux sortes de flèche, délibérément#
Sur la figure ci-dessus, la passerelle dépend de IOrders - un contrat synchrone, parce qu'elle ne peut pas répondre à l'utilisateur sans une commande. Shipping et billing pointent vers OrderPlaced, un signal que l'order service émet sans l'attendre.
Dessiner les deux différemment est toute la valeur de l'image. Les arêtes synchrones sont là où la disponibilité se compose : si l'order service est en panne, la passerelle renvoie une erreur. Les arêtes d'événement sont là où elle ne se compose pas : shipping en panne retarde un colis et n'entraîne rien d'autre. Un diagramme qui trace les deux en simples flèches a effacé la distinction qui décide comment le système tombe.
03L'arrangement à reconnaître#
Voici un monolithe distribué, et c'est la forme la plus répandue en production. Rien n'y est illégal, rien n'est mal nommé, et cela passera la relecture parce que cela ressemble à tous les autres diagrammes de microservices. Ce que cela dit, si l'on lit les flèches plutôt que les boîtes, c'est que les quatre services doivent être déployés ensemble, testés ensemble et debout ensemble : l'équipe a donc pris tous les coûts de la distribution et gardé toutes les contraintes d'un monolithe.
Le signe se compte : le nombre de sauts synchrones sur une requête. Un, c'est bien. Deux, en général c'est bien. Trois ou plus, et la disponibilité de l'ensemble est le produit de celles des parties : quatre services à 99,9 % chacun donnent environ 99,6 % ensemble, soit trois heures par mois où personne ne peut rien commander.
Les correctifs sont visibles sur le même dessin. Laissez orders publier un événement et laissez pricing et inventory y réagir. Ou fusionnez deux des boîtes, réponse légitime que l'on propose rarement. Ou mettez en cache ce dont pricing a besoin, pour que le saut quitte le chemin de la requête. Les trois sont des modifications de ce diagramme, et c'est pourquoi les vingt minutes passées à le dessiner avant de construire en valent la peine.
En une ligne chacun
- 01Un composant par service déployable, une interface par contrat publié, un signal par événement.
- 02Dessinez le couplage synchrone et asynchrone différemment : c'est ainsi que le système tombe.
- 03Synchrone quand l'appelant a besoin de la réponse ; un événement quand il n'en a pas besoin.
- 04Comptez les sauts synchrones par requête : trois ou plus, c'est un monolithe distribué.
- 05La disponibilité se multiplie le long d'une chaîne synchrone, et quatre neufs deviennent trois.
- 06Couvrez n'importe quel service : ce qui reste doit spécifier son remplaçant, sinon il ne peut pas être livré seul.
La notation est traitée dans le guide du diagramme de composants, et cinq autres arrangements - dont le cycle à deux sens que cet article ne répète pas - sont dans les exemples de diagrammes de composants.
04Questions fréquentes#
Comment dessine-t-on des microservices en UML ?
En composants, un par service déployable, avec une interface pour chaque contrat publié et un signal pour chaque événement. Ce qui en fait un diagramme de microservices, c'est que chaque boîte pourrait être livrée un jour à elle seule - affirmation que les interfaces autour soutiennent ou contredisent.
Comment repérer un monolithe distribué sur un diagramme ?
Suivez les flèches synchrones et comptez les sauts sur une requête. Si une seule action utilisateur traverse trois services ou plus qui doivent tous être debout, vous avez distribué un monolithe au lieu de le décomposer, et le diagramme vous l'a dit avant la production.
Les services doivent-ils communiquer en synchrone ou par événements ?
En synchrone quand l'appelant ne peut pas continuer sans la réponse, par événement quand il le peut. Dessiner les deux différemment - une interface pour les appels, un signal pour les événements - transforme ce jugement en quelque chose qu'un relecteur voit et peut contester, plutôt qu'en convention enfouie dans le code.
Où placer la base de données dans un diagramme de microservices ?
Une par service, et hors de ce diagramme. La vue composants porte sur les contrats entre services : dessiner cinq bases ajoute cinq boîtes qui disent la même chose. Où elles tournent relève du déploiement, ce qu'elles contiennent du modèle propre à chaque service.
Dans cette série
- 01Qu'est-ce que UML ?
- 02Symboles UML
- 03Choisir un diagramme
- 04Diagrammes de classes
- 05Exemples de diagrammes de classes
- 06Dessiner un diagramme de classes
- 07Symboles du diagramme de classes
- 08Diagrammes de séquence
- 09Exemples de diagrammes de séquence
- 10Dessiner un diagramme de séquence
- 11Diagrammes de cas d'utilisation
- 12Exemples de cas d'utilisation
- 13Diagrammes d'activité
- 14Exemples d'activité
- 15Diagrammes états-transitions
- 16Exemples d'états-transitions
- 17Diagrammes de composants
- 18Exemples de composants
- 19Dessiner un diagramme de composants
- 20Symboles de composants
- 21Diagrammes de déploiement
- 22Exemples de déploiement
- 23Diagrammes d'objets
- 24Diagrammes de paquetages
- 25Diagrammes de structure composite
- 26Diagrammes de communication
- 27Séquence vs communication
- 28Diagrammes de temps
- 29Diagrammes globaux d'interaction
- 30Diagrammes de profil
- 31UML avec l'IA
- 32Exemple e-commerce
- 33Exemple bancaire
- 34Exemple microservices
- 35Exemple AWS
À lire aussi
Diagrammes de structure
Pratique de la modélisation
Pratique de la modélisation
Diagrammes de structure
Diagrammes de comportement
Diagrammes de structure