Asp.Net Architecture di un pool di thread per diversi utenti

1

Attualmente sto costruendo un sito web Asp.Net che permetterà di importare dati in diversi formati in un database. Lo stato di importazione dei singoli lavori di importazione è visibile a tutti gli utenti e, dato che un utente dispone di privilegi sufficienti, può anche interrompere un'importazione avviata da un altro utente. Se un'importazione passa attraverso i dati viene scritta su un'istanza sql-server. (La gestione dei dati è fatta attraverso la negazione)

Avrei bisogno di alcuni suggerimenti sulle migliori pratiche per costruire un threadpool condiviso che consenta l'annullamento delle attività.

Fino ad ora ho pensato che qualcosa del genere potesse essere implementata al meglio usando una coda di blocco seguendo uno schema produttore-consumatore. Ogni utente può generare lavori raccolti in un singolo servizio che poi aggiunge il lavoro alla coda. Il servizio dovrebbe quindi contenere anche un elenco separato con l'ID del lavoro e i relativi token di annullamento.

Modifica: la versione utilizzata è Asp.Net MVC 5. La coda di blocco utilizza la libreria parallela attività. La dimensione dei file da importare varia da 50kb a 5 mb.

    
posta narain 13.06.2017 - 12:49
fonte

1 risposta

2

Penso che tu stia meglio con un servizio separato e uno stack di code per questo, piuttosto che renderlo tutto in memoria. Sicuramente non provare ed eseguire il servizio in IIS

  • Scegli lo stack di accodamento, dato che ci si trova in .net MSMQ potrebbe essere più semplice in quanto non c'è nient'altro da installare. Oppure puoi implementare una coda semplice su una tabella sql.

  • crea un nuovo 'servizio' un servizio Windows funziona bene, ma ancora una volta puoi renderlo un'app per console eseguita su una pianificazione se è più facile

Il servizio, si occupa solo di un singolo articolo. e deve essere programmato per essere eseguito contemporaneamente a se stesso

  • seleziona l'elemento successivo fuori dalla coda e lo contrassegna in corso
  • inizia l'elaborazione del ciclo degli elementi
  • percentuale di aggiornamento completa
  • controlla la richiesta di cancellazione
  • termina l'elaborazione
  • contrassegna l'elemento della coda completo
  • scarica l'elemento successivo (o esci dall'app console)

Il tuo sito web può quindi aggiungere elementi alla coda, creare report sulla coda e sullo stato di ogni attività interrogando il database sql.

Esegui il servizio su una casella separata sul tuo sito web, quindi non rallenterà il sito web.

Se la capacità della CPU è esaurita nella casella di servizio, è possibile aggiungere un'altra istanza del servizio.

Se hai bisogno di più potenza di elaborazione, puoi aggiungere un'altra casella che esegue il servizio.

Questo evita di dover pensare all'elaborazione asincrona dei file nel codice poiché il numero di attività concorrenti è controllato eseguendo più istanze dell'app di servizio piuttosto che dall'interno del codice. Significa anche che un'istanza arrestata interrompe solo un singolo elemento.

È possibile aggiornare il servizio per fare più di un oggetto in modo asincrono. Ma idealmente questo non è necessario, dal momento che si desidera elaborare ogni elemento alla velocità consentita dal computer.

L'elaborazione di due elementi alla volta sullo stesso computer è utile solo se sei rallentato da qualche fattore esterno, ad esempio una chiamata API su Internet o l'elaborazione di un singolo file inst aiutato da più thread / cpus / core

    
risposta data 13.06.2017 - 13:22
fonte

Leggi altre domande sui tag