Schnellere Kommunikation in Echtzeit

von am 30. August 2010 in Entwicklung

Die Kommunikation und Interaktion mit anderen Mitgliedern steht bei KWICK! im Vordergrund. Über ein spezielles System werden dabei viele Daten in Echtzeit ausgetauscht, ohne, dass die Besucher eine Verzögerung oder ein Neuladen der Seite in Kauf nehmen müssen. Die dabei verwendete Open Source Software PushUp wurde stetig weiterentwickelt und nun ebenfalls der Öffentlichkeit zur Verfügung gestellt.

Im zweiten Beitrag der Blogserie über die Entwicklung bei KWICK! werfen wir nach der agilen Software-Entwicklung mit Scrum nun einen Blick auf die Echtzeit-Funktionen, welche durch Server Pushes auf Basis einer Comet-Architektur realisiert wurden. Dabei werden Daten zwischen Client und Server ausgetauscht, ohne, dass der Client (Browser) den Kontakt initiiert hat. Die Comet-Architektur wird z.B. auch bei GMail Chat, Google Docs oder Meebo eingesetzt.

Bereits im Jahre 2001 haben wir mit automatischen Aktualisierungen durch Polling des Servers begonnen. Das heißt Anfragen wurden vom Browser in sehr kurzen Abständen von ein bis drei Minuten zum Beispiel durch Reloads eines versteckten iFrames abgesetzt. 2006 haben wir das System durch die Einführung von AJAX-Requests verfeinert. Der Nachteil beim Polling liegt auf der Hand: der Server bekommt eine enorme Last ab, wenn sehr viele Mitglieder parallel online sind. Zudem ist die Aktualisierung der Daten trotz der minütlichen Frequenz zu langsam. Die Lösung liegt in der Comet Architektur, welche durch einen Server-Push die Last entsprechend gering hält. Der Server meldet sich nur, wenn es wirklich etwas Neues gibt. Bereits zu Beginn des Jahres 2009 wurde das gesamte Ereignissystem von KWICK! auf diese Architektur umgestellt. Profilbesuche, neue E-Mails, Messages oder Logins von Freunden werden seitdem in Echtzeit angezeigt. Das bedeutet, dass man z.B. das Ereignis über einen Profilbesuch genau in dem Moment erhält, wo der Besucher das Profil auch betreten hat.

Um Nachrichten ohne Verzögerung an den Browser des Mitglieds senden zu können, muss dieser eine separate Verbindung zum Server aufbauen. Es handelt sich hierbei um eine Socket-Verbindung, welche als Fallback über einen langlebigen, offenen HTTP-Request via iFrame aufgebaut wird. Der PushUp-Server kann hierbei direkt Befehle an den Client schicken, welche direkt in JavaScript umgesetzt werden. Somit ist man quasi in der Lage, im Browser JavaScript ausführen zu können und die aktualisierten Daten zu verarbeiten. Um die Sicherheit muss sich ein Besucher dabei keinerlei Sorgen machen. Durch diese Technologie wird nur der Update-Intervall deutlich erhöht, sodass ein Reload der Seite oder eine Interaktion des Benutzers nicht notwendig ist.

Unsere hierfür eingesetzte Software namens PushUp basiert auf einem gleichnamigen Open-Source Projekt, auf welches wir im Jahre 2008 gestoßen sind. Der bisherige Entwickler hat das Projekt zwischenzeitlich scheinbar aufgegeben, da seine Homepage seit längerem nicht mehr erreichbar ist. Wir haben diesen Dienst konsequent weiterentwickelt und optimiert, sodass sich jetzt etliche tausende parallele Sitzungen damit steuern lassen. PushUp ist sehr schnell, effizient, stabil, simpel und flexibel. Zu Spitzenzeiten sind damit mehr als 90.000 Benutzer gleichzeitig mit diesem Dienst verbunden und empfangen damit alle möglichen Aktualisierungen in Echtzeit. Der Server kann mit jedem Format zum Austausch der Daten umgehen: von JSON, XML, XHTML bis hin zu eigenen Formaten. Clientseitig regelt ein 4,3 KB kleiner Flash-Film die Verbindung zum Server. Die Last wird bei KWICK! ausfallsicher auf vier PushUp-Server verteilt.

Klassisches Web Applikationsmodell

Abb. 1: Synchroner Ablauf nach dem klassischen Web Applikationsmodell. Der Server liefert Daten nur auf Anfrage des Clients.

Comet Web Applikationsmodell

Abb. 2: Die Comet Applikation kann Daten jederzeit zum Client schicken, ohne dass dieser die Anfrage initiiert.

Die größte Herausforderung bei der Implementierung der Comet-Architektur und PushUp war zu Anfang die große Vielfalt der Browser, Flash-Versionen, Firewalls oder Ad-Blocker zu berücksichtigen. Die unterschiedlichen Browser verfolgen dabei unterschiedliche Sicherheitskonzepte, beinhalten selbst Fehler oder halten sich nicht immer an W3C-Standards, was die Entwicklung zum damaligen Zeitpunkt erschwert hatte. Eine weitere Herausforderung war, den Dienst so effizient zu gestalten, so dass ein einzelner Server unter Dauerlast 20.000 und mehr gleichzeitiger Verbindungen schnell und ohne Verzögerung verarbeiten kann. Die PushUp-Software wurde dazu umgeschrieben und an die neuen Herausforderungen angepasst. In der Zwischenzeit werden nicht nur Ereignisse über diesen Dienst in Echtzeit über das Netz geschickt, sondern auch täglich Millionen von Messages, Kommentare, Bewertungen mit „Find ich gut“ oder der gesamte Neuigkeiten-Stream eines Mitgliedes auf der Startseite.

Mit WebSockets aus HTML5 besteht in naher Zukunft noch eine Alternative zu unserem Flash-Film als Client. Zwar haben bislang nur die neuesten Versionen von Google Chrome und Apple Safari das Netzwerkprotokoll implementiert, aber andere Browser werden bald folgen. Aktuell ist es noch keine Alternative, da noch eine signifikante Anzahl unserer Mitglieder veraltete Browser verwenden – der vielgehasste Internet Explorer 6.0 kommt auch neun Jahre nach seiner Veröffentlichung auf immerhin noch 1,9 % aller Besuche. PushUp funktioniert auch mit diesen älteren Browsern zuverlässig. Steht die Pushup-Verbindung nicht mehr zur Verfügung, so werden die Aktualisierungen eben nicht in Echtzeit ausgeliefert. Unterstützt der Client kein Flash (wie z.B. das iPad), so greift automatisch das Fallback über den langlebigen HTTP-Request.

In der Zwischenzeit existieren einige Alternativen für die Implementierung von Echtzeit-Features: Ajax Push Engine, cometD (Bayeux Protokoll), OrbitedPerservere und weitere. Bei CometDaily findet man auch einen Vergleich zwischen verschiedenen Comet Server Implementierungen.

Unsere PushUp Version ist nun bei Github als Open-Source frei verfügbar.

Tags: , , , , , , , , , , , , ,

Kommentar schreiben





*

Die KWICK! Community ist ein kostenloses Social Network zum neue Leute kennenlernen. Es gibt viele Gestaltungsmöglichkeiten, jedes Mitglied führt einen eigenen Blog und es ist einfach, neue Leute zu treffen.