domenica 28 febbraio 2010

Behaviors e prestazioni in WCF

Quando si progetta un sistema, qualunque sia la sua natura, le prestazioni rientrano quasi sempre tra i vincoli progettuali che devono essere rispettati.
Qualsiasi applicazione software è un sistema, e quindi anche per essa esistono dei parametri per valutarne la bontà. Se poi questa applicazione è un applicazione distribuita, le performance, insieme alla sua scalabilità, diventano delle caratteristiche fondamentali, che possono decretarne il successo o il fallimento.

Per non creare ambiguità, e sebbene il loro significato sia noto, iniziamo dando la definizione di

  • Concorrenza: misura quanti tasks (richieste, jobs, transazioni) possono essere eseguiti contemporaneamente;
  • Tempo di esecuzione: misura quanto tempo occorre per completare un task;

Per una applicazione WCF, uno dei parametri che può essere usato per stabilirne le prestazioni è il throughput, ovvero al quantità di task che vengono eseguiti in uno specifico intervallo di tempo.

N.Task/tempo di esecuzione


Da questa definizione si capisce come per aumentare il throughput si può intervenire o sulla velocità di esecuzione dei task, o sul numero di task che possono essere eseguiti parallelamente.
La velocità di esecuzione dipende dall'algortimo con il quale il task è implementato o dall'hardware su cui esso è eseguito, pertanto WCF non può migliorarlo.

Quello su cui invece può agire WCF è il numero di task eseguiti nell'unità di tempo, ovvero la concorrenza, che è controllabile attraverso i behaviors IstanceContextMode e ConcurrencyMode.


Il primo è usato per controllare le istanze del servizio e può assumere tre valori:

  • Single: tutte le richieste vengono gestite da un'unica istanza del servizio, che implementa un singleton;
  • PerCall: per ogni richiesta viene creata un istanza del servizio;
  • PerSession:viene creata un istanza del servizio per ogni sessione del client.

Il ConcurrencyMode è un behaviors utilizzato per controllare la concorrenza di un thread all'interno dell'istanza di un servizio e può assumere i valori:

  • Single: un solo thread alla volta può accedere al servizio;
  • Reentrant: solo un thread alla volta può accedere al servizio, ma può lasciarlo e ritornare dopo;
  • Multiple: thread multipli possono accedere al servzio simultaneamente.

Per default un servizio wcf ha uno stato che gestisce un solo thread sul servizio (ConcurrencyMode.Single), ed il servizio viene istanziato per ogni nuova sessione (InstanceContextMode.PerSession)

Per creare invece un servizio che possa migliorare le sue performance, si può settare il suo behaviors in modo che su una singola sua istanza possano accere più thread:

[ServiceBehavior (InstanceContextMode= InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]

Nessun commento: