Pregunta

Estoy en el proceso de escribir una aplicación de nivel empresarial que utiliza los servicios WCF y NetTCP. Elegí NetTCP inicialmente por curiosidad, pero luego determiné que era la mejor opción para mí, ya que puedo tener servicios llamados que tardan más de 5 horas en devolver resultados debido a la cantidad de procesamiento de datos involucrado.

La forma en que actualmente genero mis servicios es un proceso de varios pasos. Tengo una pieza de configuración (usando System.Configuration) que especifica algunas de las cosas predeterminadas (número de puerto, nombre del servidor para los clientes que se conectan, ya sea para habilitar HTTP y NetTCP, etc.) y que tiene una colección de & Quot ; servicios " debajo de ello. Por ejemplo, así es como se ve uno básico:

<serverConfiguration tcpListenerPortNumber="60000" httpGetEnabled="true" httpListenerPortNumber="6000" serverName="localhost" retryEnabled="true" retryInterval="5" maxRetryAttempts="3">
    <services>
        <add virtualDirectory="Service1" applicationName="Service1" assembly="SampleService" type="SampleService.Service1" />            
    </services>
</serverConfiguration>

Básicamente, lo que está sucediendo aquí es que mi servicio de Windows se inicia y analiza todo en < services / > recopilación y genera un subproceso por servicio para acelerar el tiempo de inicio y cada subproceso contiene un AppDomain donde el servicio realmente vive, por lo que si un servicio tiene algún tipo de falla, no daña el sistema.

El " problema " Me estoy encontrando con que esta aplicación aloja aproximadamente 20 servicios y se necesitan unos 15-20 segundos para que todos los servicios estén en funcionamiento. Hice los subprocesos y las piezas de AppDomain para reducirlo a ese valor (solía tomar más de un minuto ya que cada servicio se abrió secuencialmente), pero todavía me parece que esto podría ir mucho más rápido.

¿Alguien tiene alguna sugerencia? Google Bing tiene una gran cantidad de ejemplos para alojar un servicio, pero no encuentro mucho para aplicaciones del mundo real (lamentablemente " Hello World " simplemente no atractivo para los usuarios finales). Si actualmente aloja múltiples servicios a través de un Servicio de Windows y NetTCP, ¿cómo lo está haciendo?

¿Fue útil?

Solución

Finalmente lo descubrí y, después de todo, no tenía nada que ver con WCF o mis piezas de configuración. Cuando estaba creando el AppDomain robé el código de otro proyecto que teníamos que era mucho más pequeño y descubrí que la sección que creaba AppDomains estaba usando la opción SingleDomain. Cambiarlo a MultiDomain hizo que las cosas fueran a & Gt; 4 segundos para la carga total y el uso de memoria se redujo a ~ 40MB desde ~ 150MB.

Sin embargo, gracias por la ayuda, ¡al menos me hizo revisar el código nuevamente!

Otros consejos

Tengo tres sugerencias:

En primer lugar, si una llamada puede demorar más de 5 horas, consideraría una arquitectura de estilo de espera / devolución de llamada.

Considere dividir sus servicios en 20 servicios de Windows, donde cada servicio se ejecuta en sus propios servicios de Windows. Esto agrega complejidad y aumenta el uso de memoria, pero un servicio individual puede estar disponible más rápido.

Por último, verifique el código que se encuentra en el constructor del servicio, en busca de cualquier código innecesario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top