Written by

Durant cette fin d’année, nous mettons en production nos développements de ces derniers mois arrivés à maturité. Nous avons quelques belles fonctionnalités qui devraient vous permettre d’apprécier encore plus votre expérience chez alwaysdata.


Les Web apps ou services ont parfois besoin d’exécuter des tâches périodiquement. Qu’il s’agisse d’un blog WordPress pour lequel vous souhaitez passer par un planificateur système, d’un broker pour lequel vous souhaiteriez purger la queue de messages régulièrement, ou votre lecteur RSS qu’il vous faut rafraîchir à heure fixe, il existe une grande quantité de cas d’usages.

Le point commun de tous ces services est la nécessité d’exécuter des commandes, ou d’appeler des URLs, sans aucune interaction utilisateur. Pour gérer ce point, vous devez enregistrer une tâche planifiée.

Notre plateforme s’appuie sur Debian, sur laquelle vous bénéficiez d’un accès complet à votre compte utilisateur Unix. Vous pouvez donc y renseigner des tâches à exécuter en éditant la crontab de votre compte avec la commande crontab -e.

Ce n’était pas suffisant pour nous. Deux raisons à cela. La première, c’est que cette situation partage l’administration des actions liées à votre compte en deux parties : une dans l’interface de votre compte, et les tâches dans votre compte Unix. La seconde, c’est que la syntaxe de crontab est pour le moins indigeste.

Le point bonus1), c’est qu’une tâche planifiée via crontab est enregistrée et exécutée sur un serveur qui n’est pas le serveur qui exécute vos sites Web2). Lorsque nous déplaçons vos comptes d’un serveur à l’autre3) nous devons également tenir compte des éventuelles tables de tâches. Tout ceci nuit à la simplicité et à la performance de la plateforme.

Nous avons donc ajouté le support des tâches planifiées dans votre interface de gestion !

Interface d'administration : liste des tâches planifiées
Interface d’administration : liste des tâches planifiées

Pour planifier une nouvelle tâche, rendez-vous dans la nouvelle section de l’interface d’administration et ajoutez une tâche.

Vous aurez deux types d’informations à fournir :

  • La (les) commande(s) que vous souhaitez exécuter, ou les URLs que vous souhaitez requêter ; si vous avez besoin d’un ping vers une ou plusieurs URLs pour déclencher des actions sur des services distants, renseignez-les simplement ; sinon, entrez la ligne de commande à exécuter ;
  • La périodicité de votre tâche ; vous pouvez spécifiez une heure fixe, ou un interval ; dans le cas où ces options ne seraient pas assez flexibles, vous pouvez revenir à une syntaxe crontab standard pour programmer l’exécution.
Interface d'administration : créer une tâche planifiée
Interface d’administration : créer une tâche planifiée

C’est tout. Votre tâche est enregistrée et son exécution sera gérée par la plateforme directement.

Concernant l’exemple WordPress précédemment mentionné, vous pouvez enregistrer une tâche php $HOME/wordpress/htdocs/wp cron event run --due-now lancée toutes les dix minutes4).

Toutes les fonctionnalités du planificateur sont également disponibles via notre API, pour vous permettre d’enregistrer une tâche automatiquement depuis le code de votre application.

Côté technique, nous n’utilisons pas une implémentation existante d’un démon cron, mais nous nous appuyons sur notre propre démon : aljob. Ceci pour deux raisons :

  1. Les tâches planifiées ne sont pas exécutées à l’heure précise, dans l’interval de la minute concernée ; par exemple, une tâche planifiée à 00:00 sera exécutée quelque part entre 00:00:00 et 00:00:59. Quand des centaines de tâches sont lancées à minuit par des centaines d’utilisateurs5), ce système évite une surcharge temporaire et un ralentissement des serveurs en lissant la pile d’appels ;
  2. Si vous exécutez régulièrement (toutes les dix minutes par exemple) une tâche longue, notre démon est capable de détecter si le lancement précédent est encore en cours d’exécution, et de sauter le lancement du nouvel appel dans ce cas ; ce cas précis nous permet d’éviter les surcharges de traitement et des race conditions dans l’exécution de vos commandes asynchrones.

Vous voulez un usage amusant ? Rien ne vous oblige à installer un service Web pour bénéficier des tâches planifiées. Voici une commande que j’ai programmée quotidiennement :

Elle exécute un appel à l’API d’actualités de DuckDuckGo pour obtenir les derniers articles relatifs à Google6), filtre la réponse JSON pour obtenir pour chaque article son titre, son URL, et sa date. Le tout est compilé vers la sortie texte et m’est envoyé par mail, ce qui me permet d’obtenir ma petite revue de presse sur tout ce qui touche à Google, dans ma boite mail tous les matins.


Les tâches planifiées sont disponibles dans votre interface d’administration dès à présent. Nous retirerons le support des crontab prochainement pour les hébergements mutualisés. Si vous avez des tâches dans vos tables de cron, elles seront automatiquement reportées dans la nouvelle interface. Les VPS et les serveurs dédiés conserveront les deux systèmes indépendamment, au choix.

Si vous identifiez des améliorations à apporter à ce service, n’hésitez pas à nous les remonter. Nous sommes également curieux de connaître vos cas d’usages des tâches planifiées, surprenez-nous dans les commentaires !

D’autres fonctionnalités arrivent très rapidement en production. Surveillez le blog et notre fil Twitter de l”#avent, des surprises vous attendent.

Notes

Notes
1et la raison technique
2nos serveurs SSH et HTTP sont des instances séparées
3ce qui se produit quotidiennement de façon transparente dans une infrastructure comme celle d’alwaysdata
4n’oubliez pas de désactiver le faux-cron embarqué de votre instance WordPress en ajoutant la directive define('DISABLE_WP_CRON', true); dans le fichier wp-config.php
5ce qui est le cas dans nos instances partagées
6oui, j’aime bien les troller