Moin Moin! Ich bin mal wieder dran, aber diese Woche mache ich mal eine Pause vom Arduino basteln und widme mich anderen sehr wichtigen Sachen. Und zwar stand ich die Woche vor einer Herausforderung, die zu bewältigen sein sollte. Wie macht man schnell eine kleine key-value Queue? Ganz einfach in Redis.
Ich werde hier nicht jeden einzelnen Programmierschritt erklären, sondern nur mal meine Überlegungen als Softwareentwickler kundtun und euch damit einen Anreiz geben, wie man sowas vernünftig aufbauen kann. Die Anforderung, die von unserem Teamleiter kamen, sahen wie folgt aus.
- Es soll Clusterfähig sein, also wenn die queue voll ist und zu langsam mit der Abarbeitung ist, soll ein neuer Server in der Cloud für die Abfertigung mit hoch gefahren werden.
- Es muss schnell gehen und ebenfalls sichergestellt werden, dass Jobs in der Queue nur einmal ausgeführt werden.
Nachdem ich mir dann etwas den Kopf zerbrochen habe, bin ich dann auf Redis gekommen. Hier gibt es schon alles, was wir benötigen. Als PHP Client habe ich PREDIS genommen, ihr könnt aber jeden x-beliebigen dafür nehmen. Dadurch sind wir einerseits schonmal Serverseitig Clusterbereit und durch die Atomic-Funktionen von Redis Stellen wir sicher, dass wirklich nur ein Client immer einen Datensatz bekommt und kein anderer diesen Datensatz auch verarbeitet.
Ich habe mir zum Testen die Funktionen
- RPUSH
- LPOP
- LLEN
rausgesucht. Habe mir einen Service geschrieben, der alle paar Sekunden LLEN ausführt auf eine Liste in der Redis DB. Die Webserver pushen in die Liste mittels RPUSH einen neuen Queue Auftrag herein und können stumpf weiter arbeiten. Nun kommt der erste Worker, sieht dass es einen neuen Eintrag gibt und mittels LPOP wird dieser Eintrag rausgezogen und in Redis direkt gelöscht. Danach kann dies einfach weiter arbeiten und wenn man irgendwann an einem Punkt angelangt ist, dass ein Server nicht mehr zum abarbeiten ausreicht, kann man sich noch einen zusätzlichen Server daneben stellen oder den Server aufrüsten (Cloud macht's ja bekanntlich möglich :D )
Ich hoffe ich konnte dem ein oder anderen hiermit einen kleinen Denkanstoß geben für seine zukünftigen Projekte.