Frage

Wir verwenden SharpZipLib . Wir müssen in der Lage, Dateien auf dem Server zu entpacken und sie in separaten Ordner. Die Anforderung, eine Datei entpacken wird von dem Benutzer auf einer Webseite sein. Ich stelle mir vor, wenn die Dateien groß genug sind, wird es eine lange Zeit in Anspruch nehmen zu entpacken. Wir wollen nicht, Benutzer auf der Seite geklebt werden, während für unzip warten, um zu vervollständigen die Website surft.

Was ist ein guter Weg, um dieses Szenario zu behandeln: spinnt einen anderen Thread zu kümmern Datei entpacken, erstellen Sie einen separaten Windows-Dienst aus, die Dateien entpacken wird, oder .... was?

Was sind Vor- und Nachteile der es über separaten Thread oder Fenster Dienst tun?

War es hilfreich?

Lösung

Die Vorteile eines separaten Prozess
Die Arbeit in einem separaten Prozess erfolgen kann als physisch in der Zeit, als auch entkoppelt werden, und von einem Standpunkt der Sicherheit aus, von der Seite fließen. Entkoppelte in der Zeit: Wenn Sie sich entscheiden, können Sie die Anfragen Puffer, um die Dinge zu entpacken, bis „später“, wenn die Last niedriger ist und wenn Sie freie CPU-Zyklen, es zu tun.

entkoppelt auch körperlich; für ein großes System, können Sie mehrere Arbeitsprozesse haben, auch auf mehreren unabhängigen Maschinen eingesetzt, diese Arbeit asynchron zu tun, und dass die Schicht der Verarbeitung unabhängig von der Web-Seite Verarbeitung skalieren. In jedem System gibt es Engpässe, und der Vorteil des verteilten Implementierungen ist, dass Sie die einzelnen Workloads unabhängig skalieren können, um effizienten Engpässe zu beseitigen.

Ich würde allerdings sagen, dass dieser letztere Vorteil in sehr großem Maßstab Systeme nur nützlich ist. In den meisten Fällen werden Sie nicht die Art von Transaktionsvolumen haben, die von einer unabhängigen physikalischen Skalierungsschicht profitieren würde. Das gilt nicht nur von Ihre Arbeitsbelastung, aber 98% aller Workloads. Das YAGNI Prinzip gilt für Skalierbarkeit, auch.

Physikalische Entkopplung ermöglicht auch die unterschiedlichen Workloads (Seitenfluss und zip auspacken) unabhängig entwickelt werden. Mit anderen Worten, war die workitem angenommen „Entpacken eine Datei“ nicht ein einfaches, aber war etwas komplexer, mit mehreren Schritten und Entscheidungspunkte auf dem Weg. die Arbeit Prozessor in einem separaten Prozess der Gestaltung ermöglicht es der Seitenfluss von der workitem Verarbeitung unabhängig gebaut und getestet werden. Dies kann ein schöner Vorteil sein, wenn sie unabhängig zu entwickeln hat.

Diese physikalische Entkopplung ist auch schön, wenn Workitems über verschiedene Kanäle ankommen. Angenommen, die Web-Seite nicht die einzige Möglichkeit für eine workitem zu kommen ist. Angenommen, Sie haben eine FTP-Drop, einen Web-Service oder eine maschinenüberwachte E-Mail-Box, die auch Workitem empfangen kann. Daß Fälle wäre es sinnvoll, die workitem Verarbeitung physicall von der Webseite Verarbeitung entkoppelt zu haben.

Schließlich werden diese Dinge in Sicherheit zur Laufzeit entkoppelt. In einigen Web-App-Server-Implementierungen, verbieten Sicherheitsregeln auf den Webserver auf die Festplatte zu schreiben - Web-Server keine beschreibbaren Plattenspeicher haben. Ein separater asynch Arbeitsprozess kann in einem separaten Teil des Netzwerks bereitgestellt werden, mit viel Stauraum, und es vielleicht durch einen separaten Satz von Sicherheitsanforderungen eingeschränkt ist. Dies kann, auf Sie nicht anwendbar sein.

Die Vorteile der Gewindebearbeitung
Der Vorteil der Arbeit in einem separaten Thread zu tun ist, dass es viel einfacher ist. Die Entkoppelung führt die Komplexität und Kosten. Verwalten der Arbeit in einem separaten Thread, Sie müssen keine des Betriebsaufwand von einem separaten Prozess der Verwaltung, die möglicherweise eine separate Maschine. Es gibt keine zusätzliche Konfiguration, kein Neubau / deployment Schritt. Keine zusätzliche Sicherung. Keine zusätzliche Sicherheitsidentität zu erhalten. Kein Kommunikationsaustausch über (jenseits des Gewindes Dispatch) zu sorgen.

Sie könnten wählen, etwas anspruchsvollere über workitem Verarbeitung zu bekommen, und die Arbeit synchron optional tun, wenn die ZIP-Datei klein genug aussieht. Angenommen, Sie eine Schwelle von 4 Sekunden Reaktionszeit zu etablieren - vor, dass Sie die asynchrone Workload benötigen, unter 4 Sekunden, Sie tun es „inline“. Natürlich weiß man nie sicher, wie lange eine Zip-Datei wird, aber Sie couldd eine gute Heuristik auf der Basis der Größe der Datei einzurichten. Diese Optimierung steht Ihnen zur Verfügung, ob Sie einen externen Prozess für Asynchron-Arbeit oder einem separaten Thread verwenden, aber um ehrlich zu sein, ist es einfacher, die Vorteile der Optimierung zu nehmen, wenn einen separaten Thread verwenden. Weniger zusätzliche Arbeit zu tun. Das ist also ein Vorteil für den Gewindeansatz.

