Rückgabe großer Ergebnisse über einen Webservice

9

Ich arbeite gerade an einem Web-Service und es gibt das Potenzial, dass die zurückgegebenen Ergebnisse ziemlich groß sein könnten (& gt; 5 MB).

Es ist vollkommen richtig, dass diese Datenmenge so groß ist und der Webservice entweder als Sync oder Async bezeichnet werden kann, aber ich frage mich, was die Leute über Folgendes denken:

  1. Wenn die Verbindung verloren geht, wird die das gesamte Ergebnisset muss sein regeneriert und erneut gesendet. ist da wie auch immer ich es irgendwie machen kann "Fortsetzen", wenn die Verbindung unterbrochen ist oder zurücksetzen?

  2. Ist das Senden einer Ergebnismenge so groß, sogar angemessen? Wäre es besser, eine Art "Paging" zu implementieren, bei dem die Ergebnismenge erzeugt und auf dem Server gespeichert wird und der Client dann Teile der Ergebnismenge in kleineren Mengen herunterladen und die Menge an ihrem Ende wieder zusammensetzen kann?

lomaxx 15.08.2008, 00:08
quelle

4 Antworten

3

Ich habe alle drei Ansätze gesehen, paged , Speichern und abrufen und massives Push .

Ich denke, die Lösung für Ihr Problem hängt in gewissem Maße davon ab, warum Ihre Ergebnismenge so groß ist und wie sie generiert wird. Wachsen Ihre Ergebnisse im Laufe der Zeit, werden sie alle gleichzeitig berechnet und dann verschoben, möchten Sie sie zurücksenden, sobald Sie sie haben?

Paging-Ansatz

Meiner Erfahrung nach ist die Verwendung eines Paging-Ansatzes angezeigt, wenn der Client schnellen Zugriff auf Teile der Ergebnismenge in vernünftiger Größe benötigt, die den Seiten in den Suchergebnissen ähnlich sind. Überlegungen hierzu sind die allgemeine Verständlichkeit Ihres Protokolls, das Zwischenspeichern des gesamten Ergebnissatzes zwischen den Client-Seitenanforderungen und / oder die Verarbeitungszeit, die zum Generieren einer Ergebnisseite benötigt wird.

Speichern und abrufen

Speichern und abrufen ist nützlich, wenn die Ergebnisse kein zufälliger Zugriff sind und die Ergebnismenge bei der Verarbeitung der Abfrage größer wird. Zu beachtende Probleme sind die Komplexität für Clients und wenn Sie dem Benutzer Teilergebnisse liefern können oder wenn Sie alle Ergebnisse berechnen müssen, bevor Sie etwas an den Client zurückgeben (denken Sie an das Sortieren der Ergebnisse von verteilten Suchmaschinen).

Massiver Push

Der massive Push-Ansatz ist fast sicher fehlerhaft. Selbst wenn der Client alle Informationen benötigt und in eine monolithische Ergebnismenge geschoben werden muss, würde ich empfehlen, den Ansatz WS-ReliableMessaging zu verwenden (entweder direkt oder über Ihre eigene vereinfachte Version) und Ihre Ergebnisse zu chunkern. Indem du das tust,

  1. stelle sicher, dass die Teile den Client erreichen
  2. kann den Chunk verwerfen, sobald Sie eine Quittung vom Client erhalten haben
  3. kann die möglichen Probleme mit der Speicherbelegung reduzieren, da 5 MB XML, DOM oder was auch immer im Speicher verbleiben muss (vorausgesetzt, dass Sie die Ergebnisse nicht streamweise verarbeiten) auf der Server- und Clientseite.

Wie andere bereits gesagt haben, tun Sie nichts, bis Sie wissen, wie groß die Ergebnismenge ist, wie sie generiert wird und wie die Gesamtleistung tatsächlich aussieht.

    
DavidValeri 28.05.2009, 13:47
quelle
2

Es gibt kein hartes Gesetz gegen 5 MB als Ergebnissatzgröße. Über 400 Mb können schwer zu senden .

Sie erhalten automatisch Async-Handler (da Sie .net verwenden)

  

implementieren Sie eine Art "Paging" wo   Das Resultset wird generiert und gespeichert   auf dem Server und dem Client kann dann   Teile des Resultsets herunterladen   kleinere Mengen und wieder zusammenbauen   an ihrem Ende setzen

Das ist schon passiert für Sie - es heißt tcp / ip ;-) Re-implementing das könnte Overkill sein.

Ähnlich -

  

Gesamter Resultset muss sein   neu generiert und erneut gesendet

Wenn es zum Beispiel MS-SQL ist, das den größten Teil des Resultsets generiert, dann wird das erneute Generieren den Vorteil eines impliziten Cachings in SQL Server nutzen und die nachfolgenden Generationen werden schneller sein.

Bis zu einem gewissen Grad können Sie sich keine Sorgen um diese Probleme machen, bis sie als "echte" Probleme auftauchen - weil die Plattform (n), die Sie verwenden, einen Großteil der Leistungsengpässe für Sie übernehmen / p>     

Leon Bambrick 15.08.2008 00:18
quelle
0

Ich stimme etwas mit dem Kommentar von secretGeek nicht überein:

  

Das ist schon passiert für Sie - es heißt tcp / ip ;-) Re-implementing das könnte Overkill sein.

Es gibt Zeiten, in denen Sie genau das tun möchten, aber wirklich nur aus der Sicht einer Benutzeroberfläche. Wenn Sie eine Möglichkeit implementieren, die Daten entweder über einen Pushlets-Mechanismus an den Client zu streamen oder sie wie vorgeschlagen in Seiten zu zerlegen, können Sie dann eine wirklich kleine Teilmenge auf den Client laden und dann langsam die Benutzeroberfläche mit erstellen die gesamte Datenmenge.

Dies sorgt für eine schlankere, schnellere Benutzeroberfläche (aus der Sicht des Benutzers), aber Sie müssen abschätzen, ob sich der zusätzliche Aufwand lohnt ... weil ich nicht glaube, dass es eine unbedeutende Menge an Arbeit sein wird.

    
Mike Stone 15.08.2008 00:31
quelle
0

Es klingt also so, als ob Sie an einer Lösung interessiert wären, die Ihrer Webmethode den Parameter 'Start-Datensatznummer' und 'End-Datensatznummer' hinzufügt. (oder "Seitennummer" und "Ergebnisse pro Seite")

Dies sollte nicht zu schwer sein, wenn der Backing-Speicher SQL-Server (oder sogar MySQL) ist, da sie Unterstützung für die Zeilennummerierung eingebaut haben.

Trotzdem sollten Sie in der Lage sein, jede Sitzungsverwaltung auf dem Server zu vermeiden, ein explizites Zwischenspeichern der Ergebnismenge zu vermeiden und sich nur auf das Zwischenspeichern des Backing-Speichers zu verlassen, um Ihr Leben zu vereinfachen.

    
Leon Bambrick 15.08.2008 01:40
quelle

Tags und Links