Der Unterschied zwischen Web Sockets, Web Workers und Service Workers

Avatar of Aisha Bukar
Aisha Bukar am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Web Sockets, Web Workers, Service Workers… das sind Begriffe, die Sie vielleicht schon gelesen oder gehört haben. Vielleicht nicht alle, aber wahrscheinlich mindestens einen davon. Und selbst wenn Sie die Frontend-Entwicklung gut beherrschen, müssen Sie wahrscheinlich nachschlagen, was sie bedeuten. Oder vielleicht sind Sie wie ich und verwechseln sie von Zeit zu Zeit. Die Begriffe sehen und klingen alle sehr ähnlich und es ist wirklich einfach, sie zu verwechseln.

Lassen Sie uns sie also gemeinsam aufschlüsseln und Web Sockets, Web Workers und Service Workers unterscheiden. Nicht im Detail, wo wir tief eintauchen und praktische Erfahrungen mit jedem einzelnen sammeln – eher wie eine kleine Hilfe zum Lesezeichen für das nächste Mal, wenn ich Sie eine Auffrischung brauchen.

Schnellreferenz

Wir beginnen mit einem allgemeinen Überblick für einen schnellen Vergleich und Kontrast.

MerkmalWas es ist
Web SocketStellt eine offene und persistente bidirektionale Verbindung zwischen dem Browser und dem Server her, um Nachrichten über eine einzige Verbindung ereignisgesteuert zu senden und zu empfangen.
Web WorkerErmöglicht die Ausführung von Skripten im Hintergrund in separaten Threads, um zu verhindern, dass Skripte sich gegenseitig im Hauptthread blockieren.
Service WorkerEine Art von Web Worker, die einen Hintergrunddienst erstellt, der als Middleware für die Verarbeitung von Netzwerkanfragen zwischen Browser und Server fungiert, auch in Offline-Situationen.

Web Sockets

Ein Web Socket ist ein bidirektionales Kommunikationsprotokoll. Stellen Sie sich das wie ein laufendes Gespräch zwischen Ihnen und Ihrem Freund vor, das nicht endet, es sei denn, einer von Ihnen beschließt, aufzulegen. Der einzige Unterschied ist, dass Sie der Browser und Ihr Freund der Server sind. Der Client sendet eine Anfrage an den Server und der Server antwortet, indem er die Anfrage des Clients verarbeitet und umgekehrt.

Illustration of two women representing the browser and server, respectively. Arrows between them show the flow of communication in an active connection.

Die Kommunikation basiert auf Ereignissen. Ein WebSocket-Objekt wird erstellt und verbindet sich mit einem Server, und Nachrichten zwischen dem Server lösen Ereignisse aus, die sie senden und empfangen.

Das bedeutet, dass nach der anfänglichen Verbindung eine Client-Server-Kommunikation stattfindet, bei der eine Verbindung aufgebaut und aufrechterhalten wird, bis entweder der Client oder der Server sie durch Senden eines CloseEvent beendet. Das macht Web Sockets ideal für Anwendungen, die eine kontinuierliche und direkte Kommunikation zwischen einem Client und einem Server erfordern. Die meisten Definitionen, die ich gesehen habe, nennen Chat-Apps als häufigen Anwendungsfall – Sie tippen eine Nachricht, senden sie an den Server, lösen ein Ereignis aus und der Server antwortet mit Daten, ohne den Server immer wieder anpingen zu müssen.

Stellen Sie sich dieses Szenario vor: Sie sind unterwegs und entscheiden sich, Google Maps zu öffnen. Sie wissen wahrscheinlich bereits, wie Google Maps funktioniert, aber falls nicht: Es findet automatisch Ihren Standort, nachdem Sie sich mit der App verbunden haben, und verfolgt ihn, wohin Sie auch gehen. Es verwendet Echtzeit-Datenübertragung, um Ihren Standort zu verfolgen, solange diese Verbindung besteht. Das ist ein Web Socket, der ein persistentes bidirektionales Gespräch zwischen dem Browser und dem Server herstellt, um diese Daten auf dem neuesten Stand zu halten. Eine Sport-App mit Echtzeit-Ergebnissen könnte Web Sockets auf diese Weise ebenfalls nutzen.

Der große Unterschied zwischen Web Sockets und Web Workers (und damit auch Service Workers, wie wir sehen werden) ist, dass sie direkten Zugriff auf das DOM haben. Während Web Workers (und Service Workers) in separaten Threads laufen, sind Web Sockets Teil des Hauptthreads, was ihnen die Möglichkeit gibt, das DOM zu manipulieren.

Es gibt Tools und Dienste, die bei der Einrichtung und Wartung von Web Socket-Verbindungen helfen, darunter: SocketCluster, AsyncAPI, cowboy, WebSocket King, Channels und Gorilla WebSocket. MDN hat eine laufende Liste, die weitere Dienste enthält.

Weitere Informationen zu Web Sockets

Web Workers

Stellen Sie sich ein Szenario vor, in dem Sie eine Reihe komplexer Berechnungen durchführen und gleichzeitig Änderungen am DOM vornehmen müssen. JavaScript ist eine Single-Threaded-Anwendung, und die Ausführung von mehr als einem Skript könnte die Benutzeroberfläche, die Sie zu ändern versuchen, sowie die durchgeführte komplexe Berechnung stören.

Hier kommen die Web Worker ins Spiel.

Web Worker ermöglichen die Ausführung von Skripten im Hintergrund in separaten Threads, um zu verhindern, dass sich Skripte gegenseitig im Hauptthread blockieren. Das macht sie großartig für die Verbesserung der Leistung von Anwendungen, die intensive Operationen erfordern, da diese Operationen im Hintergrund auf separaten Threads ausgeführt werden können, ohne die Darstellung der Benutzeroberfläche zu beeinträchtigen. Aber sie sind nicht so gut darin, auf das DOM zuzugreifen, denn im Gegensatz zu Web Sockets läuft ein Web Worker außerhalb des Hauptthreads in seinem eigenen Thread.

Ein Web Worker ist ein Objekt, das eine Skriptdatei ausführt, indem es ein Worker-Objekt verwendet, um die Aufgaben auszuführen. Und wenn wir von Workern sprechen, fallen sie tendenziell in eine von drei Kategorien

  • Dedizierte Worker: Ein dedizierter Worker ist nur für das Skript erreichbar, das ihn aufruft. Er führt immer noch die Aufgaben eines typischen Web Workers aus, wie z. B. seine Multi-Threading-Skripte.
  • Shared Workers: Ein Shared Worker ist das Gegenteil eines dedizierten Workers. Er kann von mehreren Skripten abgerufen werden und praktisch jede Aufgabe ausführen, die ein Web Worker ausführt, solange sie sich in derselben Domäne wie der Worker befinden.
  • Service Workers: Ein Service Worker fungiert als Netzwerk-Proxy zwischen einer App, dem Browser und dem Server und ermöglicht die Ausführung von Skripten auch dann, wenn das Netzwerk offline geht. Darauf werden wir im nächsten Abschnitt eingehen.

Weitere Informationen zu Web Workers

  • „Off the Main Thread“ (Chris Coyier)
  • Der Stand von Web Workers im Jahr 2021 (Chris Coyier)
  • Einführung in Web Workers (Zapier)
  • Web Workers API (MDN Docs)
  • Aktuelle Browserunterstützung (Caniuse)

Service Workers

Es gibt einige Dinge, auf die wir als Entwickler keinen Einfluss haben, und eines davon ist die Netzwerkverbindung eines Benutzers. Welches Netzwerk ein Benutzer auch wählt, das ist es eben. Wir können nur unser Bestes tun, um unsere Apps zu optimieren, damit sie auf jeder Verbindung die bestmögliche Leistung erbringen.