Nicht Differenzier
Wenn Sie sich für die Meldung von workitem Status einen AJAX-Polling-Mechanismus haben, tHut würde arbeiten entweder im separaten Prozess oder der separaten Thread. Ich weiß nicht, wie Sie Arbeitsaufgabenverfolgung tun würden, aber ich würde annehmen, dass, wenn eine bestimmte Arbeitseinheit (zip-Datei?) Abgeschlossen ist, dann werden Sie eine Aufzeichnung irgendwo aktualisieren - eine Datei in einem Dateisystem, eine Tabelle in einer Datenbank . Das Update geschieht, ob es von einem Thread im selben Prozess oder durch einen separaten Prozess (Windows Service) durchgeführt wird. So ist die AJAX-Client, der Umfragen werden nur die db-Tabelle oder Dateisystem in jedem Fall überprüfen, und die Benachrichtigung von workitem Status in der gleichen Weise, unabhängig von Ihrer Architektur Entscheidung erhalten.

Wie entscheiden,
Die Theorie ist interessant, aber letztlich nutzlos, ohne tatsächliche Betriebsbeschränkungen.

Workload ist eines der wichtigsten Elemente der realen Welt. Sie hat nicht gesagt, wie groß diese Zip-Dateien sind, aber ich bin zu raten, sie „normaler Größe“ sind. Etwas über 4 GB oder weniger. Normalerweise ist eine ZIP-Datei wie das dauert 20-60 Sekunden auf meinem Laptop auspacken, aber natürlich auf einem Server mit einem realen Speichersystem und einem schnelleren CPU, wird es weniger sein. Sie haben auch nicht die Gleichzeitigkeit von Transaktionen charakterisieren - wie viele dieser Dinge wird zu jeder Zeit passieren. Ich gehe davon aus Gleichzeitigkeit nicht besonders hoch ist.

Wenn das der Fall ist, würde ich auf den einfacheren async Thread Ansatz bleiben. Sie tun dies in ASP.NET, nehme ich an auf einem Server-Betriebssystem. Die CLR hat eine gute Thread-Management und ASP.NET hat eine gute Prozess Scale-Out-Fähigkeit. So auch bei hohen Auslastungen, werden Sie eine gute CPU-Auslastung und Maßstab erhalten, ohne eine Tonne Konfigurationsaufwand.

Wenn die Arbeitsschritte länger liefen - lassen Sie sich in der Größenordnung von Stunden sagen oder sogar Tagen, und die Zeit war unvorhersehbar (wie das Schließen einer Lagerbestellung) - auch in diesem Fall, dass ich zu einem Asynchron-Prozess anlehnen würde. Wenn die Parallelität in den Tausenden pro Sekunde war, oder wieder sehr unberechenbar, das wäre auch ein separates Verfahren empfehlen. Wenn die Fehlerarten waren komplex genug, ich könnte die Arbeitsschritte in einem separaten Prozess sein wollen es einfach zu verwalten. Wenn die workitem Verarbeitung wahrscheinlich waren regelmäßig zu ändern (das Hinzufügen eines zusätzlichen Schrittes nach Geschäftsbedingungen entwickelt), könnte ich es in einem separaten Prozess will.

Aber keines dieser Dinge scheint in Ihrem Fall um wahr zu sein - Zip-Dateien entpacken.

Andere Tipps

Die Nachteile eines separaten Thread sind:

  1. Wenn die Seite endet es keine einfache Möglichkeit ist Benachrichtigung zu bekommen, was der andere Thread tut.
  2. Die Anwendung an jedem beliebigen Punkt neu gestartet werden.
  3. Es wäre leicht versehentlich zweimal den Prozess zu starten, wenn der Benutzer die Seite zweimal kurz hintereinander einreicht.
  4. Multithreaded-Code ist schwer zu debuggen.

Die Vorteile eines separaten Thread sind:

  1. Weniger Code
  2. Einfaches Feuer zu tun und vergessen, wenn der Benutzer nicht benachrichtigt werden, wenn die unzip abgeschlossen ist.
  3. Keine zusätzliche Arbeit zu installieren.

Die Vor- und Nachteile eines Windows-Dienst sind in etwa das Gegenteil der oben genannten.

Persönlich würde ich die Windows-Dienst Route mit Messaging zwischen ihnen für den Fortschritt, wie zurückgeben handle zum unzip nach unten gehen, die verwendet werden können Status zu überwachen.

Allerdings könnte man auch denken, wir ausgliedern vielleicht einen Thread, es zu tun, und das wird gerne ausführen und die Seite zurückkehrt.

Ich würde einen asynchronen Prozess verwenden, die Sie leicht von einer AJAX-fähigen Seite abfragen können. Wenn Sie fertig ist, kann der AJAX Teil der Seite die Details präsentieren Sie normalerweise präsentiert hätten, während der Benutzer für den Prozess gewartet synchron zu beenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top