Le blog

Optimisez les perfs de votre app avec Go et Symfony Messenger

Publié le 23 novembre 2023

Symfony Messenger est un composant puissant dans l'écosystème Symfony qui permet de gérer l'envoi et la réception de messages dans une application PHP. Il devient particulièrement essentiel à mesure que votre application évolue et nécessite une gestion efficace des messages. Lorsque votre application atteint une certaine échelle, l'efficacité du traitement des messages devient cruciale pour maintenir des performances élevées. C'est là qu'intervient l'idée d'écrire des workers dans un langage autre que PHP. Cela permet de tirer parti des forces spécifiques de chaque langage pour optimiser le traitement des messages.

De son côté, Go, un langage de programmation que nous affectionnons beaucoup chez Les-Tilleuls.coop, se distingue par sa simplicité, sa rapidité d'exécution et sa gestion efficace des concurrences. Ces caractéristiques en font un choix idéal pour le traitement asynchrone de messages, améliorant ainsi les performances globales de votre application.

Coupler le meilleur des deux mondes avec Gosumer #

Gosumer est un package innovant conçu pour améliorer les performances de votre application en consommant efficacement les messages de Symfony Messenger avec l'aide de code Go. Il s'intègre très facilement avec des technologies telles que PostgreSQL, AMQP et Redis, offrant ainsi aux développeuses et développeurs la possibilité d'optimiser le traitement des messages en toute simplicité.

Vous pouvez retrouver le code source de ce package sur GitHub.

Le fonctionnement de Gosumer #

Imaginons que vous ayez une application Go qui doit traiter des messages Symfony Messenger de manière efficace :

package main

import (
"encoding/json"
"log"

"github.com/romaixn/gosumer"
)

type Message struct {
    ID     int `json:"id"`
    Number int `json:"number"`
}

func main() {
    database := gosumer.PgDatabase{
        Host:      "localhost",
        Port:      5432,
        User:      "app",
        Password:  "!ChangeMe!",
        Database:  "app",
        TableName: "messenger_messages",
    }

    err := gosumer.Listen(database, processMessage, Message{})

    if err != nil {
        log.Fatal(err)
    }
}

func processMessage(message any, err chan error) {
    log.Printf("Message received: %v", message)

    jsonData, e := json.Marshal(message)
    if e != nil {
        log.Printf("Error marshalling message: %v", e)
        err <- e

        return
    }

    var msg Message
    e = json.Unmarshal(jsonData, &msg)
    if e != nil {
        log.Printf("Error unmarshalling message: %v", e)
        err <- e

        return
    }

    log.Printf("Sum of %d and %d is %d", msg.ID, msg.Number, msg.ID+msg.Number)

    err <- nil

    return
}

Dans cet exemple, nous définissons une structure Message représentant les données des messages entrants, la même structure que celle que vous avez définie côté Symfony (PHP). Ensuite, nous écoutons tous les messages avec la fonction gosumer.listen et les traitons avec processMessage. Une fois le message traité et sans erreurs, il est supprimé de la base de données. En cas d'erreur pendant le traitement, le message n'est pas supprimé et sera de nouveau consommé ultérieurement.

N'hésitez pas à vous rendre sur GitHub pour explorer le projet et le tester ! Notre coopérative, spécialisée dans de nombreux langages de programmation, est à votre disposition pour l’optimisation des performances de vos projets. Prenez rendez-vous dès maintenant avec notre équipe commerciale afin de définir vos besoins !

Romain Herault

Romain Herault

Backend developer

Mots-clésgo, Golang, Gosumer, Symfony

Le blog

Pour aller plus loin