2011-01-15 12 views
5

Hola estoy en el proceso de crear un servicio tranquilo con WCF, es probable que el servicio sea consumido por al menos 500 personas en un momento dado. ¿Qué ajustes necesitaría establecer para lidiar con esto? Por favor, dame algunos puntos y consejos, gracias.Creando un servicio tranquilo WCF, problemas de simultaneidad

Aquí hay una muestra de lo que tengo hasta ahora;

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

Y este es un ejemplo de un método que se llama;

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); 

Respuesta

7

El mejor enfoque sería utilizar:

  • InstanceContextMode.PerCall
  • ConcurrencyMode.Single

Esto creará una nueva instancia de la clase de servicio para cada persona que llama y le ahorra tener preocuparse por el acceso simultáneo de múltiples subprocesos a su código, ya que cada solicitud obtiene su propia instancia de clase de servicio (que en sí misma es de subproceso único) - sirve solo a una persona que llama por vez).

Además, con este enfoque, puede "escalar" fácilmente, p. Ej. simplemente agregue más servidores para manejar una mayor carga (servidores en sus ubicaciones, o "en la nube", por ejemplo, trabajadores de Windows Azure).

Usando el comportamiento del servicio ServiceThrottling, puede controlar muy fácilmente cuántas llamadas concurrentes están permitidas, esto depende del tipo y tamaño de su máquina.

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

Esos son los valores predeterminados para WCF 3.5 - la configuración maxConcurrentCalls define cómo muchas personas que llaman pueden ser manejados de forma simultánea.

Eche un vistazo a MSDN docs on Service throttling para más detalles.

+0

Hola, gracias por responder, ¿se aplicará la misma configuración si creciéramos y tuviéramos algo así como 30000 usuarios? – pmillio

+0

+1, buena respuesta. Con las configuraciones anteriores, usted todavía tiene que preocuparse por la seguridad del hilo si accede al estado compartido fuera de la instancia del servicio. Además, si no almacena el estado mutable en su instancia de servicio, puede usar 'InstanceContextMode.Single' y' ConcurrencyMode.Multiple' para obtener el mejor rendimiento. –

+1

@pmillio: es posible que necesite aumentar el número de maxConcurrentCalls (eso es lo predeterminado), o puede que necesite comprar servidores adicionales, pero la arquitectura se escala muy bien –

Cuestiones relacionadas