Nous traitons un problème intéressant sur StackOverflow.
Nous avons toute une série de petites tâches à accomplir rapidement. Un exemple est la mise à jour des listes "Questions connexes". Ce que nous avons fait par le passé est d’associer ces tâches au chargement de pages de certains utilisateurs.
Ce n'était jamais idéal, mais ce n'était pas vraiment perceptible. Maintenant que SO a dépassé le million de points d'interrogation, ces utilisateurs malchanceux commencent à le ressentir.
La solution naturelle est de pousser ces tâches en arrière-plan. J'envisage deux grandes façons de procéder.
1. Dans IIS en tant que pool de threads / file de travail personnalisé
Fondamentalement, nous mettons en place quelques threads (non ThreadPool , afin de ne pas interférer avec IIS) et les mettons au service de certaines collections dans lesquelles nous transférons des Funcs .
Le grand pro ici est la simplicité. Nous n'avons plus à nous soucier de rien, ni à nous assurer qu'un service externe est opérationnel et répond.
Nous avons également accès à tous nos codes communs.
Le problème est, eh bien, que nous ne devrions pas utiliser de threads d'arrière-plan. Les objections que je connais sont toutes centrées autour de l'IIS affamé (si vous utilisez ThreadPool) et des threads en train de mourir de manière aléatoire (en raison du recyclage AppPool).
Nous avons l'infrastructure existante pour que la mort aléatoire des threads ne soit plus un problème (la possibilité de détecter une tâche a été abandonnée, en gros), et il n'est pas difficile de limiter le nombre de threads (et d'utiliser des threads autres que ThreadPool).
Déplacé vers StackOverflow , car cela n'a pas vraiment été abordé ici.
2. En tant que service
Soit une solution tierce, soit une solution personnalisée.
En gros, nous regrouperions une tâche d'un service à un autre et l'oublierions. Vraisemblablement, nous lions du code dans, ou sommes limités à du SQL brut + une chaîne de connexion.
Le pro est que c'est la "bonne manière" de faire cela.
Les inconvénients sont que nous sommes soit très limités dans ce que nous pouvons faire, soit que nous allons devoir mettre au point un système pour maintenir ce service synchronisé avec notre base de code. Nous devrons également relier d’une manière ou d’une autre notre surveillance et notre enregistrement des erreurs, que nous obtenons gratuitement avec l’option "In IIS".
Y a-t-il d'autres avantages ou problèmes avec l'approche de service?
En un mot, existe-t-il des problèmes imprévus et insurmontables qui rendent l'approche n ° 1 inapplicable et, dans l'affirmative, existe-t-il de bons services tiers que nous devrions examiner pour l'approche n ° 2?