Problème de conception: partage, synchronisation, accès aux données dans l’application… la meilleure approche?

StackOverflow https://stackoverflow.com/questions/202751

Question

J'ai une application Web (asp.net) dans laquelle les éléments de travail sont soumis et attribués aux utilisateurs en fonction de leur charge de travail.

La charge de travail d'un utilisateur est calculée à l'aide d'un algorithme basé sur le nombre d'éléments actuellement attribués à l'utilisateur (et sur certains autres facteurs). Chaque nouvel élément est attribué à l'utilisateur ayant la charge de travail actuelle la plus basse, augmentant ainsi leur charge de travail. La charge de travail d'un utilisateur diminue lorsqu'elle termine un élément. Les articles seront soumis, alloués et finis simultanément - par conséquent, les niveaux de charge de travail changeront continuellement. Les éléments de travail sont stockés dans une base de données SQL.

J'ai besoin d'un moyen de m'assurer que chaque décision d'allocation est prise en utilisant une image actualisée de la charge de travail de l'ensemble des utilisateurs.

Mon idée est de fournir un magasin synchronisé en lecture / écriture des informations de charge de travail dans le cache.

Est-ce la meilleure approche? Ou devrais-je utiliser la base de données pour contrôler le verrouillage? Comment éviter les goulots d'étranglement dans mon application?

Un conseil très apprécié.

Était-ce utile?

La solution

Cela dépend de nombreux facteurs. Lorsque vous vous référez au cache, entendez-vous le cache standard fourni par Asp.Net?

Est-il absolument essentiel que vous disposiez toujours des informations les plus récentes, ou si deux demandes sont attribuées, est-il correct de les attribuer aux deux utilisateurs les moins occupés au moment où la demande a été faite?

Vous pouvez effectivement utiliser un cache pour stocker ces informations, mais cela suppose généralement que vous n'utiliserez qu'un seul serveur. Est-il probable que vous utilisiez la mise en cluster ou l'équilibrage de la charge pour des charges élevées?

Le meilleur conseil que je puisse vous donner est de construire une application bien conçue, avec un modèle de domaine riche représentant les charges de chaque utilisateur et de la file d'attente, un accès aux données faiblement couplé et de nombreux tests automatisés d'unités et de systèmes. De cette manière, vous pouvez créer une application opérationnelle, mettre le système en marche rapidement sans trop vous soucier de l'optimisation et lancer le test de performance / profilage dès que possible.

Si \ lorsque vous rencontrez des problèmes de performances, vous pouvez ensuite identifier les goulots d'étranglement en établissant un profil \ traçage et en ajoutant une optimisation selon le cas, qui peut être une mise en cache ou des requêtes optimisées \ vues ou combinaisons d'éléments.

Si vous essayez de deviner où sont vos goulots d'étranglement et de les supprimer, vous risquez de vous tromper et d'endommager la conception du système. Un système bien conçu peut être optimisé quand vous en avez besoin.

Au départ, j’envisageais cela comme une base de données relationnelle (utilisant éventuellement des vues ou des procédures stockées pour saisir rapidement les informations récapitulatives de la charge de travail) avec une couche de mappage de données entre celle-ci et le modèle de domaine (pouvant utiliser la mise en cache, le chargement par mappage d'identité pour fournir des gains d'efficacité si nécessaire). Le modèle de domaine contiendrait en grande partie une représentation de la charge de travail.

Je m'attendrais à ce que les utilisateurs, les éléments de travail, les files d'attente de travail et les classes de stratégie d'allocation soient utilisés. Une grande partie de cette information pourrait être conservée en mémoire ou stockée localement entre les demandes. Chaque demande pourrait être représentée par un événement permettant de mettre à jour le modèle.

E.g.
L'utilisateur complète un élément de travail
Site déclenche un événement de domaine pour notifier le changement de modèle de domaine Le modèle de domaine
reçoit l'événement et met à jour la charge de travail de l'utilisateur

L’attribution du travail consisterait alors à demander au modèle de domaine de le répartir (ce qu’il effectuerait via une stratégie de recherche de l’utilisateur le moins alloué) en cas de besoin. Cela peut se produire en arrière-plan en dehors des demandes de travail individuelles et des événements générés pour informer les utilisateurs lors de la prochaine demande de travail.

Autres conseils

Utilisez la base de données pour contrôler cela.

Si, pour une raison quelconque, vous deviez utiliser davantage une batterie de serveurs Web à l'avenir, vous ne rencontrerez aucun problème. Toutefois, si vous mettez les données en cache et travaillez localement, des événements intéressants se produiront.

Vous pouvez également tirer parti des paramètres de jardin Web pour vous aider à gérer toute charge que votre serveur aurait; ce qui n’est pas tout à fait possible dans une situation en cache.

Deuxièmement, sachez que cela ne doit probablement pas être parfait. Si vous avez beaucoup de travail (par exemple, la distribution de prospects dans un centre d'appels), il vous suffit de vous rapprocher à la limite tant que c'est rapide.

J'utiliserais une base de données pour contrôler cela, car il est hautement improbable que les utilisateurs terminent leur travail assez rapidement pour nécessiter une approche plus en temps réel.

J'aurais donc une série de tableaux, relatifs aux éléments de travail, que vous pouvez interroger pour calculer les niveaux de travail actuels et déterminer ainsi la prochaine personne à recevoir un élément de travail particulier.

Vous pouvez ensuite disposer d'une série de procédures stockées pour marquer les éléments de travail comme étant terminés ou pour affecter un élément de travail à quelqu'un.

Pour minimiser les goulots d'étranglement, assurez-vous que votre base de données est bien normalisée et que vos procédures stockées n'utilisent pas beaucoup de tables, ce qui devrait être accéléré.

Pour vérifier cela, vous pouvez écrire des faisceaux de test pour vous assurer de l’attribution des éléments de travail. Les performances sont ce que vous désirez en cas de forte utilisation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top