• Assurez la sécurité des applications de la bonne manière! Détectez, protégez, surveillez, accélérez et plus encore…
  • Recherchez-vous un système de mise en file d'attente? Ou peut-être cherchez-vous un meilleur? Voici toutes les informations dont vous avez besoin!

    Les systèmes de file d'attente sont le secret le mieux gardé du développement backend.

    Sans essayer d'écrire un poème faisant l'éloge des systèmes de files d'attente, je dirais qu'un développeur backend junior devient un développeur backend de niveau intermédiaire après avoir appris à intégrer les files d'attente dans le système. Les files d'attente améliorent l'expérience client (nous verrons comment), réduisent la complexité et améliorent la fiabilité d'un système.

    Bien sûr, pour les applications Web très simples avec un trafic quasi nul et des sites Web de brochures, les files d'attente peuvent être globales (voire impossibles à installer si vous êtes sur une environnement d'hébergement partagé), mais les applications non triviales bénéficieront toutes des systèmes de mise en file d'attente, et les grandes applications sont impossibles sans mise en file d'attente.

    Avant de commencer, une mise en garde: si vous êtes déjà à l'aise avec les systèmes de files d'attente et que vous souhaitez comparer les différentes options, les prochaines sections d'introduction vont induire un sommeil majeur. 🙂 Alors n'hésitez pas à aller de l'avant. Les sections d'introduction sont destinées à ceux qui n'ont qu'une idée floue des systèmes de mise en file d'attente ou qui ont juste entendu le nom au passage.

    Qu'est-ce qu'un système de file d'attente?

    Commençons par comprendre ce qu'est une file d'attente.

    Une file d'attente est une structure de données en informatique qui imite, eh bien, les files d'attente du monde réel que nous voyons autour de nous. Si vous vous rendez à un guichet, par exemple, vous remarquerez que vous devrez vous tenir à la fin de la file d'attente, tandis que la personne au début de la file d'attente recevra le billet en premier. C'est ce que nous appelons aussi le phénomène du «premier arrivé, premier servi». En informatique, il est possible d'écrire des programmes qui stockent leurs tâches comme celle-ci dans une file d'attente, en les traitant un par un sur la même base du premier arrivé, premier servi.

    Notez que la file d'attente n'effectue aucun traitement proprement dit. Il s'agit simplement d'un stockage temporaire où les tâches attendent jusqu'à ce qu'elles soient capturées par quelque chose. Si tout cela semble un peu trop abstrait, ne vous inquiétez pas. Il is un concept abstrait, mais nous verrons des exemples clairs dans la section suivante. 🙂

    Pourquoi avez-vous besoin de systèmes de mise en file d'attente?

    Sans entrer dans une description très longue, je dirais que le principal besoin de systèmes de mise en file d'attente est dû au traitement en arrière-plan, à l'exécution parallèle et à la récupération après une panne. Regardons-les à l'aide d'exemples:

    Traitement en arrière-plan

    Supposons que vous exécutiez une campagne de marketing e-commerce où le temps presse et que votre application soit conçue de manière à émettre un e-mail de confirmation juste avant que le client n'effectue le paiement et affiche la page de remerciement. Si le serveur de messagerie auquel vous vous connectez est en panne, la page Web mourra, interrompant l'expérience utilisateur.

    Imaginez le nombre élevé de demandes d'assistance que vous recevrez! Dans ce cas, il est préférable de pousser cette tâche d'envoi d'e-mails vers une file d'attente de travaux et d'afficher la page de réussite du client.

    Exécution parallèle

    De nombreux développeurs, en particulier ceux qui codent principalement des applications plus simples et à faible trafic, ont l'habitude d'utiliser cron emplois pour le traitement en arrière-plan. C'est bien jusqu'à ce que la taille de l'entrée devienne si grande qu'elle ne peut pas être effacée. Par exemple, supposons que vous ayez une tâche cron qui compile des rapports d'analyse et les envoie par e-mail aux utilisateurs et que votre système peut traiter 100 rapports par minute.

    Dès que votre application se développe et commence à recevoir plus de 100 demandes par minute en moyenne, elle prendra de plus en plus de retard et ne pourra jamais terminer toutes les tâches.

    Dans un système de mise en file d'attente, cette situation peut être évitée en configurant plusieurs travailleurs, qui peuvent chacun choisir un travail (contenant 100 rapports à faire chacun) et travailler en parallèle pour terminer la tâche beaucoup, beaucoup plus tôt.

    Récupération après une panne

    Nous ne pensons généralement pas à l'échec en tant que développeurs Web. Nous tenons en quelque sorte pour acquis que nos serveurs et les API que nous utilisons seront toujours en ligne. Mais la réalité est différente: les pannes de réseau sont trop fréquentes et les excellentes API sur lesquelles vous comptez peuvent être en panne en raison de problèmes d’infrastructure (avant de dire «pas moi!», N’oubliez pas le panne massive d'Amazon S3). Donc, pour revenir à l'exemple de rapport, si une partie de la génération de votre rapport vous oblige à vous connecter à l'API de paiement et que cette connexion est interrompue pendant 2 minutes, qu'advient-il des 200 rapports qui ont échoué?

    Cependant, les systèmes de file d'attente impliquent une surcharge considérable. La courbe d'apprentissage est assez raide alors que vous entrez dans un tout nouveau domaine, la complexité de votre application et de votre déploiement augmente et les tâches en file d'attente ne peuvent pas toujours être contrôlées avec une précision de 100%. Cela dit, il existe des situations où la création d'une application sans files d'attente n'est tout simplement pas possible.

    Avec cela à l'écart, jetons un coup d'œil à certaines des options courantes parmi les backends / systèmes de mise en file d'attente aujourd'hui.

    Redis

    Redis est connu comme un magasin clé-valeur qui ne fait que stocker, mettre à jour et récupérer des chaînes de données sans aucune connaissance de la structure des données. Bien que cela ait pu être vrai plus tôt, Redis dispose aujourd'hui de structures de données efficaces et très utiles telles que des listes, des ensembles triés et même un système Pub-Sub, ce qui le rend hautement souhaitable pour les implémentations de files d'attente.

    Les avantages de Redis sont:

    • Base de données entièrement en mémoire, ce qui permet une lecture / écriture plus rapide.
    • Très efficace: peut facilement prendre en charge plus de 100,000 XNUMX opérations de lecture / écriture par seconde.
    • Schéma de persistance très flexible. Vous pouvez soit opter pour des performances maximales au prix d'une éventuelle perte de données en cas de défaillance, soit configurer en mode totalement conservateur pour sacrifier les performances au profit de la cohérence.
    • Clusters pris en charge par défaut

    Veuillez noter que Redis n'a aucune abstraction de messagerie / mise en file d'attente / récupération, vous devez donc soit utiliser un package, soit créer un système léger vous-même. Un exemple est que Redis est le backend de file d'attente par défaut pour le Laravel Cadre PHP, où un ordonnanceur a été implémenté par les auteurs du framework.

    Apprendre Redis est facile.

    RabbitMQ

    Il y a quelques différences subtiles entre Redis et RabbitMQ, alors éliminons-les d'abord.

    Tout d'abord, RabbitMQ a un rôle plus spécialisé et bien défini, et il a donc été conçu pour refléter cela: la messagerie. En d'autres termes, son point idéal est d'agir en tant qu'intermédiaire entre deux systèmes, ce qui n'est pas le cas pour Redis, qui agit comme une base de données. En conséquence, RabbitMQ fournit quelques fonctionnalités supplémentaires qui manquent dans Redis: routage des messages, tentatives, distribution de charge, etc.

    Si vous y réfléchissez bien, les files d'attente de tâches peuvent également être considérées comme un système de messagerie, où le planificateur, les travailleurs et les «soumissionnaires» du travail peuvent être considérés comme des entités participant à la transmission de messages.

    RabbitMQ présente les avantages suivants:

    • De meilleures abstractions pour la transmission de messages, ce qui réduit le travail au niveau de l'application si la transmission de messages est ce dont vous avez besoin.
    • Plus résilient aux pannes de courant et aux pannes (que Redis, du moins par défaut).
    • Prise en charge des clusters et de la fédération pour les déploiements distribués.
    • Des outils utiles pour gérer et surveiller vos déploiements.
    • Prise en charge de pratiquement tous les langages de programmation non triviaux.
    • Déploiement avec votre outil de choix (Docker, Chef, Puppet, etc.).

    Quand utiliser RabbitMQ? Je dirais que c'est un excellent choix lorsque vous savez que vous devez utiliser le passage de messages asynchrone mais que vous n'êtes pas prêt à faire face à la complexité imposante de certaines des autres options de mise en file d'attente de cette liste (voir ci-dessous).

    ActiveMQ

    Si vous êtes dans l'espace de l'entreprise (ou que vous créez une application hautement distribuée et à grande échelle) et que vous ne voulez pas avoir à réinventer la roue tout le temps (et faire des erreurs en cours de route), ActiveMQ vaut le coup d'oeil.

    Voici où ActiveMQ excelle:

    • Il est implémenté en Java et a donc une intégration Java vraiment soignée (suit le standard JMS).
    • Plusieurs protocoles pris en charge: AMQP, MQTT, STOMP, OpenWire, etc.
    • Gère la sécurité, le routage, l'expiration des messages, les analyses, etc., prêts à l'emploi.
    • Prise en charge intégrée des modèles de messagerie distribués populaires, ce qui vous fait gagner du temps et des erreurs coûteuses.

    Cela ne veut pas dire qu'ActiveMQ n'est disponible que pour Java. Il a des clients pour Python, C / C ++, Node, .Net et d'autres écosystèmes, il ne devrait donc pas y avoir de soucis pour un éventuel effondrement à l'avenir. En outre, ActiveMQ est construit sur des normes complètement ouvertes et la création de vos propres clients légers devrait être facile.

    Cela dit et fait, sachez qu'ActiveMQ n'est qu'un courtier et n'inclut pas de backend. Vous devrez toujours utiliser l'un des backends pris en charge pour stocker les messages. Je l'ai inclus ici car il n'est pas lié à un langage de programmation particulier (comme d'autres solutions populaires comme Celery, Sidekiq, etc.)

    Amazon MQ

    Amazon MQ mérite une mention rapide mais importante ici. Si vous pensez qu'ActiveMQ est la solution idéale pour vos besoins mais que vous ne voulez pas vous occuper de la construction et de la maintenance de l'infrastructure vous-même, Amazon MQ propose un service géré pour le faire. Il prend en charge tous les protocoles qu'ActiveMQ fait - il n'y a aucune différence de fonctionnalités - car il utilise ActiveMQ lui-même sous la surface.

    L'avantage est qu'il s'agit d'un service géré, vous n'avez donc pas à vous soucier d'autre chose que de l'utiliser. Cela a encore plus de sens pour les déploiements qui sont sur AWS, car vous pouvez tirer parti d'autres services et offres directement à partir de votre déploiement (transferts de données plus rapides, par exemple).

    Amazon SQS

    Nous ne pouvons pas nous attendre à ce qu'Amazon reste silencieux en ce qui concerne les éléments d'infrastructure critiques, n'est-ce pas? 🙂

    Et ainsi nous avons Amazon SQS, qui est un service de file d'attente simple et entièrement hébergé (littéralement) par le géant bien connu AWS. Encore une fois, les différences subtiles sont importantes, veuillez donc noter que SQS n'a pas le concept de passage de message. Comme Redis, c'est un backend simple pour accepter et distribuer des travaux dans des files d'attente.

    Alors, quand voudriez-vous utiliser Amazon SQS? Voici quelques raisons:

    • Vous êtes un fan d'AWS et vous ne toucherez à rien d'autre (honnêtement, il y a beaucoup de gens comme ça, et je pense qu'il n'y a rien de mal à cela).
    • Vous avez besoin d'une solution hébergée, alors assurez-vous que le taux d'échec est égal à zéro et qu'aucun des travaux n'est perdu.
    • Vous ne voulez pas créer un cluster et devez le surveiller vous-même. Ou pire, vous devez créer des outils de surveillance alors que vous pourriez utiliser ce temps pour faire du développement productif.
    • Vous avez déjà des investissements substantiels dans la plate-forme AWS et rester bloqué est logique sur le plan commercial.
    • Vous voulez un système de mise en file d'attente simple et ciblé, sans aucune des peluches associées à la transmission de messages, aux protocoles, etc.

    Dans l'ensemble, Amazon SQS est un choix solide pour tous ceux qui souhaitent intégrer des files d'attente de travaux dans leur système et ne pas avoir à se soucier d'installer / surveiller les choses par eux-mêmes.

    Beanstalkd

    Beanstalkd existe depuis longtemps et constitue un backend éprouvé, rapide et facile pour la mise en file d'attente des travaux. Il y a quelques caractéristiques de Beanstalkd qui le différencient considérablement de Redis:

    • C'est strictement un système de mise en file d'attente et rien d'autre. Vous y poussez des emplois, qui sont tirés par les travailleurs plus tard. Donc, si votre application a même un petit besoin de transmission de messages, vous voudrez éviter Beanstalkd.
    • Il n'y a pas de structures de données avancées telles que les ensembles, les files d'attente de priorité, etc.
    • Beanstalkd est ce que l'on appelle une file d'attente FIFO (First In, First Out). Il n'y a aucun moyen d'organiser les travaux par priorité.
    • Il n'y a pas d'options pour le clustering.

    Tout cela dit que Beanstalkd constitue un système de file d'attente rapide et efficace pour des projets simples qui vivent sur un seul serveur. Pour beaucoup, c'est plus rapide et plus stable que Redis. Donc si vous avez problèmes avec Redis que vous n'arrivez pas à résoudre quoi qu'il arrive, et vos besoins sont simples, Beanstalkd vaut la peine d'être essayé.

    Conclusion

    Si vous avez lu jusqu'ici (ou atteint ici skim-reading 😉), il y a de fortes chances que vous soyez intéressé par les systèmes de mise en file d'attente ou que vous en ayez besoin. Si tel est le cas, la liste de cette page vous sera utile, à moins que vous ne recherchiez un système de file d'attente spécifique à une langue / structure.

    J'aimerais pouvoir vous dire que la file d'attente est simple et fiable à 100%, mais ce n'est pas le cas. C'est compliqué, et comme tout est en arrière-plan et se passe très vite (les erreurs peuvent passer inaperçues et devenir très coûteuses). Pourtant, les files d'attente sont très nécessaires au-delà d'un certain point, et vous constaterez qu'elles sont une arme puissante (peut-être même la plus puissante) dans votre arsenal. Bonne chance! 🙂