Tengo una función .NET que realiza algunos cálculos complejos. En función de los parámetros que se pasan en la función:Recomendaciones para diseñar un servicio web de larga duración y uso intensivo de recursos
- lleva a cualquier lugar desde varios minutos a varias horas para ejecutar
- utiliza el 100% de un solo núcleo durante el cálculo
- requiere en cualquier lugar de 100s de MB a varios GB de memoria
- Escribe desde varios MB a varios GB de datos en el disco
- puede producir una excepción, incluyendo un OutOfMemoryException
La cantidad de datos que se escribirán en el disco se puede predecir con precisión a partir de la parametrización de la función. No hay una manera fácil de predecir los otros requisitos de recursos a partir de la parametrización de funciones.
Necesito exponer esta función a través de un servicio web. Este servicio tiene que ser:
- resiliant y con gracia reportar cualquier problema durante el cálculo
- Capaz de manejar peticiones concurrentes, siempre y cuando hay recursos suficientes para atender la solicitud sin degradación significativa del rendimiento, y negar con gracia la solicitud de lo contrario.
Tengo la intención de manejar la naturaleza de larga ejecución haciendo que la solicitud inicial devuelva un recurso de estado que se pueda sondear para el progreso. Una vez que se complete el cálculo, este recurso proporcionará la ubicación de los datos de salida, que el cliente puede descargar (probablemente a través de FTP).
No estoy tan seguro de cuál es la mejor manera de manejar los demás requisitos. Estoy considerando una especie de "grupo de cálculo" que mantiene las instancias de la calculadora y realiza un seguimiento de las que se están utilizando actualmente, pero no he descubierto los detalles.
¿Alguien con experiencia en situaciones similares tiene alguna sugerencia? Siempre que la solución se pueda ejecutar en una caja de Windows, se pueden considerar todas las opciones de tecnología.
Tanto VladV como Steven han brindado respuestas muy útiles. Solo puedo marcar una respuesta como aceptada, así que elegí la de VladV según el número de votos al momento de escribir este comentario. – Akash