Pourquoi Redis pour la file d'attente?
J'ai l'impression que Redis peut faire un bon candidat pour l'implémentation d'un système de file d'attente. Jusqu'à présent, nous avons utilisé notre base de données MySQL avec interrogation, ou RabbitMQ. Avec RabbitMQ, nous avons eu de nombreux problèmes - les bibliothèques clientes sont très pauvres et boguées et nous aimerions ne pas investir trop d'heures de développement pour les corriger, quelques problèmes avec la console de gestion du serveur, etc. Et, pour le moment étant au moins, nous ne saisissons pas les millisecondes ou n'augmentons pas sérieusement les performances, donc tant qu'un système a une architecture qui prend en charge une file d'attente intelligemment, nous sommes probablement en bonne forme.
D'accord, c'est donc l'arrière-plan. Essentiellement, j'ai un modèle de file d'attente très classique et simple - plusieurs producteurs produisant du travail et plusieurs consommateurs consommant du travail, et les producteurs et les consommateurs doivent pouvoir évoluer intelligemment. Il s'avère qu'un naïf PUBSUB
ne fonctionne pas, car je ne veux pas que tous les abonnés consomment du travail, je veux juste qu'un abonné reçoive le travail. Au premier passage, il me semble que BRPOPLPUSH
c'est un design intelligent.
Pouvons-nous utiliser BRPOPLPUSH?
La conception de base BRPOPLPUSH
est que vous avez une file d'attente de travail et une file d'attente de progression. Lorsqu'un consommateur reçoit du travail, il pousse atomiquement l'élément dans la file d'attente de progression et lorsqu'il termine le travail, c'est LREM
lui. Cela empêche le blackholing du travail si les clients meurent et rend la surveillance assez facile - par exemple, nous pouvons dire s'il y a un problème obligeant les consommateurs à prendre beaucoup de temps pour effectuer des tâches, en plus de dire s'il y a un grand volume de tâches.
Il assure
- le travail est livré à exactement un consommateur
- le travail se termine dans une file d'attente de progression, donc il ne peut pas trou noir si un consommateur
Les inconvénients
- Il me semble plutôt étrange que le meilleur design que j'aie trouvé n'utilise pas réellement,
PUBSUB
car c'est ce sur quoi la plupart des articles de blog sur la mise en file d'attente sur Redis se concentrent. J'ai donc l'impression de manquer quelque chose d'évident. La seule façon que je vois d'utiliserPUBSUB
sans consommer les tâches deux fois est simplement de pousser une notification indiquant que le travail est arrivé, que les consommateurs peuvent ensuite non bloquerRPOPLPUSH
. - Il est impossible de demander plusieurs éléments de travail à la fois, ce qui semble être un problème de performances. Pas énorme pour notre situation, mais il est plutôt évident que cette opération n'a pas été conçue pour un débit élevé ou cette situation
- En bref: est -ce que je manque quelque chose de stupide?
Ajout également de la balise node.js, car c'est la langue avec laquelle je traite le plus. Node peut offrir quelques simplifications dans l'implémentation, compte tenu de sa nature à thread unique et non bloquant, mais en outre j'utilise la bibliothèque node-redis et les solutions devraient ou peuvent être sensibles à ses forces et faiblesses également.