Schlange stehen

Ein Überblick zu Message Queues für PHP
Kommentare

memcached
memcached ist eigentlich keine Message Queue. Das Open-Source-Projekt hat sich in den letzten Jahren vielmehr einen hervorragenden Ruf als eine schnelle und verteilte Caching-Lösung erarbeitet.

memcached

memcached ist eigentlich keine Message Queue. Das Open-Source-Projekt hat sich in den letzten Jahren vielmehr einen hervorragenden Ruf als eine schnelle und verteilte Caching-Lösung erarbeitet. In einem Blog-Eintrag ist allerdings beschrieben, wie sich memcached auch als einfache und schnelle Message Queue einsetzen lässt. Leider steht die eigentliche Implementierung noch nicht frei zur Verfügung, der Autor hat aber bereits angedeutet, dass er die Lösung in Kürze als Open-Source veröffentlichen wird.

Die Logik hinter der Implementierung ist relativ einfach. Wie bei der Verwendung von memcached üblich werden die Nachrichten mit einem eindeutigen Schlüssel ausgestattet. Über diesen Schlüssel kann auf die Nachricht zugegriffen werden. Im Falle der Nachrichten ist dieser Schlüssel vom Typ Integer und fortlaufend nummeriert. Zusätzlich zu den Nachrichten werden in der memcached-Instanz zwei weitere Werte gespeichert. Der erste beinhaltet den Schlüssel der ältesten Nachricht, der zweite die nächste freie Schlüsselnummer. Mit diesen Werten lässt sich die Message Queue relativ einfach aufbauen. Der Nachrichtenkonsument liest und löscht jeweils die älteste Nachricht und setzt den Wert für den ältesten Schlüssel auf den nächst höheren Wert. Der Nachrichtensender erstellt eine Nachricht mit der nächsten freien Schlüsselnummer und erhöht anschließend diesen Wert. Wer diese Funktionen in eine kleine Klasse packt und noch um ein wenig Logik erweitert, die vermeidet, dass der Wertebereich der Integer-Schlüssel überschritten wird, der hat seine eigene kleine Message-Queue-Implementierung komplettiert.

Mit dieser Art der Nutzung von memcached lässt sich eine schnelle und einfache Message Queue implementieren. Wer allerdings den Fokus auf Robustheit legt und selbst bei einem Ausfall keine Daten verlieren darf, der wird auch mit dieser Lösung nicht hundertprozentig zufrieden sein, da memcached seiner Caching-Natur entsprechend alle Daten im Hauptspeicher ablegt und auch sonst eher auf Geschwindigkeit als auf Zuverlässigkeit getrimmt ist. Im Moment erweckt diese Lösung mehr den Anschein einer „Bastelarbeit mit Potenzial“. Des Weiteren ist außer dem Blog-Eintrag weder Support noch Dokumentation vorhanden.

Beanstalkd

Beanstalkd ist ein schneller, verteilt arbeitender Dienst zum Aufbau von Message Queues. Die Verwendung ist nicht auf PHP festgelegt, sondern bietet auch den Zugriff für andere Programmiersprachen wie Ruby. Für die Nutzung mit PHP steht eine Client-Library unter Sourceforge zur Verfügung. Das System wurde ursprünglich für Facebook entwickelt, um dort komplexe Aufgaben von der eigentlichen Seitenanzeige zu koppeln und dadurch die Anzeige zu beschleunigen. Mittlerweile ist daraus ein universell einsetzbares Message-Queue-System geworden, das durchweg auf hohe Geschwindigkeit getrimmt wurde. Listing 4 zeigt den Zugriff auf die Beanstalkd Queue.

Listing 4: Lesender und schreibender Zugriff auf eine Beanstalkd Queue
 array( '127.0.0.1:11300' ),
));
$queue->use_tube('phpmag');

// Schreibender Zugriff auf die Queue    
$queue->put(0, 0, 2000, 'Testnachricht');
  
// Lesender Queue-Zugriff 
$msg = $queue->reserve(); 
echo $msg->get();
Beanstalk::delete($msg);
?>

Der Aufbau erinnert ein wenig an die zuvor beschriebene memcached-Lösung, was wohl ein wenig daran liegt, dass sich die Entwickler von Beanstalkd nach eigener Aussage von dessen Protokoll haben inspirieren lassen. Vielleicht liegt darin auch eine der Schwächen der Software begründet. Denn das Hauptaugenmerk liegt auch hier auf der Performance, nicht auf der Zuverlässigkeit und Ausfallsicherheit.

Beanstalkd arbeitet rein hauptspeicherbasiert. Ein Ausfall des Systems führt somit zu einem Verlust der Nachrichten. Dieses Problem soll allerdings in einer der nächsten Versionen behoben und eine persistente Speicherung der Queue-Inhalte ermöglicht werden. Beanstalkd ist eine vergleichsweise junge Software, Dokumentation und Support fallen dementsprechend dürftig aus.

Zend Job Queue

Im Rahmen der Bemühungen, PHP für Enterprise-Anwendungen salonfähig zu machen, bietet auch Zend eine Queue-Implementierung an. Diese ist in das Zend-Platform-Produkt integriert. Dabei ist zu beachten, dass es sich hierbei nicht um eine Queue für Nachrichten, sondern für Jobs handelt. Mit der Zend Job Queue können Aufgaben in eine Warteschlange gestellt werden, die anschließend von Zend Platform zu konfigurierbaren Zeiten abgearbeitet werden. Bei den Aufgaben handelt es sich um PHP-Skripte. Listing 5 zeigt ein Beispiel, in dem ein Job in die Warteschlage gestellt wird. Dieser Job ist so konfiguriert, dass er zwei Stunden nach dem Einstellen in die Queue durch Zend Platform abgearbeitet wird.

Listing 5: Job Queues mit der Zend Job Queue
login("passwort"); 

// Erstellung eines Jobs
$job = new ZendApi_Job("import.php");
$job->setScheduledTime(time() + 2*60*60);

// Einstellen des Jobs in die Queue
$id = $queue->addJob($job);
?>

Die Zend Job Queue kann allerdings noch viel mehr. Sich wiederholende Aufgaben lassen sich damit ebenso einfach erstellen wie Jobs, die von der Fertigstellung anderer Aufgaben abhängig sind. Sowohl die Jobs, als auch ihre Parameter und die Resultate können zudem zu jeder Zeit über die Administrationsoberfläche der Zend Platform eingesehen werden. Diese Lösung ist kostenpflichtig, da sie fest in das Zend-Platform-Produkt integriert ist. Da die Preise je nach Server recht happig sein können, wird es für viele Entwickler ein Grund sein, sich für ein anderes Produkt zu entscheiden. Wer allerdings eine Lösung für die zeitlich gesteuerte Abarbeitung von Aufgaben sucht, der bekommt mit dieser Software eine sehr flexible Möglichkeit an die Hand, die sich auf vielfältige Weise an eigene Bedürfnisse anpassen lässt.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -