Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Patutkah Sambungan AMQP dalam Go bersifat Global atau Dicipta untuk Setiap Mesej?

Patutkah Sambungan AMQP dalam Go bersifat Global atau Dicipta untuk Setiap Mesej?

Patricia Arquette
Patricia Arquetteasal
2024-10-28 08:51:29622semak imbas

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

Mengurus Sambungan dalam Dail AMQP

Dalam Go, fungsi amqp.Dial digunakan untuk mewujudkan sambungan ke pelayan AMQP. Walau bagaimanapun, terdapat kebimbangan sama ada fungsi amqp.Dial perlu digunakan setiap kali semasa menghantar mesej atau jika ia boleh diisytiharkan secara global dan digunakan semula untuk berbilang operasi.

Pengurusan Sambungan Global

Seperti yang dinyatakan dalam dokumentasi rasmi, sambungan TCP boleh memerlukan sumber yang intensif untuk diwujudkan. Untuk mengoptimumkan prestasi, konsep saluran telah diperkenalkan dalam AMQP, membenarkan berbilang saluran dibuat melalui satu sambungan.

Oleh itu, secara umumnya disyorkan untuk mencipta sambungan AMQP sekali sahaja, sebagai pembolehubah global, dan gunakan semula untuk semua operasi seterusnya. Ini mengurangkan overhed yang dikaitkan dengan mewujudkan sambungan baharu setiap kali.

Keselamatan Benang

Fungsi amqp.Dial adalah selamat untuk benang dan boleh digunakan serentak daripada berbilang goroutin. Ini membolehkan penciptaan berbilang sambungan, jika perlu, tanpa sebarang syarat perlumbaan.

Pengendalian Kegagalan Sambungan

Untuk mengendalikan kegagalan sambungan dengan anggun, anda boleh menggunakan Sambungan. Kaedah NotifyClose untuk mendaftarkan saluran untuk menerima pemberitahuan apabila sambungan ditutup. Ini membolehkan anda mengesan dan menyambung semula seperti yang diperlukan.

Dalam contoh yang diberikan, kod mendengar pada saluran dan cuba mewujudkan semula sambungan sekiranya berlaku ralat. Walau bagaimanapun, ralat berlaku apabila mematikan sambungan sedia ada dan cuba menerbitkan mesej. Ini mungkin disebabkan saluran sedia ada masih memegang rujukan kepada sambungan tertutup.

Untuk menyelesaikan isu ini, anda juga harus menutup mana-mana saluran aktif semasa mewujudkan semula sambungan untuk mengelakkan tingkah laku yang tidak dijangka.

Contoh dengan Pengendalian Ralat

Berikut ialah contoh yang menggabungkan pengendalian kegagalan sambungan:

<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>

Dalam contoh ini, sambungan global dibuat menggunakan penyegerakan. Sekali taip untuk memastikan ia dimulakan sekali sahaja. Kaedah Connection.NotifyClose digunakan untuk memantau kegagalan sambungan dan mewujudkan semula sambungan mengikut keperluan.

Atas ialah kandungan terperinci Patutkah Sambungan AMQP dalam Go bersifat Global atau Dicipta untuk Setiap Mesej?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn