2010-09-07 11 views
5

Ich möchte einen Windows-Dienst, der einen Remote-Encoding-Dienst (wie Encoding.com, ZENCoder, etc.) zum Hochladen von Videodateien für die Kodierung verwenden, erstellen, laden Sie sie nach dem Kodierungsprozess ist vervollständigen und verarbeiten sie.Design: Queue Management Frage (C#)

Um dies zu tun, habe ich über verschiedene Warteschlangen nachgedacht, eine für die Bearbeitung von gerade wartenden Dateien, eine für hochgeladene Dateien, eine für Dateien, die auf die Kodierung warten und eine weitere für das Herunterladen. Jede Warteschlange hat eine Beschränkung, zum Beispiel können nur 5 Dateien zum Codieren zu einer bestimmten Zeit hochgeladen werden. Die Warteschlangen müssen sichtbar sein und in der Lage sein, nach einem Absturz wieder auferstehen zu können - im Moment tun wir das, indem wir die Warteschlange in eine SQL-Tabelle schreiben und die Anzahl der Elemente in einer separaten Tabelle verwalten.

Ich möchte auch, dass die Warteschlangen unabhängig voneinander im Hintergrund ausgeführt werden, aber im Verlauf des Prozesses Dateien von einer Warteschlange in eine andere übertragen können.

Mein größtes Fragezeichen ist, wie man die Warteschlangen erstellt und verwaltet und weniger die Anzahl der Elemente in jeder Warteschlange beschränkt.

Ich bin nicht sicher, was der richtige Ansatz dafür ist und würde jede Hilfe wirklich schätzen.
Danke!

Antwort

1

Sie müssen die Arbeit wahrscheinlich nicht in separate Warteschlangen aufteilen, solange sie in irgendeiner Weise logisch getrennt sind (gekennzeichnet mit unterschiedlichen "Job-Typen" oder ähnlichem).

Wie ich es sehe, besteht die Herausforderung darin, abhängig von der Art des Jobs nicht mehr als eine begrenzte Anzahl von Jobs aus der Warteschlange abzurufen und zu verarbeiten. Ich hatte vor einiger Zeit ein ähnliches Problem, das zu einem question here on SO und einem nachfolgenden blog post with my solution führte, die beide Ihnen einige Ideen geben könnten.

Kurz gesagt war meine Lösung, dass ich eine Liste von "Tokens" behalte. Wann immer ich einen Job ausführen möchte, der eine gewisse Einschränkung hat, hole ich zuerst ein Token ab. Wenn keine Token verfügbar sind, muss ich warten, bis einer verfügbar ist. Dann können Sie einen beliebigen Warteschlangenmechanismus verwenden, der geeignet ist, die Warteschlange als solche zu handhaben.

+0

Danke, es ist hilfreich, aber meine Frage war, mehr auf die Verwaltung von separaten Warteschlangen zu zielen. Dein Blogpost war nützlich. Vielen Dank! – Nir

+0

Ich stimme Fredrik zu. Wenn Sie vier Warteschlangen erstellen und jeder (oder einer ähnlichen Anzahl von Threads) einen Thread zuweisen, ist es möglich, dass eine langsame Warteschlange (eine Warteschlange, die für einen lang andauernden Prozess verantwortlich ist) Ihren gesamten Prozess verlangsamen würde, da diese Warteschlange ausgelastet ist aber die Threads in den anderen Warteschlangen sitzen und tun nichts.In jedem Fall könnte die Feinabstimmung dieser Thread-Nummern schwierig sein. – Aliostad

+0

Wie sich herausstellte, war der Blogbeitrag sehr hilfreich. Danke vielmals! – Nir

1

Es gibt verschiedene Möglichkeiten, dies zu erreichen, und es hängt davon ab, welche für Ihren Fall in Bezug auf Zuverlässigkeit und Belastbarkeit/Entwicklungskosten/Wartungskosten geeignet ist. Sie müssen die Frage zu den Vorlieben beantworten, was ist, wenn der Server abstürzt, ist es wichtig, weiterzumachen, was Sie getan haben?

Warteschlange kann in MSMQ, SQL Server oder einfach in Code und alle Warteschlangen im Speicher implementiert werden. Für den Arbeitsablauf können Sie Windows Workflow Foundation verwenden oder selbst implementieren, was wahrscheinlich einfacher wäre, aber eine Änderung schwieriger wäre.

Also, wenn Sie ein paar mehr Hinweise geben, sollte ich Ihnen besser helfen können.

+0

Danke. Ja, es ist wichtig, von der Stelle, die ich verlassen habe, abzuholen, wenn der Server abstürzt. Ich würde gerne mehr Informationen geben, lassen Sie mich wissen, was hilfreich sein kann. – Nir

+0

Wenn Sie es ausfallsicher benötigen, würde ich es in einem SQL Server speichern, wenn ich es mir leisten kann, da es einfacher ist, mit zu arbeiten und gesichert werden kann. Wenn nicht, werde ich MSMQ verwenden, das kostenlos mit Windows geliefert wird. Für den Workflow würde ich nur einfache Zustandsmaschine im Code verwenden. – Aliostad

+0

Danke @Aliostad. – Nir