Creo que Jimmy Nillson dijo que generalmente creaba sus servicios web singletons. ¿Es este el método preferido, y con WCF? Además de hacer que los métodos de servicio sean estáticos, ¿hay algo más que hacer?¿Debería el servicio WCF ser típicamente singleton o no?
Respuesta
buenas respuestas, pero creo que hay un problema en la pregunta original. El "uso típico" de una tecnología es una pregunta mal formada. Nadie tiene un escenario "típico", y debe revisar los requisitos de su problema particular antes de decidir una implementación o enfoque. Sus requisitos deben informar su solución.
Por ejemplo, Singletons [es decir, el patrón Singleton] es simplemente otra herramienta más en nuestra caja, y como cualquier herramienta, hay casos en los que funciona, y otros no. Específicamente, si necesita centralizar la lógica de negocios [más aplicable en una aplicación independiente que un servicio WCF remoto], o compartir memoria o un recurso, un Singleton funciona bien. Por supuesto, si está compartiendo la lógica de negocios, el estado se mantiene en la pila de llamadas, y el multithreading es irrelevante. Si comparte la memoria entre las llamadas de los consumidores, entonces el multi-threading es un problema. En cuanto a WCF, hay dos modos [en realidad tres, pero el tercero es un caso especial de la primera] del comportamiento multi-threading puede especificar,
// we are specifying that this service implementation is single-threaded
// and WCF should permit *at most* one call at a time. Any requests made
// simultaneously/concurrently are queued.
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single)]
public class SingleThreadedNonThreadSafeService : IService { ... }
y
// we are specifying that this service implementation is multi-threaded
// and [hopefully!] thread-safe. WCF should permit any number of threads,
// or any number of simultaneous concurrent calls.
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
public class MultiThreadedThreadSafeService : IService { ... }
Los comentarios XML para ConcurrencyMode
básicamente dicen lo mismo que arriba.
Si NO necesita compartir la lógica de negocio o de la memoria entre los consumidores, a continuación, NO utilizar un Singleton, el "modelo" no encajan el problema. ¡Es como forzar una zapatilla de cristal en el pie de una madrastra! Y nadie debería tener que ver eso.
Por el contrario, si no se comparte un estado entre llamadas, aloje una instancia por llamada \ sesión.
Creo que se perdió la interpretación del propietario de la pregunta. Pensé que estaba hablando de la instancia del cliente cliente proxy y no del servicio en sí. En ningún escenario, tendría sentido hacer que el wcf aloje un singleton, es sin estado por diseño. Creo que la pregunta real que intentaba hacer era: ¿Debería la instancia de cliente de servicio WCF utilizada por el consumidor del servicio ser un singleton o no? @suedeuno ??? – Seabizkit
Normalmente NO. Los singletons son un desastre, ya que para que funcionen bien, tendrás que hacerlos de múltiples subprocesos, y eso es solo pedir problemas a menos que realmente realmente sepas lo que estás haciendo.
La mejor práctica para WCF es usar instanciación por llamada: cada solicitud obtiene su propia copia de la clase de servicio, sin problemas de subprocesamiento múltiple, buen rendimiento, almacena todo lo que necesita persistir en una base de datos, funciona como un encanto.
El único escenario real donde singleton podría tener sentido es si tiene que hacer que todas las solicitudes de servicio sean manejadas por un recurso físico que esté disponible solo en una instancia individual; si su servicio singleton serializa y protege un único recurso, entonces tiene sentido usarlo.
De lo contrario, ¡ahórrese el problema! :-)
+1 algunos de mis compañeros de trabajo lo descubrieron de la manera difícil ... en producción. – kemiller2002
si está accediendo a la instancia de Hostservice desde dentro del entorno de alojamiento (servicio de Windows, aplicación de consola) para enviar a los clientes, podría ser más fácil implementar el patrón de Singleton; de lo contrario, para enviarlo necesita crear un cliente u obtener una instancia a través de un proveedor de instancias. - la ruta del cliente puede ser útil pero encontré que el uso de lo que ya se creó funcionaba bien. Hasta el momento no estoy experimentando los problemas de subprocesamiento ... y el servicio tiene el rendimiento que necesito y parece estable. – Stix
Los servicios WCF de Singleton casi nunca deberían usarse: ¡los Singleton son el enemigo de la escalabilidad! Solo tienen sentido en escenarios extraños: iniciar sesión en un único archivo, un solo puerto de comunicaciones o dispositivo de hardware.
Como Marc dice que la mejor opción para la escalabilidad con WCF es por servicios de llamada (ofrecen la mejor compensación entre rendimiento y escalabilidad). Los servicios por llamada también funcionan muy bien con el equilibrio de carga.
Sí, esto fue respondido hace bastante tiempo, pero ¿podría ampliar el comentario de que "los servicios por llamada también funcionan muy bien con el equilibrio de carga"? – McArthey
Creo que lo que señaló @McArthey es que si usa los servicios 'Por llamada', le da la oportunidad de distribuir sus 'llamadas' entre varios servidores sin preocuparse por 'estado'. –
- 1. ¿Debería una clase de servicio ser singleton en java?
- 2. WCF ¿cuál debería ser el EndpointConfigurationName?
- 3. Singleton o no
- 4. ¿Debería ser ambiguo o no? (modelos implícitos)
- 5. Especifique un servicio Singleton en un servicio alojado de WCF
- 6. ¿Debería ser un WebAPI o asmx
- 7. WCF Servicio Web o API
- 8. Rspec: Debería ser (esto o lo otro)
- 9. DAO de JavaEE6: ¿Debería ser @Stateless o @ApplicationScoped?
- 10. wcf El servicio no se pudo activar
- 11. No se puede activar el servicio WCF
- 12. WebLogic clúster servicio singleton
- 13. ¿Debería el HTML meta charset ser minúscula o mayúscula?
- 14. ¿Cuándo debería usar OperationContextScope dentro de un servicio WCF?
- 15. El ciclo de vida del servicio WCF alojado en IIS
- 16. WCF un servicio o servicios múltiples
- 17. Cómo depurar el servicio WCF?
- 18. ¿Debería un servicio WCF devolver un objeto EntityObject o una clase POCO/DTO?
- 19. ¿Debería el mailto ser utilizado en HTML5?
- 20. WCF - MessageBodyMember - Stream - "El valor no puede ser nulo"
- 21. hibernate, ser perezoso o no ser perezoso?
- 22. de anulación en el servicio WCF
- 23. .NET base type no puede ser serializado por WCF
- 24. ¿Cómo debería ser el cuerpo de la solicitud?
- 25. ¿Debería el patrón de estrategia ser apátrida?
- 26. ¿Qué debería ser hadoop.tmp.dir?
- 27. Monotouch/WCF: cómo consumir el servicio wcf sin svcutil
- 28. JQuery - object.id no está definido cuando no debería ser
- 29. WCF REST Servicio: InstanceContextMode.PerCall no funciona
- 30. ¿Cuán extensible debería ser realmente el código?
¿Tiene un enlace a donde alguien dijo que usara singletons? Tal vez hay una razón más convincente de lo que cualquiera de nosotros puede pensar ... –
Estaba en su libro, "Aplicación de patrones y diseño impulsado por el dominio: con ejemplos en C#". – suedeuno