Service Worker sind eines der Dinge, mit denen wir die Leistung einer App progressiv verbessern können. Ein Service Worker sitzt zwischen der App, dem Browser und dem Server und bietet eine sichere Verbindung, die dank – Sie haben es erraten – Web Workern im Hintergrund auf einem separaten Thread läuft. Wie wir im letzten Abschnitt gelernt haben, sind Service Worker eine von drei Arten von Web Workern.

Warum also einen Service Worker zwischen Ihrer App und dem Browser des Benutzers haben? Auch hier haben wir keine Kontrolle über die Netzwerkverbindung des Benutzers. Angenommen, die Verbindung bricht aus unbekannten Gründen ab. Das würde die Kommunikation zwischen dem Browser und dem Server unterbrechen und verhindern, dass Daten hin und her übertragen werden. Ein Service Worker hält die Verbindung aufrecht und fungiert als asynchroner Proxy, der Anfragen abfangen und Aufgaben ausführen kann – auch nach dem Verlust der Netzwerkverbindung.

A gear cog icon labeled Service Worker in between a browser icon labeled client and a cloud icon labeled server.

Dies ist der Haupttreiber für das, was oft als „Offline-First“-Entwicklung bezeichnet wird. Wir können Assets im lokalen Cache statt im Netzwerk speichern, kritische Informationen bereitstellen, wenn der Benutzer offline geht, Dinge vorab abrufen, damit sie bereit sind, wenn der Benutzer sie benötigt, und Fallbacks als Reaktion auf Netzwerkfehler bereitstellen. Sie sind vollständig asynchron, aber im Gegensatz zu Web Sockets haben sie keinen Zugriff auf das DOM, da sie auf eigenen Threads laufen.

Das andere Wichtige, was man über Service Worker wissen muss, ist, dass sie jede einzelne Anfrage und Antwort Ihrer App abfangen. Daher haben sie einige sicherheitsrelevante Auswirkungen, insbesondere dass sie einer Same-Origin-Policy folgen. Das bedeutet, dass ein Service Worker nicht von einem CDN oder einem Drittanbieterdienst ausgeführt werden kann. Sie erfordern auch eine sichere HTTPS-Verbindung, was bedeutet, dass Sie ein SSL-Zertifikat benötigen, damit sie ausgeführt werden können.

Weitere Informationen zu Service Workern

  • Einen Service Worker zu Ihrer Website hinzufügen (Chris Ferdinandi)
  • Übersicht über Service Worker (Chrome Developers)
  • Kleinere HTML-Payloads mit Service Workern (Philip Walton)
  • Service Worker Kochbuch (Mozilla)
  • Service Worker API (MDN Docs)
  • Aktuelle Browserunterstützung (Caniuse)

Zusammenfassung

Das ist eine sehr oberflächliche Erklärung der Unterschiede (und Gemeinsamkeiten) zwischen Web Sockets, Web Workers und Service Workers. Noch einmal, die Terminologie und die Konzepte sind ähnlich genug, um sie miteinander zu verwechseln, aber hoffentlich gibt Ihnen dies eine bessere Vorstellung davon, wie man sie unterscheidet.

Wir haben mit einer schnellen Referenztabelle begonnen. Hier ist dieselbe, aber leicht erweitert, um deutlichere Vergleiche zu ziehen.

MerkmalWas es istMultithreaded?HTTPS?DOM-Zugriff?
Web SocketStellt eine offene und persistente bidirektionale Verbindung zwischen dem Browser und dem Server her, um Nachrichten über eine einzige Verbindung ereignisgesteuert zu senden und zu empfangen.Läuft im HauptthreadNicht erforderlichJa
Web WorkerErmöglicht die Ausführung von Skripten im Hintergrund in separaten Threads, um zu verhindern, dass Skripte sich gegenseitig im Hauptthread blockieren.Läuft in einem separaten ThreadErforderlichNein
Service WorkerEine Art von Web Worker, die einen Hintergrunddienst erstellt, der als Middleware für die Verarbeitung von Netzwerkanfragen zwischen Browser und Server fungiert, auch in Offline-Situationen.Läuft in einem separaten ThreadErforderlichNein