Frage

Ich arbeite derzeit an einem Webdienst und es besteht die Möglichkeit, dass die zurückgegebenen Ergebnisse recht groß sind (> 5 MB).

Es ist völlig in Ordnung, dass dieser Datensatz so groß ist und der Webdienst entweder synchron oder asynchron genannt werden kann, aber ich frage mich, was die Leute zu Folgendem denken:

  1. Wenn die Verbindung verloren geht, muss das gesamte Ergebnisset wiederhergestellt und erneut gesendet werden.Gibt es eine Möglichkeit, eine Art "Lebenslauf" zu machen, wenn die Verbindung verloren geht oder zurückgesetzt wird?

  2. Ist das Senden einer so großen Ergebnismenge überhaupt angemessen?Wäre es besser, eine Art „Paging“ zu implementieren, bei dem die Ergebnismenge generiert und auf dem Server gespeichert wird und der Client dann Teile der Ergebnismenge in kleineren Mengen herunterladen und die Menge am Ende wieder zusammensetzen kann?

War es hilfreich?

Lösung

Ich habe alle drei Ansätze gesehen, ausgelagert, speichern und abrufen, Und massiver Schub.

Ich denke, die Lösung Ihres Problems hängt in gewissem Maße davon ab, warum Ihre Ergebnismenge so groß ist und wie sie generiert wird.Wachsen Ihre Ergebnisse mit der Zeit, werden sie auf einmal berechnet und dann übertragen, möchten Sie sie zurückströmen, sobald Sie sie haben?

Paging-Ansatz

Meiner Erfahrung nach ist die Verwendung eines Paging-Ansatzes angemessen, wenn der Kunde schnellen Zugriff auf angemessen große Teile der Ergebnismenge benötigt, ähnlich wie Seiten in Suchergebnissen.Zu berücksichtigen sind hierbei die allgemeine Konversationsfähigkeit Ihres Protokolls, die Zwischenspeicherung des gesamten Ergebnissatzes zwischen Client-Seitenanfragen und/oder die Verarbeitungszeit, die zum Generieren einer Ergebnisseite benötigt wird.

Speichern und abrufen

Speichern und Abrufen ist nützlich, wenn es sich bei den Ergebnissen nicht um Zufallszugriffe handelt und die Ergebnismenge mit der Verarbeitung der Abfrage an Größe zunimmt.Zu berücksichtigen sind hier die Komplexität für Kunden und die Frage, ob Sie dem Benutzer Teilergebnisse liefern können oder ob Sie alle Ergebnisse berechnen müssen, bevor Sie etwas an den Kunden zurückgeben (denken Sie an die Sortierung von Ergebnissen aus verteilten Suchmaschinen).

Massiver Vorstoß

Der Massive-Push-Ansatz ist mit ziemlicher Sicherheit fehlerhaft.Selbst wenn der Kunde alle Informationen benötigt und diese in einer monolithischen Ergebnismenge bereitgestellt werden müssen, würde ich den Ansatz von empfehlen WS-ReliableMessaging (entweder direkt oder über Ihre eigene vereinfachte Version) und die Aufteilung Ihrer Ergebnisse.Indem Sie dies tun

  1. sorgen dafür, dass die Stücke den Kunden erreichen
  2. Sie können den Block verwerfen, sobald Sie eine Quittung vom Kunden erhalten
  3. kann die möglichen Probleme mit dem Speicherverbrauch reduzieren, da auf der Server- und Clientseite 5 MB XML, DOM oder was auch immer im Speicher verbleiben müssen (vorausgesetzt, Sie verarbeiten die Ergebnisse nicht im Streaming-Verfahren).

Wie andere bereits gesagt haben, unternehmen Sie jedoch nichts, bis Sie wissen, dass die Größe Ihrer Ergebnismenge, die Art und Weise, wie sie generiert wird, und die Gesamtleistung tatsächlich von Bedeutung sind.

Andere Tipps

Es gibt kein strenges Gesetz gegen eine Ergebnissatzgröße von 5 MB.Über 400 MB können sein schwer zu versenden.

Sie erhalten automatisch asynchrone Handler (da Sie .net verwenden).

Implementieren Sie eine Art "Paging", bei dem das Ergebnis auf dem Server generiert und gespeichert wird und der Client dann in kleineren Mengen die Brocken des Ergebniss herunterladen und das Set am Ende neu zusammenbumpfen kann

Das passiert bei Ihnen bereits – es heißt tcp/ip ;-) Eine erneute Implementierung könnte übertrieben sein.

Ebenso –

Das gesamte Ergebnis muss regeneriert und erneut gesendet werden

Wenn es beispielsweise MS-SQL ist, das den größten Teil des Ergebnissatzes generiert, wird bei der erneuten Generierung ein Teil des impliziten Caches in SQL Server genutzt, und die nachfolgenden Generationen werden schneller sein.

Bis zu einem gewissen Grad können Sie damit davonkommen, sich über diese Probleme keine Sorgen zu machen, bis sie als „echte“ Probleme auftauchen – denn die Plattform(en), die Sie verwenden, kümmert sich um einen Großteil der Leistungsengpässe für Sie.

Ich bin mit dem Kommentar von SecretGeek nicht ganz einverstanden:

Das passiert bei Ihnen bereits – es heißt tcp/ip ;-) Eine erneute Implementierung könnte übertrieben sein.

Es gibt Zeiten, in denen Sie genau das tun möchten, aber eigentlich nur aus Sicht der Benutzeroberfläche.Wenn Sie eine Möglichkeit implementieren, die Daten entweder an den Client zu streamen (über so etwas wie einen Pushlets-Mechanismus) oder sie, wie Sie vorschlagen, in Seiten aufzuteilen, können Sie dann eine wirklich kleine Teilmenge auf den Client laden und dann langsam die Benutzeroberfläche aufbauen die volle Datenmenge.

Dies sorgt für eine schlankere und schnellere Benutzeroberfläche (aus Sicht des Benutzers), aber Sie müssen abschätzen, ob sich der zusätzliche Aufwand lohnt ...denn ich glaube nicht, dass es ein unbedeutender Arbeitsaufwand sein wird.

Es scheint also, dass Sie an einer Lösung interessiert wären, die Ihrer Webmethode die Parameter „Startdatensatznummer“ und „Enddatensatznummer“ hinzufügt.(oder „Seitenzahl“ und „Ergebnisse pro Seite“)

Dies sollte nicht allzu schwierig sein, wenn der Sicherungsspeicher ein SQL-Server (oder sogar MySQL) ist, da dort Unterstützung für die Zeilennummerierung integriert ist.

Trotzdem sollten Sie in der Lage sein, jegliche Sitzungsverwaltung auf dem Server zu vermeiden, jegliche explizite Zwischenspeicherung der Ergebnismenge zu vermeiden und sich einfach auf die Zwischenspeicherung des Sicherungsspeichers zu verlassen, um Ihr Leben einfacher zu gestalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top