22
Jul
Beanstalk
Beanstalk, zu deutsch Bohnenstange, ist eine Open-Source Software zur Verwaltung von Daten in Warteschlangen. Der Beanstalk-Daemon, beanstalkd, ist in C programmiert und kann hier heruntergeladen werden. Ursprünglich wurde der Dienst von Philotic Inc. entwickelt, um die Applikation „Causes“ auf Facebook zu beschleunigen.
Wozu Warteschlangen?
Auf Warteschlangen basierende Techniken werden in verschiedenen Bereichen der Informatik verwendet und sind als FIFO-Speicher (First In – First Out) bekannt.
Dazu gehören beispielsweise folgende Anwendungsfälle:
Interprozesskommunikation – Die aus Betriebssystemen bekannten „Pipes“ sind Warteschlangen, die zur Interprozesskommunikation dienen.
GUI-Ereignisbehandlung – Mausklicks, Tastaturanschläge, Fensterpositionsänderungen und viele andere Ereignisse werden über so genannte Message-Queues verwaltet und Prozessen zugeordnet, die sich für die Ereignisbehandlung registriert haben.
Parallelisierung – Aufgaben können von mehreren Programmen, die mehrere Prozessoren nutzen können oder auch auf mehreren Rechnern laufen können, aus der Warteschlange entnommen werden. Die Bearbeitung der Aufgaben kann dann gleichzeitig ablaufen.
Synchronisation – Asynchron laufende Prozesse können Daten über Warteschlangen austauschen, um sich nicht unnötig zu blockieren. Ein Prozess kann dann verfügbare Daten sofort bereitstellen, obwohl sie noch gar nicht angefragt wurden. Umgekehrt kann sich ein Prozess, der Daten benötigt, bei der Warteschlange registrieren und automatisch benachrichtigt werden, sobald sie vorhanden sind.
Aufgabenzusammenfassung
Viele kleine Aufgaben können zu einer größeren Aufgabe zusammengefasst werden, um den Vorbereitungs- und Nachbereitungsaufwand zu reduzieren, der für die Bearbeitung einer Aufgabe nötig ist.
Anwendung auf Schueler.CC
Beanstalk wird auf Schueler.CC verwendet, um private Nachrichten bei Bedarf als Pakete zusammenzufassen und so weniger Datenbankabfragen zu erzeugen. Dabei laufen mehrere Worker, also Beanstalk-Clients, gleichzeitig, damit die Daten für die ca. 2 Millionen Nachrichten pro Tag schnell genug entnommen werden und sich nicht aufstauen.
Installation
Die Installation von Beanstalk gestaltet sich relativ einfach.
Falls kein Paket für die verwendete Distribution vorhanden ist oder man lieber eine Version nutzen möchte, die aktueller ist, als die im jeweiligen Distributions-Repository vorhandene, kann man den Beanstalk-Quelltext herunterladen und nach dem bekannten Dreisatz „configure, make, make install“ selbst kompilieren und installieren.
Inbetriebnahme
Beanstalk läuft ohne Konfigurationsdatei und kann direkt über Konsolenparameter eingestellt werden.
Der Start eines Beanstalk-Daemons kann wie folgt aussehen:
./beanstalkd -d -l 10.0.1.5 -p 11300
Das lässt Beanstalk unter der IP-Adresse 10.0.1.5 auf Port 11300 als Daemon-Prozess Anfragen erwarten.
Beanstalk-Clients
Um Daten in eine Beanstalk-Warteschlange zu schreiben oder um welche aus einer Beanstalk-Warteschlange zu entnehmen, braucht man einen Beanstalk-Client. Für Beanstalk gibt es bereits Clients in vielen verschiedenen Sprachen. Eine Auflistung ist hier zu finden.
Nachdem der Client als Variable in der gewünschten Sprache verfügbar ist, wird in der Regel erstmal festgelegt, wie die zu benutzende Warteschlange heißen soll (bei Beanstalk auch „Tube“ genannt). Anschließend werden entweder Daten hinten angestellt oder vorne entnommen.
PHP-Beispiel
Wenn man den PHP-Client verwendet, der hier verfügbar ist, kann der Zugriff auf Beanstalk wie folgt aussehen:
//Verbindung zum Beanstalk-Serververbund erstellen
//Die Auswahlmethode 'sequential peek' wählt Instanzen
//aus dem Serververbund der Reihe nach aus.
$beanstalk = Beanstalk::open(array(
'servers' => array('10.0.1.5:11300'),
'select' => 'sequential peek'));
$beanstalk->use_tube('meineWarteschlange');
$beanstalk->put(serialize($einAufgabenObjekt));
In diesem Beispiel wird davon ausgegangen, dass ein Objekt namens $einAufgabenObjekt existiert. Dieses wird serialisiert und in der Warteschlange „meineWarteschlange“ hinten angestellt.
Um die Daten mit einem Worker aus der Warteschlange auszulesen, teilt man dem Beanstalk-Client mit, auf welche Warteschlange er achten soll, entnimmt die Daten dann als Job-Objekt und markiert den Job bei Bedarf als erledigt:
$beanstalk->watch('meineWarteschlange');
$beanstalkJob = $beanstalk->reserve();
$einAufgabenObjekt = unserialize($beanstalkJob->get());
Beanstalk::delete($beanstalkJob);
Fazit
Egal, ob man nun aber Aufgaben auf viele Rechner verteilen möchte, um zu parallelisieren, Aufgaben auf einen längeren Zeitraum verteilen möchte, oder viele Aufgaben zusammenfassen möchte, sollte man vorher ein Testszenario erstellen. Nachdem die Tests fehlerfrei laufen, empfiehlt es sich dennoch, sich die Möglichkeit vorzubehalten, sein System auf das alte Verhalten zurückschalten zu können, falls nicht bedachte Fehler im Live-Betrieb auftreten oder nicht der gewünschte Erfolg erzielt wird.
Abschließend kann man sagen, dass Beanstalk eine interessante Möglichkeit ist, hohes Lastaufkommen zu kontrollieren. Es ist bequem einzurichten und auch die Benutzung ist relativ einfach möglich.
Noch keine Kommentare
Schreibe jetzt den ersten Kommentar:
