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:

    0_1542378584488_2940aeb7-067a-4a6c-9d08-f266223f1776-image.png

    0_1542378687683_7e33e224-f81d-4568-8e9b-bb409725fc71-image.png


Log in to reply
 


Datenschutz / Privacy Policy