Adcoar Ltd
← All posts

20 Aug 2026 · Adcoar News Editor

Pourquoi une file d'attente silencieuse ne signifie pas qu'elles le sont toutes

Une plateforme de messagerie qui envoie des SMS, des messages WhatsApp et des diffusions vocales a un mode de défaillance évident contre lequel se prémunir : un arriéré sur un canal ne devrait pas pouvoir affamer les autres. Si une grande campagne SMS est en cours d'envoi, un message WhatsApp qu'un autre client attend ne devrait pas rester coincé derrière dans la même file d'attente.

La réponse d'Adcoar Reach est de donner à chaque canal (voix, SMS, WhatsApp) sa propre file d'attente dédiée et son propre superviseur de workers sous Laravel Horizon, plutôt qu'une seule file partagée pour tout. Chaque tâche déclare à quelle file de canal elle appartient directement dans son propre constructeur, de sorte que l'acheminement vit à côté de la tâche qu'il achemine, pas dans une configuration séparée qu'un futur changement pourrait laisser se désynchroniser.

L'écart que les files d'attente nommées ne comblent pas automatiquement

Nommer explicitement trois files d'attente est la partie facile. La partie la plus difficile est de se rappeler que tout ce qui ne déclare pas explicitement de file d'attente retombe dans la file default de Laravel, et cette file a besoin de son propre superviseur qui la surveille tout autant que les files nommées. Il est facile de raisonner sur les canaux que l'on a délibérément conçus et d'oublier la plomberie qui était toujours là par défaut.

C'est exactement ce qui s'est produit pendant la construction et les tests : la file default n'avait aucun superviseur configuré du tout, et personne n'avait de raison de le remarquer, car Horizon lui-même signalait que tout « fonctionnait » : il disait la vérité sur les trois superviseurs de canaux, qui étaient effectivement en bon état. Les e-mails de réinitialisation de mot de passe et les appels webhook sortants, qui retombent tous deux dans default plutôt que de déclarer un canal, restaient indéfiniment non traités dans Redis. Cela a été découvert lors d'un test de routine de réinitialisation de mot de passe, pas grâce à une alerte de surveillance, ce qui est en soi la conclusion qui mérite qu'on s'y attarde : une file d'attente peut être complètement bloquée alors que tous les signaux disponibles sur le tableau de bord indiquent que le système est en bonne santé.

Construire une surveillance qui l'aurait détecté de toute façon

La correction du bug immédiat tenait en une ligne : ajouter un superviseur pour default. La correction de la catégorie de bug était un contrôle de santé programmé qui ne fait pas confiance à « Horizon dit que ça tourne » comme suffisant : il vérifie séparément si l'arriéré de chaque file a dépassé un seuil et si les tâches échouées s'accumulent, et alerte si l'un ou l'autre se produit, indépendamment de ce que prétend la propre page de statut d'Horizon. Ces trois mêmes signaux sont également affichés en direct sur un tableau de bord interne, de sorte que vérifier la santé d'une file d'attente ne signifie pas attendre un e-mail d'alerte horaire.

La leçon générale se transpose bien au-delà des files d'attente : un superviseur qui tourne n'est pas la même affirmation qu'un travail qui s'accomplit, et un contrôle de surveillance ne vaut que par sa volonté de se méfier de ce qu'il surveille.