2009-06-19 6 views
0

Ich entwerfe eine WCF-Schnittstelle, die Status aller Aufträge zurückgibt (Bestelldatenstruktur enthält zwei Mitglieder, eine Zeichenfolge Typ ID und ein Enum orderstatus, und als DataContract entworfen), die Summe Anzahl der Bestellungen sind sehr groß, ca. 10M. Ich bin besorgt über den Verkehr und die Auswirkungen auf die Server-Seite, wenn der Kunde diese Schnittstelle API aufruft, um alle Bestellstatus zu erhalten und diese API aufrufen.Web-Services-Interface-Design, die große Menge an Daten zurückgibt

Irgendwelche Ratschläge?

Ich verwende VSTS 2008 + C# +. Net 3.5 + WCF.

Antwort

2
  • Nicht alle 10m Rekord zurückgeben.
  • Verwenden Paging-Technologie ...
+0

1. Wenn ich nicht 10M Datensatz zurückgeben, wie könnte Client kennt den genauen Status aller Aufträge? Noch mehr Ratschläge? 2. Verwenden Sie Paing-Technologien - Ich kenne nur Paging von ASP.Net und weiß nicht, wie man es in WCF verwendet, irgendwelche Ratschläge? – George2

3

Ich würde ozczecho unterstützen - warum sollten Sie jemals 10M wollen Datensätze zurück? Werden Ihre Kunden WIRKLICH 10M Bestellungen durchforsten? Ich bezweifle es sehr ...

Begrenzen Sie die Nummer - z. Datumsbereiche (alle Bestellungen von 1Q/09) oder nach anderen Kriterien. Nur weil Sie 10M Zeilen zurückgeben können, bedeutet das nicht, dass es wirklich eine gute Idee ist.

Auch zusammen mit SQL Server können Sie problemlos Paging, z. Sie könnten Ihren WCF-Dienst die erste z. 100 Zeilen, und senden Sie eine Markierung zurück, die anzeigt, dass es mehr gibt, und lassen Sie dann Ihren Klienten Reihen 101 bis 200 etc. anfordern. Es erfordert ein wenig Logik, aber es würde Kommunikation so viel einfacher (und schneller) machen!

Auch in WCF müssen Sie maximale Nachrichtengrößen definieren - sie sind normalerweise bei 64 KB. Der Grund dafür ist die Tatsache, dass eine Nachricht vollständig im Speicher gesammelt werden muss, bevor sie übertragen werden kann. Stellen Sie sich vor, Sie haben 50 Clients auf Ihrem Server - wie viel Speicher können Sie wirklich für "Message Assembly" auf Ihrem Server reservieren?

Marc

UPDATE:
Eine Möglichkeit, Paging in einem Service erreichen kann, indem man einen Anruf etwas so sein würde:

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

ist inspiriert von der .skip() und .Take() - Erweiterungsmethoden, die von LINQ eingeführt wurden.

In diesem Fall könnten Sie GetOrders aufrufen und einige Suchkriterien definieren (dies könnte auch eine Klasse anstelle einer Zeichenfolge sein), um Ihre Bestellungen zu sortieren. Sie können festlegen, wie die Bestellungen sortiert werden, indem sortExpression und dann sagst du dem Dienst, dass du die ersten n Zeilen überspringen willst und nimm dann x Zeilen.

So ein Anruf

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

würden die ersten 50 Reihen holen. Sobald Sie fertig sind, können Sie wieder anrufen:

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

und jetzt würden Sie die ersten 50 Zeilen überspringen (die Sie bereits angezeigt/berichtet), und dann nehmen Sie die nächsten 50 (Zeilen 51- 100).

Wenn Ihr WCF-Dienst im Back-End LINQ verwendet, können Sie dies natürlich direkt in Aufrufe von .Skip() und .Take() in Ihren LINQ-Abfragen umsetzen!:-)

UPDATE 2:
Arbeiten Sie gegen SQL Server 2005 oder höher? Schauen Sie sich die Common Table Expressions (CTE) an, die im Grunde genommen die Grundlage für LINQ sind. Dadurch können Sie eine "virtuelle" Sicht auf Ihre Daten definieren und nur einen bestimmten Abschnitt des Datensatzes auswählen.

Weitere Informationen hier:

+0

1. "Sie könnten Ihren WCF-Dienst die ersten 100 Zeilen zurücksenden lassen und ein Flag zurücksenden, das angibt, dass es noch mehr gibt und dann Ihren Client Zeilen 101 bis 200 usw. anfragen" - um diese Idee zu implementieren. Aber seit neu zu dieser Idee, nicht sicher, wie Schnittstelle zu definieren, können Sie bitte einige Schnittstelle Deklarationscode teilen? 2. "Maximale Nachrichtengröße definieren" - Ich denke, nur die Größe der Anfrage-Nachricht könnte definiert werden? Können wir die maximale Antwortnachrichtengröße definieren? 3. "ozczecho" bedeutet? Ich erinnere mich nicht, dass es solche Technologie in WCF gibt? – George2

+1

@ George2: "ozczecho" ist der Name des anderen Beantworters :-) –

+0

Danke für Ihre Antwort, wenn ich LINQ nicht verwenden kann (nicht alle unsere Projekte verwenden .Net 3.5, einige verwenden. Net 3.0, und in. Net 3.0 gibt es nur WCF, kein LINQ), wie implementiere ich Funktionen wie fetch vom a-ten Datensatz zum b-ten Datensatz? Jede zugrunde liegende ADO.Net-Funktion, die wir nutzen könnten? – George2

Verwandte Themen