2010-05-23 19 views
6

Tengo mucha implementación Singleton en la aplicación asp.net y quiero mover mi aplicación al entorno IIS Web Garden por algunos motivos de rendimiento.Objeto singleton en IIS Web Garden

CMIIW, moviéndose a IIS Web jardín de un proceso n trabajador, habrá un objeto único creado en cada proceso de trabajo, que lo convierten en un solo objeto, no más porque n> 1.

puede Hago todos esos objetos singleton, singleton nuevamente en IIS Web Garden?

Respuesta

10

No creo que pueda (a menos que pueda hacer que esos trabajadores de IIS utilicen objetos en la memoria compartida de alguna manera).

Esto es un problema de alcance. Su instancia singleton usa espacio de proceso como su alcance. Y como ha dicho, su implementación ahora abarca múltiples procesos. By definition, en la mayoría de los sistemas operativos, los singleton se vincularán a un cierto espacio de proceso, ya que está vinculado a una sola instancia de clase o objeto.

¿Usted realmente necesita un singleton? Esa es una pregunta muy importante que debe hacerse antes de usar ese patrón. Como dice Wikipedia, algunos lo consideran un anti-patrón (o código de olor, etc.).

ejemplos de diseños alternativos que pueden funcionar como ...

  1. Se pueden tener varios objetos sincronizan contra un almacén central o entre sí.
  2. Use la serialización de objetos si corresponde.
  3. Use un servicio de Windows y alguna forma de IPC, ej. System.Runtime.Remoting.Channels.Ipc

Me gusta la opción 3 para sitios web grandes. Un servicio complementario de Windows es muy útil en general para sitios web grandes. Muchas cosas, como enviar correos, trabajos por lotes, etc., ya deberían estar desacopladas del proceso del proceso de procesamiento frontend. Puede insertar el objeto de servidor singleton en ese proceso y usar objetos de cliente en sus procesos de trabajo de IIS.

Si su clase singleton funciona con múltiples objetos que comparten estado o simplemente comparten estado inicial, entonces las opciones 1 y 2 deberían funcionar respectivamente.

Editar

Desde sus comentarios que suena como la primera opción en la forma de un caché distribuida debería funcionar para usted.

Existen muchas implementaciones de caché distribuida.

  1. Microsoft AppFabric (anteriormente llamado Velocity) es su movimiento más reciente en este espacio.
  2. Memcached ASP.Net Provider
  3. NCache (MSDN Article) - proveedor de caché ASP.Net encargo de OutProc apoyo.Debería haber otros proveedores de caché personalizados por ahí.
  4. rollo a cabo su propia caché distribuida utilizando los servicios de Windows y CIP (opción 3)

PS. Ya que estás buscando específicamente en el chat. Definitivamente recomendaría investigar Comet (Comet implementation for ASP.NET?, y WebSync, etc.)

+0

es una sala de chat muy complicada, el tráfico es pesado pero queremos que sea lo más receptivo posible. no registramos mensajes en la base de datos, entonces necesito un objeto singleton para mantener los mensajes en la memoria. –

+0

pregunta a la opción 1: ¿cómo se sincronizan los objetos uno contra el otro mientras están en procesos separados? –

+0

opción 3 parece una solución bastante prometedora. mueva los objetos singleton a IpcServerChannel (probablemente una aplicación de consola) e IpcClientChannel hará proxy de ese objeto. es así como te refieres? –

Cuestiones relacionadas