Verbindungen in AMQP Dial verwalten
In Go wird die amqp.Dial-Funktion verwendet, um Verbindungen zu einem AMQP-Server herzustellen. Es bestehen jedoch Bedenken, ob die amqp.Dial-Funktion jedes Mal beim Senden von Nachrichten aufgerufen werden sollte oder ob sie global deklariert und für mehrere Vorgänge wiederverwendet werden kann.
Globale Verbindungsverwaltung
Wie in der offiziellen Dokumentation erwähnt, kann der Aufbau von TCP-Verbindungen ressourcenintensiv sein. Um die Leistung zu optimieren, wurde in AMQP das Konzept der Kanäle eingeführt, das die Erstellung mehrerer Kanäle über eine einzige Verbindung ermöglicht.
Daher wird allgemein empfohlen, die AMQP-Verbindung nur einmal als globale Variable zu erstellen Sie können es für alle nachfolgenden Vorgänge wiederverwenden. Dies reduziert den Aufwand, der mit dem Herstellen jedes Mal neuer Verbindungen verbunden ist.
Thread-Sicherheit
Die amqp.Dial-Funktion ist Thread-sicher und kann gleichzeitig von mehreren Goroutinen aufgerufen werden. Dies ermöglicht bei Bedarf die Erstellung mehrerer Verbindungen ohne Race-Bedingungen.
Behandlung von Verbindungsfehlern
Um Verbindungsfehler elegant zu behandeln, können Sie die Verbindung verwenden. NotifyClose-Methode zum Registrieren eines Kanals zum Empfangen von Benachrichtigungen, wenn die Verbindung geschlossen wird. Auf diese Weise können Sie bei Bedarf erkennen und die Verbindung wiederherstellen.
Im bereitgestellten Beispiel lauscht der Code auf einem Kanal und versucht, im Fehlerfall eine Verbindung wiederherzustellen. Beim Beenden der bestehenden Verbindung und dem Versuch, eine Nachricht zu veröffentlichen, tritt jedoch ein Fehler auf. Dies liegt wahrscheinlich daran, dass der vorhandene Kanal immer noch einen Verweis auf die geschlossene Verbindung enthält.
Um dieses Problem zu beheben, sollten Sie beim Wiederherstellen einer Verbindung auch alle aktiven Kanäle schließen, um unerwartetes Verhalten zu vermeiden.
Beispiel mit Fehlerbehandlung
Hier ist ein Beispiel, das die Behandlung von Verbindungsfehlern beinhaltet:
<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>
In diesem Beispiel wird eine globale Verbindung mithilfe von sync.Once erstellt Typ, um sicherzustellen, dass es nur einmal initialisiert wird. Die Connection.NotifyClose-Methode wird verwendet, um Verbindungsfehler zu überwachen und Verbindungen bei Bedarf wiederherzustellen.
Das obige ist der detaillierte Inhalt vonSollten AMQP-Verbindungen in Go global sein oder für jede Nachricht erstellt werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!