Gestion des délais d'expiration du service Web lors de l'exécution de tâches de base de données à exécution longue

L'architecture de l'un de nos produits est un exemple typique de niveau 3 solution:

  • Client C#
  • Service web WCF
  • Base de données SQL Server

Le client demande des informations à partir du service web. Le service web hits de la base de données pour les informations et la renvoie au client.

Voici le problème. Certaines de ces requêtes peuvent prendre un long, long moment, et nous ne savons pas d'avance quels sont ceux qui seront lents. Nous savons que certains qui sont souvent plus lents que d'autres, mais même la plus simple des demandes peut être lent, compte tenu de suffisamment de données. Parfois utilise requête ou d'exécuter des rapports sur de grandes quantités de données. Les requêtes peuvent être optimisées que jusqu'à présent avant que le volume de données ralentit.

Si une requête dans la base de données atteint le maximum de délai d'expiration de requête dans SQL server, la base de données de la requête se termine, et le service web renvoie une erreur au client. C'est entendu. Nous pouvons nous occuper de ces erreurs.

Le client est en attente pour l'appel de service web pour compléter. Si la base de données prend beaucoup de temps, le client peut timeout sur son appel au service web. Le client donne, mais la demande de base de données continue le traitement. À ce stade, le client est hors de synchronisation avec la base de données. La base de données d'appel peut ou peut ne pas réussir. Il peut y avoir eu une erreur. Le client ne le saura jamais. Dans certains cas, nous ne voulons pas que nos utilisateurs de lancer une autre demande qui peut entraîner une défaillance de l'état compte tenu de l'achèvement de la précédente demande.

Je suis curieux de voir comment d'autres ont traité ce problème. Quelles stratégies avez-vous utilisées pour prévenir web service, délais d'expiration de toucher d'appels de base de données?

Les meilleures idées, je peux venir avec impliquent la réalisation d'une base de données de la couche quelque part, à l'intérieur du service web, joint à un message de la file d'attente-- quelque chose. Déchargement de chaque requête unique à un autre processus semble excessif. (Là encore, on ne sait pas toujours si une demande va être rapide ou lent.)

Ce serait génial si on pouvait séparer l'acte de faire une requête HTTP à partir de la loi de l'élaboration et de l'exécution d'un processus de base de données. J'ai vu ce fait avec un serveur personnalisé lors d'une précédente entreprise, mais c'était à l'aide de droites communication par socket, et je préfère éviter de remplacer le web service avec certaines applications personnalisées.

Noter que compte tenu de la quantité de données que nous traitons, nous sommes tous sur l'optimisation de la requête. L'optimisation de la requête, index, etc., vous prend seulement jusqu'ici lorsque le volume de données est élevé. Parfois, les choses prennent du temps.

source d'informationauteur Paul Williams | 2009-02-06