Rolf B: Unterschiedliche Zeitabläufe

Beitrag lesen

Hallo Lowterm,

Worker - meinst Du das Webworker-API im Browser? - sind dann sinnvoll, wenn Du eine echte Parallelität der Verarbeitung haben willst. Für eine Zeitüberwachung sind sie ungeeignet. Du kannst im Worker auch nichts anderes tun als im Haupt-Thread: Einen Timer setzen und nach Ablauf signalisieren, dass die Zeit rum ist. Der Worker macht Dir die zusätzliche Arbeit, das Signal zunächst an den Haupt-Thread des Browsers zu schicken.

Beeinflussen kannst Du mit Hilfe der Entwicklerwerkzeuge des Browsers sehr viel. Deswegen ist auf NICHTS, was im Browser passiert, irgendein Verlass.

Wenn Du dem Anwender signalisieren willst, dass die Bearbeitungszeit abgelaufen ist, liefere die verbleibende Zeit mit, wenn Du die Seite an den Browser schickst und lasse per JavaScript einen Intervalltimer laufen, der zum Beispiel im Sekundentakt die Restzeit anzeigt. Das mit der verbleibenden Zeit ist wichtig, weil der Anwender ja z.B. die Seite refreshen kann (was blöd wäre weil dann die Eingaben weg sind) und die Restzeit dann immer noch stimmen muss.

Den Verlust der Eingabedaten kannst Du verhindern, indem das JavaScript im Hintergrund die Daten in kurzen Abständen aus dem Formular liest und entweder am Server oder im LocalStorage zwischenspeichert. Vor allem für Grobmotoriker wie mich, die täglich einmal Strg+W statt Shift+W drücken, wäre das ein Geschenk des Himmels.

Kurz vor Ende der Zeit kann das Script warnen und bei Ablauf das Formular sperren. Mit Hilfe eines Ajax-Requests im Hintergrund kann das Script - zum Beispiel 5 Sekunden vor Schluss - die Eingaben sichern und nochmal die Restzeit abholen, um sicher zu sein, dass nicht zu früh gesperrt wird. Wenn es wirklich wichtig ist, die Eingabe sekundengenau zu beenden und den aller-allerletzten Stand bei Fristablauf auf dem Server zu haben, kann der Server etwas Kulanz walten lassen und Uploads noch wenige Sekunden nach Fristablauf zulassen. Wenn viele Leute mit dem System arbeiten und alle gleichzeitig fertig werden, musst Du aber sehr vorsichtig sein und ggf. Gnade walten lassen. Je nach Leistungsfähigkeit des Servers kann es dann sein, dass die Verarbeitung der Einsendungen sich staut. Eventuell musst Du die Einsendungen dann erstmal nur 1:1 auf dem Server speichern, in der Datenbank die Einsendung vermerken und die Daten im Hintergrund weiterverarbeiten, wo es die Benutzer nicht blockieren kann. Echtzeitprogrammierung für viele Anwender ist definitiv kein Spaß, und ein solches System muss sehr gut auf sein Lastverhalten getestet werden.

Der Teil im Browser ist aber nicht ausreichend. Der Browser steht unter Kontrolle des Anwenders und ist jeglicher Manipulation ausgesetzt. Schlimmer noch, wie Raketenwilli sagte, es muss gar kein Browser sein; es kann auch ein anderes Tool sein, das die HTTP Requests absetzt. Jede fachlich oder sicherheitstechnisch relevante Überprüfung muss vom Server durchgeführt werden.

Threads helfen Dir hier generell nicht weiter. Die Browser/Webserver Welt ist etwas ganz anderes als ein Desktop-Programm. Auf dem Desktop hast Du einen einzigen User, und du kannst in einem Programm einen Hintergrund-Thread laufen lassen, der eine Zeit abmisst und nach Ablauf signalisiert, dass das Formular zu sperren ist.

Wenn ein Webserver sowas täte, würde er sehr schnell an seine Leistungsgrenzen kommen. Ein Webserver beschäftigt sich im Normalfall nur dann mit einem seiner Clients, wenn der einen Request schickt. Darauf gibt's eine Antwort, und der Client ist wieder vergessen. Alles, was zwischen der Response und dem nächsten Request erinnert werden muss, wird vom Serverprogramm in der Session oder in einer Datenbank gespeichert. Nur so ist es möglich, mit einem einzigen Server sehr viele Anwender zu bedienen. Würde der Webserver pro aktivem Nutzer einen Thread erzeugen und aktiv laufen lassen, wäre er viel schneller am Anschlag.

Es gibt Ausnahmen. Mit Server-sent Events oder Websockets gibt es Protokolle, bei denen der Server aktiv etwas an den Client schicken kann. Die sind aber in klassischen Webservern nicht vorhanden, die benötigen spezielle Applicationserver, mit denen sich sowas machen lässt.

Wie schon beschrieben ist das für Dich nicht nötig. Deine Zeitüberwachung kannst Du mit einfachen Timestamps in einer Datenbank realisieren. Für den Anwender reicht die informative Anzeige per JavaScript im Browser

Rolf

--
sumpsi - posui - obstruxi