Estamos lidiando con un problema interesante en StackOverflow.
Tenemos un montón de pequeñas tareas "que hay que hacer pronto". Un ejemplo es actualizar las listas de "Preguntas relacionadas". Lo que hemos hecho en el pasado es incluir esas tareas en las cargas de página de algunos usuarios.
Esto nunca fue ideal, pero no fue realmente notable. Ahora que SO ha pasado el signo de interrogación de 1,000,000, esos usuarios desafortunados están comenzando a sentirlo.
La solución natural es llevar estas tareas a un segundo plano. Estoy considerando dos formas generales de hacerlo.
1. En IIS como Thread-Pool / Work-Queue personalizado
Básicamente, hacemos girar algunos subprocesos (que no son ThreadPool , para no interferir con IIS) y hacer que brinden servicios a algunas colecciones en las que estamos insertando Funcs .
El gran profesional aquí es la simplicidad. No tenemos que preocuparnos por ordenar nada, ni debemos asegurarnos de que algún servicio externo esté funcionando y responda.
También tenemos acceso a todo nuestro código común.
La desventaja es, bueno, que no debemos usar hilos de fondo. Las objeciones que conozco se centran en IIS muerto de hambre (si usa ThreadPool) y los hilos que mueren al azar (debido al reciclaje de AppPool).
Tenemos la infraestructura existente para hacer que la muerte aleatoria de subprocesos no sea un problema (es posible detectar que una tarea ha sido abandonada, básicamente), y limitar el número de subprocesos (y usar subprocesos que no sean ThreadPool) tampoco es difícil.
Movido a StackOverflow , ya que no se abordó realmente aquí.
2. Como un servicio
Ya sea alguna solución de terceros o personalizada.
Básicamente, ordenaríamos una tarea a través del límite del proceso para algún servicio y simplemente nos olvidaríamos de ella. Presumiblemente, estamos vinculando algún código o restringido a SQL sin formato + una cadena de conexión.
La ventaja es que es la "forma correcta" de hacer esto.
Las desventajas son que estamos muy restringidos en lo que podemos hacer, o tendremos que resolver algún sistema para mantener este servicio sincronizado con nuestra base de código. También tendremos que conectar todo nuestro monitoreo y registro de errores de alguna manera, que obtenemos de forma gratuita con la opción "En IIS".
¿Hay otros beneficios o problemas con el enfoque de servicio?
En pocas palabras, ¿hay problemas imprevistos e insuperables que hacen que el enfoque n. ° 1 sea inviable y, de ser así, hay algún buen servicio de terceros que deberíamos considerar para el enfoque n. ° 2?