2009-06-19 6 views
0

Je suis en train de concevoir une interface WCF qui retourne le statut de toutes les commandes (la structure des données de commande comprend deux membres, un ID de type chaîne et un enum orderstatus). Nombre de commandes sont très grandes, environ 10M. Je suis préoccupé par le trafic et l'impact sur le côté serveur si le client appelle cette interface API pour obtenir l'état de toutes les commandes et appeler cette API de manière fréqente.conception d'interface de services Web qui renvoie une grande quantité de données

Un conseil? Je suis en train d'utiliser VSTS 2008 + C# + .Net 3.5 + WCF.

Répondre

2
  • Ne pas retourner tous les 10m.
  • Utiliser la technologie Paging ...
+0

1. Si je ne reviens pas 10M dossier, comment pourrait-client connaît le statut exact de tous les ordres? D'autres conseils? 2. Utiliser les technologies Paing - Je ne connais que la pagination depuis ASP.Net, et je ne sais pas comment l'utiliser dans WCF, un conseil? – George2

3

Je soutiendrais ozczecho - pourquoi voudriez-vous jamais retourner des enregistrements de 10M? Vos clients vont-ils vraiment vouloir passer au crible les commandes de 10M? J'en doute fortement ...

Limiter le nombre - par ex. plages de dates (tous les ordres du 1er trimestre 2009), ou par tout autre critère. Ce n'est pas parce que vous pouvez renvoyer 10 millions de lignes que ce sera vraiment une bonne idée.

De même, avec SQL Server, vous pouvez facilement implémenter le paging, par ex. vous pourriez demander à votre service WCF de renvoyer la première par ex. 100 lignes, et renvoyez un drapeau indiquant qu'il y en a plus, puis demandez à votre client de demander les lignes 101 à 200, etc. Cela prend un peu de logique, mais cela rendrait la communication tellement plus facile (et plus rapide)!

En outre, dans WCF, vous devez définir des tailles de message maximales - elles sont normalement à 64 Ko. La raison en est le fait qu'un message doit être assemblé en mémoire, dans son intégralité, avant de pouvoir être transmis. Imaginez que vous avez 50 clients sur votre serveur - combien de mémoire pouvez-vous vraiment mettre de côté pour "l'assemblage de messages" sur votre serveur?

Marc

MISE À JOUR:
Une façon vous pouvez obtenir la pagination dans un service serait en ayant un quelque chose d'appel comme celui-ci:

[OperationContract] 
public List<Orders> GetOrders(string searchCriteria, string sortExpression, 
           int skipFirstRows, int takeRows) 

Ceci est inspiré par le .Skip() et .Take() méthodes d'extension introduites par LINQ. Dans ce cas, vous pouvez appeler GetOrders et définir des critères de recherche (qui peuvent également être une classe, au lieu d'une simple chaîne) pour correspondre à vos commandes, vous pouvez définir comment trier les ordres en spécifiant sortExpression, et Ensuite, vous dites au service que vous voulez ignorer les n premières lignes, puis prendre x lignes.

donc un appel

List<Orders> result = GetOrders(criteria, sort, 0, 50) 

allait chercher les 50 premières lignes. Une fois que vous avez terminé, vous pouvez appeler à nouveau:

List<Orders> result = GetOrders(criteria, sort, 50, 50) 

et maintenant vous voulez sauter les 50 premières lignes (que vous avez déjà affiché/rapporté) et vous prenez les 50 prochaines (lignes 51- 100).

Bien sûr, si votre service WCF sur le backend utilise LINQ, vous pouvez le traduire directement en appels à .Skip() et .Take() sur vos requêtes LINQ!:-)

MISE À JOUR 2:
travaillez-vous contre SQL Server 2005 ou plus? Découvrez les expressions de table communes (CTE) qui sont à la base de ce que fait LINQ. Cela vous permet de définir une vue "virtuelle" sur vos données et de sélectionner uniquement une certaine section de l'ensemble de données.

Voir plus d'informations ici:

+0

1. "vous pouvez demander à votre service WCF de renvoyer la première, par exemple 100 lignes, et renvoyer un indicateur indiquant qu'il y en a plus, puis demander à votre client de demander les lignes 101 à 200 etc. Mais depuis nouveau à cette idée, je ne sais pas comment définir l'interface, pourriez-vous partager un code de déclaration d'interface s'il vous plaît? 2. "définir la taille maximale des messages" - Je pense que seule la taille du message de requête peut être définie? Pourrions-nous définir la taille maximale du message de réponse? 3. "ozczecho" signifie? Je ne me souviens pas qu'il existe une telle technologie dans la WCF? – George2

+1

@ George2: "ozczecho" est le nom de l'autre répondeur :-) –

+0

Merci pour votre réponse, si je ne peux pas utiliser LINQ (pas tous nos projets utilisent .Net 3.5, certains utilisent .Net 3.0, et en. Net 3.0 il n'y a que WCF, pas de LINQ), comment est-ce que j'implémente des fonctions telles que fetch de l'enregistrement a-th à l'enregistrement de b-ème? Toute fonction ADO.Net sous-jacente que nous pourrions utiliser? – George2

Questions connexes