首頁 >後端開發 >Golang >amqp.Dial 在 Go 中建立連線是線程安全的嗎?關於全域連線與依請求連線的爭論。

amqp.Dial 在 Go 中建立連線是線程安全的嗎?關於全域連線與依請求連線的爭論。

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-28 12:23:02446瀏覽

 Is amqp.Dial Thread-Safe for Connection Creation in Go? A Debate on Global vs. Per-Request Connections.

amqp 的執行緒安全性。在 Go Lang 中撥號以建立連線

為 AMQP 建立 TCP 連線可能是一項昂貴的操作。為了解決這個問題,引入了管道。然而,關於是否每次都建立連接還是全域聲明一次的問題已經出現。

問題:

最近在 main() 函數中的範例Go 應用程式示範了每次發布訊息時連接的建立。這種方法提出了一個問題:在連接關閉的情況下,使用具有故障轉移機制的全域聲明的連接是否更合適,特別是考慮到 amqp.Dial 假定的線程安全性質。

答案:

不建議為每個請求建立連線。相反,請考慮使連接成為全域變數或僅在啟動時初始化一次的應用程式上下文的一部分。

為了處理連線錯誤,可以使用 amqp.Connection.NotifyClose 註冊一個通道來監視連線狀態。當發生錯誤時,可以使用重新連線功能重新建立連線。

範例:

<code class="go">import (
    "github.com/streadway/amqp"
)

func initialize() {
    c := make(chan *amqp.Error)
    go func() {
        err := <-c
        log.Println("reconnect: " + err.Error())
        initialize()
    }()

    conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
    if err != nil {
        panic("cannot connect")
    }
    conn.NotifyClose(c)

    // create topology
}</code>

以上是amqp.Dial 在 Go 中建立連線是線程安全的嗎?關於全域連線與依請求連線的爭論。的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn