Coordination distribuée en .NET
La coordination, c'est la façon dont des processus indépendants se mettent d'accord sur qui fait quoi, dans quel ordre, et qui commande — sans se marcher dessus. Cet article explique les problèmes de coordination que rencontrent les applications .NET distribuées et les primitives que Clustron fournit pour les résoudre.
Pourquoi la coordination est difficile
Lorsqu'un seul processus fait tout le travail, l'ordonnancement et la propriété sont gratuits : il n'y a qu'un seul acteur. Exécutez le même code sous forme de plusieurs instances et cette garantie disparaît. Deux instances peuvent désormais tenter le même travail en même temps, lire des copies périmées de l'état partagé, ou croire toutes deux qu'elles sont le leader après un incident réseau. Si on les laisse sans solution, ces problèmes se manifestent sous forme de :
- Conditions de course (race conditions), lorsque deux instances modifient la même ressource de façon concurrente.
- État incohérent, lorsque les instances agissent sur des vues différentes des données.
- Traitement en double, lorsque plus d'une instance exécute un travail qui ne devrait s'exécuter qu'une fois.
- Split-brain, lorsqu'une partition laisse deux instances agir chacune comme la seule autorité.
Les primitives de coordination sont les briques de base éprouvées qui préviennent ces conséquences, pour que vous n'ayez pas à les réimplémenter pour chaque application.
Primitives de coordination
Les primitives ci-dessous constituent le vocabulaire commun de la coordination distribuée. Chacune résout l'un des modes de défaillance ci-dessus.
| Primitive | Ce qu'elle garantit | Utilisation typique |
|---|---|---|
| Verrou distribué | Un seul détenteur exécute une section à la fois | Empêcher l'exécution en double d'un travail ; protéger une section critique |
| Élection de leader | Un groupe s'accorde sur un nœud coordinateur | Exécuter un planificateur singleton ; répartir le travail depuis un seul endroit |
| Transaction | Un ensemble d'opérations s'applique de façon atomique, tout ou rien | Mises à jour multi-clés qui ne doivent pas s'appliquer partiellement |
| Notification d'observateur | Les clients sont informés lorsque l'état change, au lieu de sonder | Réagir aux changements de configuration ou d'état en temps réel |
Comment Clustron assure la coordination
Clustron répartit la coordination sur deux couches de sa famille de produits, afin que vous puissiez utiliser la couche qui correspond à votre problème.
La coordination au niveau du cluster vient de Clustron Nodus. Nodus est le cœur de clustering et de messagerie : les processus rejoignent un cluster pair à pair, élisent un leader via des stratégies enfichables, détectent les défaillances des pairs et échangent des messages typés — sans coordinateur externe tel que ZooKeeper ou etcd à exploiter. L'élection de leader et la détection de défaillances vivent ici.
La coordination au niveau du plan de données vient de Clustron Zaris. Zaris est le store clé-valeur distribué. Au-dessus de l'état partagé, il expose des verrous distribués, des compteurs atomiques, des transactions, des notifications d'observateurs et des baux. Ceux-ci sont construits sur les clés, le TTL et le cycle de vie des baux propres au store, de sorte qu'un verrou se libère automatiquement lorsque son propriétaire meurt, et qu'un observateur se déclenche sans boucle de sondage.
Les deux s'articulent : Zaris se met en cluster sur Nodus, de sorte qu'un déploiement Zaris dispose déjà de l'appartenance et de l'élection de leader sous ses primitives de données. Si vous n'avez besoin que de coordination de cluster — un planificateur réservé au leader, un distributeur de travail — utilisez Nodus directement. Si vous avez besoin d'un état partagé et des verrous et observateurs qui le protègent, utilisez Zaris.
L'élection de leader est une capacité de Nodus. Lorsque vous exécutez Zaris, vous l'obtenez dans le cadre du cluster sous votre store ; vous ne mettez pas en place un système d'élection séparé.
Parce que ces primitives sont livrées dans les mêmes bibliothèques .NET que votre accès aux données, vous pouvez construire des workflows distribués, des systèmes de traitement en arrière-plan et de la coordination de microservices sans introduire de service de coordination séparé.