Maison  >  Article  >  développement back-end  >  Les connexions AMQP dans Go doivent-elles être globales ou créées pour chaque message ?

Les connexions AMQP dans Go doivent-elles être globales ou créées pour chaque message ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-28 08:51:29622parcourir

 Should AMQP Connections in Go be Global or Created for Each Message?

Gestion des connexions dans AMQP Dial

Dans Go, la fonction amqp.Dial est utilisée pour établir des connexions à un serveur AMQP. Cependant, il existe une préoccupation quant à savoir si la fonction amqp.Dial doit être invoquée à chaque fois lors de l'envoi de messages ou si elle peut être déclarée globalement et réutilisée pour plusieurs opérations.

Gestion globale des connexions

Comme mentionné dans la documentation officielle, l'établissement des connexions TCP peut nécessiter beaucoup de ressources. Pour optimiser les performances, le concept de canaux a été introduit dans AMQP, permettant de créer plusieurs canaux sur une seule connexion.

Par conséquent, il est généralement recommandé de créer la connexion AMQP une seule fois, en tant que variable globale, et réutilisez-le pour toutes les opérations ultérieures. Cela réduit la surcharge associée à l'établissement de nouvelles connexions à chaque fois.

Thread Safety

La fonction amqp.Dial est thread-safe et peut être invoquée simultanément à partir de plusieurs goroutines. Cela permet la création de plusieurs connexions, si nécessaire, sans aucune condition de concurrence.

Gestion des échecs de connexion

Pour gérer les échecs de connexion avec élégance, vous pouvez utiliser la connexion. Méthode NotifyClose pour enregistrer un canal afin de recevoir des notifications lorsque la connexion est fermée. Cela permet de détecter et de se reconnecter selon les besoins.

Dans l'exemple fourni, le code écoute sur un canal et tente de rétablir une connexion en cas d'erreur. Cependant, une erreur se produit lors de la suppression de la connexion existante et de la tentative de publication d'un message. Cela est probablement dû au fait que le canal existant contient toujours une référence à la connexion fermée.

Pour résoudre ce problème, vous devez également fermer tous les canaux actifs lors du rétablissement d'une connexion afin d'éviter un comportement inattendu.

Exemple de gestion des erreurs

Voici un exemple qui intègre la gestion des échecs de connexion :

<code class="go">import (
    "context"
    "log"
    "sync"
    "time"

    "github.com/streadway/amqp"
)

var (
    connOnce sync.Once
    conn     *amqp.Connection
)

func main() {
    connOnce.Do(func() {
        var err error
        conn, err = amqp.Dial("amqp://guest:guest@localhost:5672/")
        if err != nil {
            log.Panicf("Failed to connect: %v", err)
        }
    })

    c := make(chan *amqp.Error)
    conn.NotifyClose(c)

    go func() {
        for {
            err := <-c
            log.Println("reconnect: " + err.Error())
            connOnce.Do(func() {
                var err error
                conn, err = amqp.Dial("amqp://guest:guest@localhost:5672/")
                if err != nil {
                    log.Panicf("Failed to connect: %v", err)
                }
            })
            conn.NotifyClose(c)
            // Give time for any pending messages to be delivered
            // after reconnection
            time.Sleep(5 * time.Second)
        }
    }()

    // Create channels and perform operations here
    // ...

    // Close the connection when done
    defer conn.Close()
}</code>

Dans cet exemple, une connexion globale est créée à l'aide de la synchronisation.Once tapez pour vous assurer qu’il n’est initialisé qu’une seule fois. La méthode Connection.NotifyClose est utilisée pour surveiller les échecs de connexion et rétablir les connexions si nécessaire.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn