2010-09-07 10 views
5

Je veux construire un service Windows qui utilisera un service d'encodage distant (comme encoding.com, zencoder, etc.) pour télécharger des fichiers vidéo pour l'encodage, les télécharger après le processus d'encodage compléter, et les traiter. Pour ce faire, je pensais à avoir différentes files d'attente, une pour gérer les fichiers en attente, une pour les fichiers en cours de chargement, une pour les fichiers en attente d'encodage et une autre pour les télécharger. Chaque file d'attente a une limitation, par exemple seulement 5 fichiers peuvent être téléchargés pour l'encodage à un certain moment. Les files d'attente doivent être visibles et capables de ressusciter suite à un plantage. Actuellement, nous le faisons en écrivant la file d'attente dans une table SQL et en gérant le nombre d'éléments dans une table séparée.Conception: Question de gestion de file d'attente (C#)

Je souhaite également que les files d'attente s'exécutent en arrière-plan, indépendamment les unes des autres, mais en mesure de transférer des fichiers d'une file d'attente à une autre pendant que le processus se poursuit. Mon plus grand point d'interrogation est sur la façon de construire les files d'attente et de les gérer, et moins sur la limitation du nombre d'éléments dans chaque file d'attente.

Je ne sais pas quelle est la bonne approche pour cela et j'apprécierais vraiment toute aide.
Merci!

Répondre

1

Vous n'avez probablement pas besoin de séparer le travail en files d'attente séparées, tant qu'elles sont logiquement séparées d'une manière ou d'une autre (étiquetées avec différents "types de travaux" ou autres). Comme je le vois, le défi consiste à ne pas sélectionner et traiter plus d'un nombre limité de tâches de la file d'attente, en fonction du type de travail. J'ai eu un problème quelque peu similaire il y a un certain temps qui a conduit à un question here on SO, et un blog post with my solution qui pourraient vous donner quelques idées.

En bref ma solution était que je garde une liste de "jetons". Chaque fois que je veux effectuer un travail qui a une sorte de limitation, je prends d'abord un jeton. Si aucun jeton n'est disponible, je devrai attendre que l'un devienne disponible. Ensuite, vous pouvez utiliser n'importe quel mécanisme de file d'attente approprié pour gérer la file d'attente en tant que telle.

+0

Merci, c'est utile mais ma question essayait de viser plus à la gestion des files d'attente séparées. Votre article de blog a été utile. Merci! – Nir

+0

Je suis d'accord avec Fredrik. Si vous créez 4 files d'attente et assignez un thread à chaque (ou un nombre similaire de threads), il est possible qu'une file d'attente lente (une file d'attente responsable d'un processus de longue durée) ralentisse l'ensemble du processus puisque cette file est occupée mais les fils dans les autres files d'attente sont assis et ne font rien.Dans tous les cas, affiner ces numéros de fil pourrait être difficile. – Aliostad

+0

En fin de compte, le blog a été extrêmement utile. Merci beaucoup! – Nir

1

Il y a plusieurs façons d'aborder cela et cela dépend de ce qui convient à votre cas en termes de fiabilité et de résilience/coût de développement/coût de maintenance. Vous devez répondre à la question sur les goûts que si le serveur se bloque, est-il important de poursuivre ce que vous faisiez?

La file d'attente peut être implémentée dans MSMQ, SQL Server ou simplement dans du code et dans toutes les files d'attente en mémoire. Pour le workflow, vous pouvez utiliser Windows Workflow Foundation, ou l'implémenter vous-même, ce qui serait probablement plus facile mais le changement serait plus difficile. Donc, si vous donnez un peu plus de conseils, je devrais être en mesure de vous aider à mieux.

+0

Merci. Oui, il est crucial de reprendre au même endroit où je suis parti si le serveur tombe en panne. Je serais heureux de donner plus d'informations, laissez-moi savoir ce qui peut être utile. – Nir

+0

Si vous avez besoin d'un système de sécurité, je le stocke dans un serveur SQL si je peux me permettre de le faire car il est plus facile de travailler avec et peut être sauvegardé. Sinon, je vais utiliser MSMQ qui vient gratuitement avec Windows. Pour le workflow, j'utiliserais simplement une machine d'état simple dans le code. – Aliostad

+0

Merci @Aliostad. – Nir