Gestione di processi basati sul Web di grandi dimensioni

0

Sto lavorando su una nuova funzione per un sito Web ASP.NET MVC. Il tempo di esecuzione è piuttosto lungo al momento, quindi sto considerando le opzioni.

La funzione prende un foglio di calcolo Excel, lo carica sul server web. Quindi è necessario selezionare tutte le righe e utilizzando Entity Framework inserire le righe in un database. Ogni riga corrisponde al modello di entità richiesto. Attualmente a solo 50000 righe, questo processo richiede un po 'di tempo e suppongo che il numero di righe crescerà in futuro.

Ho alcune opzioni per l'elaborazione qui e mi chiedo se c'è un modo migliore per gestirlo. Le due idee che ho ora sono

1) Consegnare il lavoro a un servizio che, a completamento, invia un messaggio all'utente. L'ovvio vantaggio è che l'utente non ha bisogno di tenere aperta la finestra del browser. 2) Aggiungi una barra di avanzamento e il servizio passa gli aggiornamenti a jquery / javacript per eseguire aggiornamenti visivi.

Cercherò di ridurre il tempo, eventualmente spostando le query dal fare affidamento su Entity Framework. A volte le stored procedure sono molto più veloci di Linq To Entities, ma a parte questo, il processo potrebbe richiedere ancora più di qualche secondo, il che non mi piace per l'utente.

Qualcuno può pensare ad altri / modi migliori per gestire i lunghi processi in esecuzione su un'applicazione web? Esistono scuole di pensiero sulle migliori pratiche sulla gestione di queste situazioni?

    
posta James 15.07.2013 - 12:18
fonte

2 risposte

1

Fare il servizio o l'attività in background è una tattica corretta qui - i server web sono pensati per servire solo brevi richieste, non per attività a lungo termine. Meglio tenerli fuori dal server. Hai anche il vantaggio di rendere più semplici le cose come l'elaborazione di massa, poiché è lì seduto in attesa di fare la cosa.

Se ha bisogno di essere sincrono, una sorta di barra di avanzamento è in ordine. Un'altra opzione sarebbe un semplice pannello di stato e opzioni di notifica, soprattutto se le cose iniziano a richiedere più tempo quando si ha traffico reale.

    
risposta data 15.07.2013 - 14:52
fonte
1

A un certo punto è necessario andare asincroni, tuttavia è piuttosto complesso e eviterei di farlo finché non avrai davvero il problema.

Ci sono alcuni approcci diversi ma il tuo server web dovrebbe fare il meno possibile. Il modo più semplice per gestirlo è lasciare che gestisca il caricamento e inserisca il file in una cartella.

Ci sono approcci diversi qui, ma un altro processo di lavoro dovrà prendere il file ed elaborarlo (btw, il framework di entità potrebbe non essere la scelta migliore per questo tipo di sollevamento pesante). Per eseguire lo spin di un altro processo, in genere è possibile eseguire una di queste operazioni

  • Come hai detto, puoi richiamare un servizio separato in modo asincrono.
  • Avere un servizio pianificato perlustrare la directory di destinazione alla ricerca di nuovi file. Questo è buono perché può essere eseguito su un server completamente diverso dal server web, se necessario, tuttavia per lo stesso motivo per cui è molto difficile, fornire report di progresso in tempo reale all'utente. Inoltre, induci una latenza (ad esempio se esegui la scansione della cartella ogni 5 minuti, l'utente potrebbe dover attendere almeno per questo tempo).
  • Avere un thread di risposta per far passare un thread in background. Pro, è abbastanza facile ottenere progressi e spingerlo al browser, ma con, stai usando il web server per fare cose non web, a meno che tu non stia attento a fare in modo che questo non sia scalabile come immagineresti.
  • Invia un messaggio a una coda di messaggi che lo invia all'operatore in background. Ciò rende possibile avere una comunicazione bidirezionale, ma è probabilmente la soluzione più complessa dei tre (perché ha molte parti mobili).

In generale ti consiglierei di usare la soluzione più semplice possibile che funzionerebbe e userei solo una soluzione più complessa se sei costretto dalle circostanze. Questi tipi di cose tendono a diventare diabolicamente complessi e difficili da debugare molto rapidamente.

    
risposta data 15.07.2013 - 18:27
fonte

Leggi altre domande sui tag