2010-10-25 4 views
2

J'ai l'intention de rendre un service où les gens pourraient soumettre des tâches (en particulier des tâches de transcodage) au système et ils devraient être servis bientôt, mais en même temps, il ne devrait pas mourir de faim. être juste. Si une personne soumet 2000 tâches, le système ne devrait pas toujours s'adresser uniquement à lui, mais plutôt faire un round robin ou quelque chose comme ça parmi les demandes des autres ...Fair file d'attente de tâches pour Java EE

Y at-il des solutions disponibles? J'ai regardé RabbitMQ et d'autres systèmes de messagerie, mais ils ne répondent pas exactement à mon problème. Comment les files d'attente de tâches justes sont-elles mises en œuvre?

Répondre

1

Je mettre en œuvre comme ceci:

Demandez à un auditeur de file d'attente sur une file d'attente qui lorsqu'un message arrive vérifie la dernière fois a été reçu une tâche de l'utilisateur donné; si le temps < 1 sec le mettre sur la file 1, si le temps < 10 secondes mis sur la file d'attente 2, si le temps < 100 secondes mis sur la file d'attente 3, sinon mis sur la file d'attente 4. Vous auriez alors des écouteurs sur les 4 files d'attente traiter les tâches.

Bien sûr, vous pouvez modifier le nombre de files d'attente et modifier les heures pour correspondre au meilleur débit. Idéalement, vous voulez que vos files d'attente soient occupées tout le temps.

0

Je ne pense pas que ce comportement existe en mode natif mais j'ai pu le voir implémenté avec certaines fonctionnalités de RabbitMQ.

http://www.rabbitmq.com/blog/2010/08/03/well-ill-let-you-go-basicreject-in-rabbitmq/

qui vous permet de rejeter les messages et les requeue. Vous devez alors écrire un utilitaire qui peut choisir d'exécuter ou de remettre en file d'attente des messages en fonction de certaines propriétés d'identification du message (dans ce cas, le demandeur de rapport, qui est personnalisé pour votre application). Vous pouvez concevoir la stratégie entièrement autour de la clé de routage si elle contient l'ID de l'utilisateur que vous essayez d'étrangler.

Votre politique pourrait être structurée en utilisant

  • répondre avec basic.reject
  • utilisant {requeue = true}

Espérons que cela aide!