2009-02-28 7 views
2

Je suis en train de concevoir un système pour traiter un service Web externe. Le service limite le nombre de demandes pouvant être effectuées sur une certaine période (T). Le système permet le batching d'un certain nombre de requêtes (R). Le service prend en charge un certain nombre d'opérations (O).Conception de file d'attente à plusieurs niveaux

Mon code traitera un nombre inconnu de demandes d'utilisateurs (Je n'ai vraiment aucune idée à ce stade, pourrait être une demande par jour, pourrait être des milliers par seconde, je dois le construire avec l'hypothèse de milliers par seconde bien que). Ces résultats seront mis en cache dans une base de données pendant un certain temps. Lorsque les enregistrements de la base de données sont obsolètes, le système doit à nouveau demander les données au service Web.

Je peux uniquement accéder au service Web via une adresse IP avec un compte (pas de tricherie et obtenir un compte par type d'opération, ou une machine par type d'opération). Le système fonctionnera (espérons-le) sur un seul serveur.

Ce que je suis en train de faire (été penser sur et en dehors pendant deux ou trois semaines sans aucun résultat qui me plaît) est venu avec un système où:

  • demandes en double sont fusionnées (en double signifie qu'ils ont la même demande de données)
  • demandes des utilisateurs ont des demandes priorité sur le système
  • une demande du système peut être modifiée à la demande de l'utilisateur (mise à jour de base de données est en attente et un utilisateur demande les mêmes données)
  • s'il n'y a pas de demandes d'utilisateur R pour le p l'opération articulaire puis le reste sont pris des demandes système
  • les demandes des utilisateurs sont traitées dans le même ordre que celui dans lequel elles interviennent (sauf qu'une fois qu'une demande d'utilisateur est traitée, les requêtes R du même type sont traitées).

Ainsi, par exemple, T est de 1 seconde, R est 3 et O est 2. Les demandes suivantes entrent dans le système:

Request 1, user, operation A, data 1 
Request 2, user, operation A, data 2 
Request 3, user, operation A, data 1 <- duplicate of request 1 
Request 4, system, operation B, data 3 
Request 5, system, operation A, data 1 <- duplicate of request 3 
Request 6, user, operation B, data 3 <- duplicate of Request 4 
Request 7, system, operation A, data 4 
Request 8, user, operation A, data 5 
Request 9, user, operation A, data 6 
Request 10, user, operation A, data 7 
Request 11, user, operation B, data 8 

Une fois que vous traitez avec les doublons vous obtiendrez ce :

Request 1, user, operation A, data 1 
Request 2, user, operation A, data 2 
Request 4, user, operation B, data 3 <- promoted to user from system (msg 6)  
Request 7, system, operation A, data 4 
Request 8, user, operation A, data 5 
Request 9, user, operation A, data 6 
Request 10, user, operation A, data 7 
Request 11, user, operation B, data 8 

les demandes doivent être traitées dans l'ordre suivant:

T1 Request 1, Request 2, Request 8 
T2 Request 4, Request 11 
T3 Request 9, Request 10, Request 7 

Je pense qu'il y aura probablement 3-7 types d'opération. Certains types d'opérations auront plus de demandes que d'autres. Les demandes système seront probablement plus nombreuses que les demandes des utilisateurs.

Existe-t-il un moyen commun de traiter ce genre de problème? Un modèle ou une technologie? Suis-je en train de le surcharger (malheureusement, je ne peux pas obtenir les statistiques d'utilisation avant qu'il ne soit opérationnel, je ne peux même pas raisonnablement deviner de quoi il s'agit)?

Les principales choses que je suis en train d'éviter sont:

  • ayant des demandes de système traitées sur les demandes des utilisateurs (une demande de système peut attendre des semaines, une demande d'utilisateur doit être processus dès qu'il peut être)
  • ne pas faire la même demande deux fois dans la période pendant laquelle les données sont mises en cache dans la base de données

Répondre

1

Je résous qu'en ayant deux files d'attente: l'un pour l'utilisateur et un pour les demandes de système. Concevoir chaque file d'attente comme étant un ensemble ordonné lexicographiquement contenant un tuple de (type d'opération, données, heure d'arrivée); Cela suppose que vous pouvez définir une commande sur vos données. Les ensembles ordonnés permettent la recherche par des clés partielles, ce qui vous permet de vérifier les demandes en double dans les deux files d'attente et permet de promouvoir un système à la demande de l'utilisateur. Cependant, je ne comprends pas très bien le rôle de la variable T.

+0

Merci pour la réponse. T est la quantité de temps entre les demandes (je peux en faire une demande en second lieu), c'est pourquoi j'ai besoin de traiter autant que possible. 1 demande une seconde pendant 10 secondes ou 10 demande une seconde pendant 1 seconde est une énorme différence. Je ne suis pas sûr que cela compte dans la conception - juste le motif. – TofuBeer

Questions connexes