
En bref
|
La plupart des éléments qui tournent sur une plateforme moderne sont conçus pour fonctionner en continu. Les applications traitent les requêtes, les workers gèrent les files d’attente, et les services gérés assurent la disponibilité des bases de données et des caches 24 h/24. Mais une part non négligeable du travail réel ne correspond pas à ce modèle de fonctionnement permanent.
Une importation en masse déclenchée quand un utilisateur télécharge un fichier, une correction ponctuelle des données lancée depuis un outil d'administration, un agent IA triant une stack de pull requests, un gestionnaire de webhooks réagissant à un seul événement Stripe : chacun de ces cas a un début, une tâche à accomplir et une fin, et les forcer à s’inscrire dans un processus de longue durée n’est qu’une solution de contournement.
Le conteneur de tâches est la primitive d’infrastructure de Upsun Cloud conçue pour les tâches exécutées jusqu’à leur achèvement.
Une tâche est une charge de travail à la demande, exécutée jusqu’à son achèvement, définie en parallèle de tes applications et services. Trois éléments la distinguent d’une application ou d’un worker :
upsun task:run) ou l’API : depuis l’environnement CI, depuis une tâche cron, depuis un autre service ou depuis l’une de tes applications.Les tâches sont configurées dans le même fichier que le reste de ton projet. Elles disposent de leur propre image de conteneur et de leur propre étape de build, indépendamment de ton application. Elles accèdent au reste de l’environnement, y compris les bases de données, les caches et tout autre service, via le modèle standard de relations d’Upsun Cloud.
Un projet Upsun cloud repose depuis longtemps sur deux éléments fondamentaux : les applications, qui traitent les requêtes et peuvent inclure des processus d’arrière-plan, et les services, c’est-à-dire les composants gérés comme les bases de données et les caches.
tasks: Rejoins applications: et services: au niveau supérieur de .upsun/config.yaml :
applications:
api:
# your long-running API
services:
postgres:
type: postgresql:18
tasks:
myagent:
type: nodejs:24
run:
command: node agent.js
Consulte la référence de configuration dans la documentation sur les conteneurs de tâches.
Les charges de travail des agents ont une structure spécifique. Elles ont besoin d'un environnement avec accès au code et aux données. Elles ont besoin d'isolation, car elles exécutent des commandes générées par des modèles. Elles ont besoin d'autorisations limitées, car tu ne veux pas qu'un agent accède à tout ce qu'il veut sur la plateforme. Et elles doivent s'arrêter quand le travail est terminé, pour que tu ne paies pas pour un conteneur inactif entre deux exécutions.
C’est justement cette dernière lacune que le conteneur de tâches comble pour l’IA sur Upsun. Le reste existait déjà :
Voici quelques exemples concrets d’agents qui s’intègrent parfaitement :
Il s’agit d’une primitive d’exécution délibérément épurée, de par sa conception. Tu fournis ton propre code d’agent, ton propre fournisseur de LLM et tes propres clés, ainsi que ton propre framework ou SDK ; tu n’es donc jamais lié à un modèle, un langage ou un modèle d’agent spécifique. On te propose un environnement d’exécution flexible ; tu l’utilises comme ton application l’exige.
Le traitement par lots est le cas d’utilisation le plus courant sur la plateforme, et celui vers lequel la plupart des clients d’Upsun Cloud se tourneront en premier.
Exemples :
Chacune de ces tâches suit le même schéma : elle est déclenchée, s'exécute, puis se termine. La question, c'est de savoir où cette tâche s'exécute.
Par défaut, ça s'exécute directement dans le conteneur de l'application, et ça marche tant que la tâche est légère. Mais comme elle partage les mêmes ressources que celles qui gèrent le trafic de ton application, toute tâche gourmande en ressources entre en concurrence avec les requêtes en temps réel et peut nuire aux performances.
La solution traditionnelle a toujours été de déplacer cette tâche vers un worker. Ça résout le problème de contention des ressources, mais ça en crée un autre : un worker reste inactif entre deux exécutions, donc tu paies pour ce temps d’inactivité, peu importe la fréquence à laquelle la tâche est réellement exécutée.
Les tâches Cron sont confrontées au même dilemme. Elles s’exécutent également dans le conteneur de l’application ; ainsi, une tâche Cron gourmande en ressources entre en concurrence avec le trafic en direct, tout comme le ferait une tâche ad hoc. Le programmer au milieu de la nuit permet souvent de contourner ce problème, puisqu’il n’y a pas de trafic avec lequel entrer en concurrence. Mais si ton application génère un trafic international plus régulier, ou si la tâche doit s’exécuter plus d’une fois par jour, cette plage horaire calme risque de ne pas exister. Une tâche Cron peut alors déclencher une autre tâche, de sorte que le gros du travail se fasse dans son propre conteneur plutôt que de puiser dans les ressources de ton application.
Les migrations de schéma de routine liées à une modification du code ont leur place dans ton hook de déploiement ; c’est là qu’elles doivent naturellement se trouver, et un conteneur de tâches n’y change rien.
C’est pour les tâches plus lourdes et moins courantes qu’un conteneur de tâches s’avère utile : une migration de données ponctuelle, une transformation de données à grande échelle ou une importation en masse trop gourmande en ressources pour être exécutée en ligne. Avec un conteneur de tâches, cette étape fait partie intégrante de la configuration du projet, et non plus d’un fil de discussion Slack décrivant ce que quelqu’un a fait manuellement.
Les webhooks externes atteignent généralement les conteneurs de tâches de manière indirecte. Stripe envoie un événement de paiement. GitHub envoie un événement de push. Slack envoie une interaction. Le plus souvent, ceux-ci arrivent dans une application toujours active qui valide la charge utile, puis appelle l’API Upsun cloud pour déclencher une tâche. L’application reste légère et réactive ; la tâche effectue le travail de longue durée et se termine une fois terminée.
Si la source du webhook peut elle-même contenir un jeton authentifié, elle peut appeler directement l’API pour déclencher la tâche, sans avoir besoin d’une application intermédiaire.
Chaque tâche comprend :
Fournies avec le conteneur de tâches, les autorisations de charge de travail permettent à une application ou à une tâche d’appeler l’API Upsun Cloud pendant l’exécution à l’aide de jetons à durée de vie limitée et à portée restreinte. Il n’y a pas d’identifiants à longue durée de vie à stocker ni de rotation à gérer.
C’est utile bien au-delà des agents. Toute charge de travail qui doit communiquer avec l’API de la plateforme en bénéficie : une application qui déclenche une tâche d’importation de données volumineuse lorsqu’un utilisateur télécharge un fichier, un tableau de bord d’administration interne qui répertorie les environnements actifs et leur état, ou une tâche qui lit les métadonnées d’un environnement pour marquer ses résultats avec le nom de la branche. Le principe est le même : demander un jeton à la plateforme, l’utiliser, puis le laisser expirer.
La section sur les autorisations des charges de travail fournit plus de détails.
Prêt à en créer une ? Rends-toi sur la documentation relative aux conteneurs de tâches pour te lancer.
Un conteneur de tâches, c’est la même chose qu’une fonction serverless ?
Le modèle d’exécution est similaire : déclenchement, exécution, sortie. La différence, c’est qu’une tâche s’exécute au sein de ton environnement Upsun, avec un accès direct à tes services et à tes données via des relations. Tu n’as pas besoin de passer par une plateforme distincte pour accéder à ta base de données.
Puis-je exécuter des tâches planifiées ?
Une tâche est déclenchée à la demande, via la console, la CLI ou l’API. La planification, tu la mets en place en amont, avec une application cron, un job d’intégration continue (CI) ou un planificateur externe.
Que se passe-t-il si une tâche échoue ou atteint son délai d'expiration ?
L'exécution est enregistrée comme ayant échoué dans le journal d'activité. Il n'y a pas de nouvelle tentative automatique ; c'est ce qui a déclenché la tâche qui est chargé de la relancer si nécessaire. Le délai d'expiration par défaut est d'une heure, avec un maximum d'un jour. Conçois tes tâches pour qu'elles soient idempotentes afin qu'une nouvelle tentative soit sans risque.
Quels environnements d’exécution puis-je utiliser pour une tâche ?
Les mêmes images d’environnement d’exécution que pour les applications. Les tâches déclarent un type: dans .upsun/config.yaml, exactement comme le font les applications : Node.js, Python, PHP, Ruby, Go, Java, .NET. Pour les agents IA, le choix dépend des besoins de ton framework ou de ton SDK.
En quoi une tâche diffère-t-elle d’un worker ?
Un worker est un processus de longue durée qui démarre au moment du déploiement et reste actif pour interroger une file d’attente ou effectuer des tâches en arrière-plan. Une tâche est à la demande : elle démarre lorsqu’elle est déclenchée, s’exécute une seule fois, puis se termine. Si le travail arrive en continu, utilise un worker. Si le travail arrive par rafales ou provient d’événements discrets, utilise une tâche.
Les tâches partagent-elles le stockage avec mon application ? Les
tâches disposent de leur propre image de conteneur et d’un système de fichiers vierge à chaque exécution. Elles partagent l’état persistant avec les applications de la même manière que celles-ci le partagent entre elles : via des services (bases de données, stockage d’objets, caches) utilisant le modèle de relations standard. Pour que les fichiers persistent d’une exécution de tâche à l’autre, monte un volume de stockage ou de service. Les montages par défaut « instance » et « tmp » sont réinitialisés entre les exécutions.
Une tâche peut-elle appeler l’API Upsun Cloud ?
Oui. C’est à ça que servent les autorisations de charge de travail : une tâche demande à la plateforme un jeton à durée de vie courte et à portée restreinte, puis l’utilise pour appeler l’API.