Dans le domaine du développement backend moderne, la création d'applications distribuées résilientes devient de plus en plus complexe. Les architectures monolithiques traditionnelles cèdent la place aux microservices, introduisant de nouveaux défis en matière de gestion d'état, de tolérance aux pannes et de processus de longue durée. Entre en scène Temporal, une plateforme open-source conçue pour résoudre exactement ces problèmes en simplifiant la construction d'applications évolutives et durables.
Temporal n'est pas simplement une bibliothèque ; c'est une plateforme pour construire des systèmes distribués qui survivent aux pannes de manière gracieuse. Elle fournit un cadre pour écrire du code définissant la logique métier de longue durée sous forme de workflows, garantissant que même si l'infrastructure sous-jacente plante, l'état métier est préservé et peut être repris exactement là où il s'est arrêté.
Comprendre le problème fondamental : La nature éphémère de l'infrastructure
Considérons un workflow typique de traitement des paiements. Il peut impliquer la validation d'une carte de crédit, le débit de l'utilisateur, la mise à jour de l'inventaire et l'envoi d'un e-mail de confirmation. Si cette logique est implémentée dans un microservice standard et que le serveur plante après le débit mais avant la mise à jour de l'inventaire, vous vous retrouvez avec un état partiel. Relancer l'ensemble du processus pourrait entraîner un double débit de l'utilisateur.
Temporal résout ce problème en séparant la logique du workflow du moteur d'exécution. Le développeur écrit du code qui décrit ce qui doit se produire, et le moteur de Temporal gère comment cela se produit, y compris la persistance, les nouvelles tentatives et l'ordonnancement. C'est ce que l'on appelle souvent l'« éternalisation » de l'état.
Comment fonctionne Temporal : Workflows, Activités et Clients
Pour comprendre Temporal, vous devez connaître ses trois abstractions principales :
- Workflows : Blocs de logique de longue durée et durables. Ils définissent l'orchestration et peuvent appeler des activités.
- Activités : Fonctions de courte durée et tolérantes aux pannes qui effectuent le travail réel, telles que des requêtes de base de données ou des requêtes HTTP.
- Clients : Le point d'entrée de votre application pour démarrer des workflows et communiquer avec le serveur Temporal.
Exemple pratique : Codage d'un workflow durable
Regardons un exemple pratique en utilisant Go. Imaginons un workflow qui traite une commande. Nous voulons nous assurer que si la vérification de l'inventaire échoue, le système réessaie avant de passer à l'étape suivante. Sans Temporal, gérer manuellement cette logique de nouvelle tentative, les délais d'attente et la persistance de l'état est sujet aux erreurs. Avec Temporal, c'est déclaratif.
package main
import (
"context"
"fmt"
"go.temporal.io/sdk/client"
"go.temporal.io/sdk/workflow"
)
// ProcessOrderWorkflow est la définition de notre workflow durable
func ProcessOrderWorkflow(ctx workflow.Context, orderID string) error {
ao := workflow.ActivityOptions{
StartToCloseTimeout: 10 * time.Second,
}
ctx = workflow.WithActivityOptions(ctx, ao)
// Vérifier l'inventaire - si cela échoue, Temporal réessaie automatiquement
var inventoryOK bool
err := workflow.ExecuteActivity(ctx, CheckInventory, orderID).Get(ctx, &inventoryOK)
if err != nil {
return fmt.Errorf("failed to check inventory: %w", err)
}
if !inventoryOK {
return fmt.Errorf("item out of stock")
}
// Débit du paiement
err = workflow.ExecuteActivity(ctx, ChargePayment, orderID).Get(ctx, nil)
if err != nil {
return fmt.Errorf("payment failed: %w", err)
}
// Mise à jour de la base de données
err = workflow.ExecuteActivity(ctx, UpdateOrderStatus, orderID, "SHIPPED").Get(ctx, nil)
return err
}
Remarquez à quel point le code ressemble à une programmation synchrone et séquentielle. Cependant, sous le capot, Temporal enregistre un historique d'événements pour chaque étape. Si le processus plante après le débit du paiement, Temporal rejoue le workflow depuis le dernier point de contrôle, en sautant la vérification de l'inventaire mais en réexécutant la logique de mise à jour de la base de données en toute sécurité.
Pourquoi choisir Temporal ?
L'adoption de Temporal est motivée par sa capacité à abstraire la complexité des systèmes distribués. Elle élimine le besoin de machines à états manuelles, de logique de nouvelle tentative personnalisée et de mécanismes de verrouillage au niveau de la base de données pour l'orchestration. En traitant les workflows comme des citoyens de première classe, les développeurs peuvent se concentrer sur la logique métier plutôt que sur les détails d'infrastructure.
Conclusion
Temporal représente un changement de paradigme significatif dans la façon dont nous construisons les systèmes backend. Il permet aux développeurs d'écrire du code qui est intrinsèquement résilient, évolutif et maintenable. En adoptant l'orchestration de workflows durables, les équipes peuvent réduire la charge opérationnelle et garantir que leurs applications restent cohérentes même face aux pannes inévitables. Pour les développeurs intermédiaires à avancés souhaitant améliorer la fiabilité de leurs systèmes, Temporal est un outil indispensable dans la boîte à outils architecturale moderne.