Durant cette fin d’année, nous met­tons en pro­duc­tion nos déve­lop­pe­ments de ces der­niers mois arri­vés à matu­ri­té. Nous avons quelques belles fonc­tion­na­li­tés qui devraient vous per­mettre d’apprécier encore plus votre expé­rience chez always­da­ta.


Les Web apps ou ser­vices ont par­fois besoin d’exécuter des tâches pério­di­que­ment. Qu’il s’agisse d’un blog WordPress pour lequel vous sou­hai­tez pas­ser par un pla­ni­fi­ca­teur sys­tème, d’un bro­ker pour lequel vous sou­hai­te­riez pur­ger la queue de mes­sages régu­liè­re­ment, ou votre lec­teur RSS qu’il vous faut rafraî­chir à heure fixe, il existe une grande quan­ti­té de cas d’usages.

Le point com­mun de tous ces ser­vices est la néces­si­té d’exécuter des com­mandes, ou d’appeler des URLs, sans aucune inter­ac­tion uti­li­sa­teur. Pour gérer ce point, vous devez enre­gis­trer une tâche pla­ni­fiée.

Notre pla­te­forme s’appuie sur Debian, sur laquelle vous béné­fi­ciez d’un accès com­plet à votre compte uti­li­sa­teur Unix. Vous pou­vez donc y ren­sei­gner des tâches à exé­cu­ter en édi­tant la cron­tab de votre compte avec la com­mande crontab -e.

Ce n’était pas suf­fi­sant pour nous. Deux rai­sons à cela. La pre­mière, c’est que cette situa­tion par­tage l’administration des actions liées à votre compte en deux par­ties : une dans l’interface de votre compte, et les tâches dans votre compte Unix. La seconde, c’est que la syn­taxe de cron­tab est pour le moins indi­geste.

Le point bonus1), c’est qu’une tâche pla­ni­fiée via cron­tab est enre­gis­trée et exé­cu­tée sur un ser­veur qui n’est pas le ser­veur qui exé­cute vos sites Web2). Lorsque nous dépla­çons vos comptes d’un ser­veur à l’autre3) nous devons éga­le­ment tenir compte des éven­tuelles tables de tâches. Tout ceci nuit à la sim­pli­ci­té et à la per­for­mance de la pla­te­forme.

Nous avons donc ajou­té le sup­port des tâches pla­ni­fiées dans votre inter­face de ges­tion !

Interface d'administration : liste des tâches planifiées
Interface d’administration : liste des tâches pla­ni­fiées

Pour pla­ni­fier une nou­velle tâche, ren­dez-vous dans la nou­velle sec­tion de l’interface d’administration et ajou­tez une tâche.

Vous aurez deux types d’informations à four­nir :

  • La (les) commande(s) que vous sou­hai­tez exé­cu­ter, ou les URLs que vous sou­hai­tez requê­ter ; si vous avez besoin d’un ping vers une ou plu­sieurs URLs pour déclen­cher des actions sur des ser­vices dis­tants, ren­sei­gnez-les sim­ple­ment ; sinon, entrez la ligne de com­mande à exé­cu­ter ;
  • La pério­di­ci­té de votre tâche ; vous pou­vez spé­ci­fiez une heure fixe, ou un inter­val ; dans le cas où ces options ne seraient pas assez flexibles, vous pou­vez reve­nir à une syn­taxe cron­tab stan­dard pour pro­gram­mer l’exécution.
Interface d'administration : créer une tâche planifiée
Interface d’administration : créer une tâche pla­ni­fiée

C’est tout. Votre tâche est enre­gis­trée et son exé­cu­tion sera gérée par la pla­te­forme direc­te­ment.

Concernant l’exemple WordPress pré­cé­dem­ment men­tion­né, vous pou­vez enre­gis­trer une tâche php $HOME/wordpress/htdocs/wp cron event run --due-now lan­cée toutes les dix minutes4).

Toutes les fonc­tion­na­li­tés du pla­ni­fi­ca­teur sont éga­le­ment dis­po­nibles via notre API, pour vous per­mettre d’enregistrer une tâche auto­ma­ti­que­ment depuis le code de votre appli­ca­tion.

Côté tech­nique, nous n’utilisons pas une implé­men­ta­tion exis­tante d’un démon cron, mais nous nous appuyons sur notre propre démon : aljob. Ceci pour deux rai­sons :

  1. Les tâches pla­ni­fiées ne sont pas exé­cu­tées à l’heure pré­cise, dans l’interval de la minute concer­née ; par exemple, une tâche pla­ni­fiée à 00:00 sera exé­cu­tée quelque part entre 00:00:00 et 00:00:59. Quand des cen­taines de tâches sont lan­cées à minuit par des cen­taines d’utilisateurs5), ce sys­tème évite une sur­charge tem­po­raire et un ralen­tis­se­ment des ser­veurs en lis­sant la pile d’appels ;
  2. Si vous exé­cu­tez régu­liè­re­ment (toutes les dix minutes par exemple) une tâche longue, notre démon est capable de détec­ter si le lan­ce­ment pré­cé­dent est encore en cours d’exécution, et de sau­ter le lan­ce­ment du nou­vel appel dans ce cas ; ce cas pré­cis nous per­met d’éviter les sur­charges de trai­te­ment et des race condi­tions dans l’exécution de vos com­mandes asyn­chrones.

Vous vou­lez un usage amu­sant ? Rien ne vous oblige à ins­tal­ler un ser­vice Web pour béné­fi­cier des tâches pla­ni­fiées. Voici une com­mande que j’ai pro­gram­mée quo­ti­dien­ne­ment :

Elle exé­cute un appel à l’API d’actualités de DuckDuckGo pour obte­nir les der­niers articles rela­tifs à Google6), filtre la réponse JSON pour obte­nir pour chaque article son titre, son URL, et sa date. Le tout est com­pi­lé vers la sor­tie texte et m’est envoyé par mail, ce qui me per­met d’obtenir ma petite revue de presse sur tout ce qui touche à Google, dans ma boite mail tous les matins.


Les tâches pla­ni­fiées sont dis­po­nibles dans votre inter­face d’administration dès à pré­sent. Nous reti­re­rons le sup­port des cron­tab pro­chai­ne­ment pour les héber­ge­ments mutua­li­sés. Si vous avez des tâches dans vos tables de cron, elles seront auto­ma­ti­que­ment repor­tées dans la nou­velle inter­face. Les VPS et les ser­veurs dédiés conser­ve­ront les deux sys­tèmes indé­pen­dam­ment, au choix.

Si vous iden­ti­fiez des amé­lio­ra­tions à appor­ter à ce ser­vice, n’hésitez pas à nous les remon­ter. Nous sommes éga­le­ment curieux de connaître vos cas d’usages des tâches pla­ni­fiées, sur­pre­nez-nous dans les com­men­taires !

D’autres fonc­tion­na­li­tés arrivent très rapi­de­ment en pro­duc­tion. Surveillez le blog et notre fil Twitter de l”#avent, des sur­prises vous attendent.

Notes   [ + ]

1. et la rai­son tech­nique
2. nos ser­veurs SSH et HTTP sont des ins­tances sépa­rées
3. ce qui se pro­duit quo­ti­dien­ne­ment de façon trans­pa­rente dans une infra­struc­ture comme celle d’always­da­ta
4. n’oubliez pas de désac­ti­ver le faux-cron embar­qué de votre ins­tance WordPress en ajou­tant la direc­tive define('DISABLE_WP_CRON', true); dans le fichier wp-config.php
5. ce qui est le cas dans nos ins­tances par­ta­gées
6. oui, j’aime bien les trol­ler