2011-01-15 15 views
5

Ciao sto cercando di creare un servizio soddisfacente con WCF, è probabile che il servizio venga consumato da almeno 500 persone in un dato momento. Quali impostazioni avrei bisogno di impostare per affrontare questo. Per favore datemi punti e suggerimenti, grazie.Creazione di un servizio WCF Restful, problemi di concorrenza

Ecco un esempio di ciò che ho finora;

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

E questo è un esempio di un metodo chiamato;

public UsersAPI getUserInfo(string UserID) 
    { 
     UsersAPI users = new UsersAPI(int.Parse(UserID)); 

     return users; 
    } 



    [OperationContract] 
    [WebGet(BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, UriTemplate = "User/{UserID}")] 
    [WebHelp(Comment = "This returns a users info.")] 
    UsersAPI getUserInfo(string UserID); 

risposta

7

L'approccio migliore sarebbe quella di utilizzare:

  • InstanceContextMode.PerCall
  • ConcurrencyMode.Single

questo creerà una nuova istanza della classe di servizio per ogni chiamante e si evita di dover preoccuparsi dell'accesso concorrente multi-threaded al codice, poiché ogni richiesta ottiene la propria istanza della classe di servizio (che di per sé è a thread singolo - serve solo un singolo chiamante alla volta).

Inoltre, con questo approccio, è possibile "scalare" facilmente, ad es. basta semplicemente aggiungere più server per gestire un carico più elevato (server presso le sedi o "nel cloud", ad esempio i lavoratori di Windows Azure).

Utilizzando il comportamento del servizio ServiceThrottling, è possibile controllare molto facilmente quanti chiamanti concorrenti sono consentiti, a seconda del tipo e della dimensione della macchina.

<serviceBehaviors> 
    <behavior name="Throttling"> 
    <serviceThrottling 
      maxConcurrentCalls="16" 
      maxConcurrentInstances="16" 
      maxConcurrentSessions="10" /> 
    </behavior> 
</serviceBehaviors> 

Questi sono i valori predefiniti per WCF 3.5 - le impostazioni maxConcurrentCalls definisce il numero di chiamanti possono essere gestite contemporaneamente.

Per ulteriori dettagli, consultare lo MSDN docs on Service throttling.

+0

Ciao, grazie per la risposta, le stesse impostazioni saranno ancora valide se siamo cresciuti e avessimo qualcosa come 30000 utenti? – pmillio

+0

+1, buona risposta. Con le impostazioni di cui sopra devi ancora preoccuparti della sicurezza dei thread se accedi allo stato condiviso al di fuori dell'istanza del servizio. Inoltre, se non si memorizza lo stato mutabile nell'istanza del servizio, è possibile utilizzare 'InstanceContextMode.Single' e' ConcurrencyMode.Multiple' per prestazioni ottimali. –

+1

@ pmillio: potrebbe essere necessario aumentare il numero di maxConcurrentCalls (che è solo l'impostazione predefinita), o potrebbe essere necessario acquistare server aggiuntivi, ma l'architettura si adatta molto bene –

Problemi correlati