Domanda

Sto lavorando su un servizio web in questo momento e c'è la possibilità che i risultati potrebbero essere molto grande ( > 5 mb).

E ' perfettamente valida per questo insieme di dati di questo grande e il servizio web può essere chiamato sia sincrono o asincrono, ma mi chiedo che cosa la gente pensa sono i seguenti:

  1. Se la connessione viene persa, il tutto il resultset dovrà essere rigenerato e inviato di nuovo.C'è un modo per fare qualsiasi tipo di "resume" se la connessione viene persa o reset?

  2. È l'invio di un set di risultati di questo grande anche appropriato?Sarebbe meglio implementare una sorta di "paging" in cui il resultset è generata e memorizzata sul server e il client può quindi scaricare i pezzi del resultset in piccole quantità e ri-assemblare il set a loro fine?

È stato utile?

Soluzione

Ho visto tutti e tre gli approcci, di paging, memorizzare e recuperare, e spinta enorme.

Penso che la soluzione al tuo problema dipende in qualche misura perché il risultato è così grande e come si è generato.Fare i vostri risultati di crescere nel tempo, sono calcolati tutti in una volta e poi spinto, vuoi per lo streaming di loro non appena li avete?

Paging Approccio

Nella mia esperienza, l'utilizzo di un paging approccio è appropriato quando il cliente ha bisogno di un rapido accesso a dimensioni ragionevoli i pezzi del set di risultati simili per pagine nei risultati di ricerca.Le considerazioni qui sono complessivamente chiacchiere di protocollo, memorizzazione nella cache di un intero set di dati tra client richieste di pagina, e/o il tempo di elaborazione necessario per generare una pagina di risultati.

Memorizzare e recuperare

Memorizzare e recuperare è utile quando i risultati non sono ad accesso casuale e il set di risultati cresce in dimensioni come l'elaborazione della query.Questioni da considerare sono la complessità per i clienti e se è possibile fornire all'utente i risultati parziali o se avete bisogno di calcolare tutti i risultati prima di restituire nulla al cliente (si pensi ordinamento dei risultati dei motori di ricerca distribuiti).

Spinta Enorme

La spinta enorme approccio è quasi certamente sbagliata.Anche se il cliente ha bisogno di tutte le informazioni e ha bisogno di essere spinto in un singolo set di risultati, vi consiglio di prendere l'approccio di WS-ReliableMessaging (direttamente o attraverso la propria versione semplificata) e chunking i tuoi risultati.In questo modo si

  1. assicurarsi che i pezzi di raggiungere il cliente
  2. può scartare il pezzo non appena si ottiene una ricevuta dal client
  3. in grado di ridurre i problemi possibili con il consumo di memoria da dover mantenere 5MB di XML, DOM, o qualsiasi altra cosa nella memoria (supponendo che non sono l'elaborazione dei risultati in streaming modo) sul server e client lati.

Come hanno detto gli altri, però, non fare nulla fino a quando si conosce il risultato di impostare la dimensione, come si è generato, e in generale le prestazioni a problemi reali.

Altri suggerimenti

Non c'è alcuna legge contro 5 Mb come risultato di impostare la dimensione.Più di 400 Mb, può essere difficile inviare.

Avrete automaticamente async gestori (dal momento che si sta utilizzando .net)

implementare una sorta di "paging" in cui il resultset è generata e memorizzata sul server e il client può quindi scarica pezzi del set di risultati in i più piccoli importi e ri-assemblare il insieme a loro fine

Questo sta già avvenendo per voi si chiama tcp/ip ;-) Re-implementazione che potrebbe essere eccessivo.

Allo stesso modo --

tutto il resultset dovrà essere rigenerato e inviato di nuovo

Se è MS-SQL, per esempio, che genera la maggior parte del set di risultati -- poi ri-generazione, a vantaggio di alcuni implicita cacheing in SQL Server e le generazioni successive sarà più veloce.

In qualche misura si può ottenere via con non preoccuparsi di questi problemi, fino a che la superficie come problemi 'reali', perché la piattaforma(s) che si sta utilizzando prendersi cura di un sacco di colli di bottiglia delle prestazioni per voi.

Io sono un po ' in disaccordo con secretGeek commento:

Questo sta già avvenendo per voi si chiama tcp/ip ;-) Re-implementazione che potrebbe essere eccessivo.

Ci sono volte in cui si vuole fare proprio questo, ma in realtà solo da una UI prospettiva.Se si implementa qualche modo a flusso di dati al client (via qualcosa come un pushlets meccanismo), o un pezzo di esso in pagine come suggerisci tu, è quindi possibile caricare alcuni davvero piccolo sottoinsieme sul client e poi lentamente costruire l'interfaccia utente con la piena quantità di dati.

Questo rende per un impermeabile, più veloci di UI (dal punto di vista dell'utente), ma devi valutare se lo sforzo ne vale la pena...perché non credo che sarà una quantità insignificante di lavoro.

Così suona come voi, sarei interessato a una soluzione che aggiunge "numero di record iniziale" e " finale record del numero di parametro al metodo web.(o "numero di pagina" e "numero di risultati per pagina')

Questo non dovrebbe essere troppo difficile se l'archivio di backup di sql server (mysql o anche) come hanno costruito il supporto per la numerazione delle righe.

Nonostante questo, si dovrebbe essere in grado di evitare di fare qualsiasi gestione di sessione sul server, per evitare qualsiasi esplicita la cache del set di risultati, e solo contare sul supporto del negozio di cache per mantenere la vostra vita semplice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top