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!