Events und asynchrone Verarbitung bzw. Queueing
-
Hallo,
gibt es schon i-doit Nutzer, die eine Message Queue verwenden um ihre Events zu verteilen?
Wir haben gerade ein Proof-of Concept im Test, welches mittels php-amqplib Events an einen RabbitMQ-Server weiterleitet. Wäre dies von allgemeinem Interesse? Zur Not kann man immer mit SHELL COMMAND ein Progamm starten, welches die Queue beschickt, aber der direkte Weg scheint mir eleganter. -
Hi,
also uns ist bisher noch nichts in der Richtung bekannt. Wenn Du Erfolge mit der Lösung hast, kannst Du sie aber gerne mit uns hier teilen. Passt ja auch ganz gut dazu, dass im Dezember eine neue Version des Event Add-ons veröffentlicht wird.
-
Ich habe verschiedene Dinge ausprobiert:
- Interne Erweiterung von i-doit mit php-amqplib
- Python Skript mit pika via SHELL COMMAND
- Go Programm via SHELL COMMAND
Die Performance ergibt sich wie folgt:
Vorgehen Dauer pro Event PHP mit php-amqplib 0.045s Python 0.267s Go 0.01s Die Lösung mit einem externen Programm in einer kompilierten Sprache verspricht also die beste Performance. Bei Python ist das immer wiederkehrende Laden der RabbitMQ-Bibliothek das Performance-Problem.
Hier ist das verwendete Go-Programm für eigenen Versuche:
package main import ( "os" "log" "github.com/streadway/amqp" ) func failOnError(err error, msg string) { if err != nil { log.Fatalf("%s: %s", msg, err) } } func main() { uri := os.Args[1] conn, err := amqp.Dial(uri) failOnError(err, "Failed to connect to RabbitMQ") defer conn.Close() ch, err := conn.Channel() failOnError(err, "Failed to open a channel") defer ch.Close() body := os.Args[3] err = ch.Publish( os.Args[2], // exchange "", // routing key false, // mandatory false, // immediate amqp.Publishing { ContentType: "application/base64", Body: []byte(body), }) failOnError(err, "Failed to publish a message") }
-
Sehr cool. Hier ist übrigens mal nen Preview auf die neue Event Version: