12 messaggi dal 04 febbraio 2011
Ciao a tutti,

ho una domanda da porvi, sulla quale mi sono documentato, ma vorrei dei consigli, magari da chi ha già realizzato e testato una soluzione dello stesso tipo che vi elenco ora.

Ho creato un servizio WCF che attualmente espone due metodi, il primo metodo (Validazione) è abbastanza banale, si occupa di ricevere una stringa in input la quale viene acqusita e tramite l'ausilio di SQL Server viene cercata su Database e al client viene restitutito un dettaglio delle informazioni recuperate. Il secondo metodo (Acquisizione) invece riceve un dettaglio di informazioni che nel tempo potrebbe anche crescere, anzi di sicuro, il server web acquisisce questi dati ed esegue una serie di operazioni su database, ho delegato tutte queste operazioni di inserimento/aggiornamento a delle stored procedure e se tutto va a buon fine il metodo restituisce una conferma al client che il dato è stato acquisito correttamente.

Ora il mio problema è il seguente, potenzialmente potrei ricevere molteplici richieste al mio servizio nell'ordine delle 1000 richieste e sicuramente molte di queste avverranno simultaneamente, questo porterà il server web a dover gestire le chiamate di entrambe i metodi facendo così salire il numero di contatti ad un ipotetico 2000.
Dando per scontato che il server su cui sarà presente IIS 7 sarà un server molto prestante, come posso strutturare la soluzione in modo che le risposte alle chiamate dai client non vadano in timeout.
Inizialmente ho pensato di scindere i 2 metodi in 2 servizi separati in quanto in realtà il servizio di Acquisizione sarà chiamato da un numero limitato di client (server remoti) ai quali arriveranno tutti i dati da "spedire" verso il mio server web, quindi in tal caso il numero di richieste si ridurrebbe inevitabilmente e questi server remoti eseguirebbero l'invio dei dati al server web chiamandolo in maniera sequenziale (il che non escluderebbe comunque la contemporaneità) essendo l'acquisizione un processo che per il servizio web comporta diverse operazioni di aggiornamento su Database.
La richiesta di validazione invece proverrà come detto prima sempra da tutti i client, ed eseguirà solamente poche query.

Domande:

- Separando i 2 metodi in 2 servizi distinti ottimizzo la soluzione oppure no?
- Per il metodo di acqusizione ho pensato di delegare al servizio WEB la sola ricezione dei dati e di far eseguire l'acquisizione su database dei dati ad un processo locale su SERVER centrale. Può essere una soluzione intelligente?
- Come posso agire sui parametri ConcurrencyMode e InstanceContextMode che di default per WCF sono "Single" e "PerSession" in modo da servire tutte le richieste anche in caso di contemporaneità senza ottenere timeout, considerando l'accesso al Database SQL?

Al momento mi sono documentato su CodeProject per agire su questi parametri, ma vorrei dei consigli su come impostarli per la mia soluzione.

http://www.codeproject.com/Articles/86007/3-ways-to-do-WCF-instance-management-Per-call-Per

http://www.codeproject.com/Articles/89858/WCF-Concurrency-Single-Multiple-and-Reentrant-and

http://www.codeproject.com/Articles/33362/WCF-Throttling


Grazie a tutti. ;)
saturnluke ha scritto:
- Separando i 2 metodi in 2 servizi distinti ottimizzo la soluzione oppure no?

Qualcosa, ma il collo di bottiglia è sempre il database

- Per il metodo di acqusizione ho pensato di delegare al servizio WEB la sola ricezione dei dati e di far eseguire l'acquisizione su database dei dati ad un processo locale su SERVER centrale. Può essere una soluzione intelligente?

Decisamente, se separi la richiesta dall'effettiva esecuzione, puoi smaltire le richieste pian piano, riuscendo a far fronte a momenti di molteplici chiamate, rispetto a quando non ce ne sono, per esempio di notte. Usando una coda (MSMQ o simili) puoi eventualmente scalare su più server che eseguono questa attività
- Come posso agire sui parametri ConcurrencyMode e InstanceContextMode che di default per WCF sono "Single" e "PerSession" in modo da servire tutte le richieste anche in caso di contemporaneità senza ottenere timeout, considerando l'accesso al Database SQL?

Non serve. Avendo "PerSession" se non usi la sessione in pratica ottieni un'istanza del servizio per ogni richiesta, ognuna delle quali viene eseguita da un solo thread (per via del single). Più di così non puoi fare, perché da quello che dici il collo di bottiglia è sempre il db

Ciao

Il mio blog
Homepage

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.