Rumah > pembangunan bahagian belakang > Golang > Bina sistem baris gilir mesej yang sangat tersedia menggunakan bahasa Go

Bina sistem baris gilir mesej yang sangat tersedia menggunakan bahasa Go

WBOY
Lepaskan: 2023-06-18 09:31:29
asal
1282 orang telah melayarinya

Dengan seni bina IT moden, komunikasi dan penyelarasan antara pelbagai komponen menjadi semakin penting. Sistem baris gilir mesej telah menjadi salah satu kemudahan penting apabila aplikasi perlu menghantar mesej kepada aplikasi atau pemproses lain. Go ialah bahasa pengaturcaraan yang semakin popular, dan prestasi cekap serta sifat keselarasannya menjadikannya alat yang ideal untuk membangunkan sistem baris gilir mesej yang tersedia.

Artikel ini akan memperkenalkan cara menggunakan bahasa Go untuk membina sistem baris gilir mesej yang sangat tersedia, dan membincangkan amalan terbaik untuk mencapai ketersediaan tinggi.

Pengenalan kepada Sistem Gilir Mesej

Sebelum menulis sistem baris gilir mesej yang sangat tersedia, anda perlu terlebih dahulu memahami apa itu sistem baris gilir mesej. Sistem baris gilir mesej biasanya terdiri daripada komponen berikut:

  • Pertukaran
  • Baris gilir
  • Pengeluar
  • Pengguna

Dalam sistem baris gilir mesej, pengeluar menghantar mesej kepada pertukaran, yang kemudiannya mengarahkan mesej ke satu atau lebih baris gilir, membolehkan pengguna menarik keluar dari baris gilir Menghantar mesej dan memprosesnya. Dalam aplikasi dunia sebenar, sistem baris gilir mesej boleh digunakan untuk komunikasi dan penyelarasan merentas aplikasi atau merentas perkhidmatan.

Gunakan bahasa Go untuk melaksanakan sistem baris gilir mesej

Yang berikut akan memperkenalkan cara menggunakan bahasa Go untuk melaksanakan sistem baris gilir mesej asas.

Mula-mula buat dua program Go: producer.go dan consumer.go. Program producer.go menghantar mesej ke baris gilir mesej, dan program consumer.go menggunakan mesej ini.

Dalam producer.go, anda perlu mengimport beberapa pakej yang diperlukan terlebih dahulu:

import (
    "log"
    "github.com/streadway/amqp"
)
Salin selepas log masuk

Kemudian, buat sambungan ke pelayan RabbitMQ:

conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
defer conn.Close()
if err != nil {
    log.Fatal(err)
}
Salin selepas log masuk
Salin selepas log masuk

Seterusnya, buat saluran dan Isytihar pertukaran:

ch, err := conn.Channel()
defer ch.Close()

err = ch.ExchangeDeclare(
    "my-exchange",  // exchange name
    "fanout",       // exchange type
    true,           // durable
    false,          // auto-deleted
    false,          // internal
    false,          // no-wait
    nil,            // arguments
)
if err != nil {
    log.Fatal(err)
}
Salin selepas log masuk

Akhir sekali, terbitkan mesej ke bursa:

for i := 1; i <= 10; i++ {
    message := fmt.Sprintf("Message %d", i)
    err = ch.Publish(
        "my-exchange", // exchange
        "",           // routing key
        false,        // mandatory
        false,        // immediate
        amqp.Publishing{
            ContentType: "text/plain",
            Body:        []byte(message),
        })
    if err != nil {
        log.Fatal(err)
    }
    log.Printf("Sent message: %s", message)
}
Salin selepas log masuk

Dalam consumer.go, wujudkan sambungan ke pelayan RabbitMQ:

conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
defer conn.Close()
if err != nil {
    log.Fatal(err)
}
Salin selepas log masuk
Salin selepas log masuk

Kemudian, buat saluran dan mengisytiharkan baris gilir:

ch, err := conn.Channel()
defer ch.Close()

q, err := ch.QueueDeclare(
    "my-queue", // queue name
    true,      // durable
    false,     // delete when unused
    false,     // exclusive
    false,     // no-wait
    nil,       // arguments
)
if err != nil {
    log.Fatal(err)
}
Salin selepas log masuk

Akhir sekali, tarik mesej daripada baris gilir:

msgs, err := ch.Consume(
    q.Name, // queue name
    "",     // consumer name
    true,   // auto-ack
    false,  // exclusive
    false,  // no-local
    false,  // no-wait
    nil,    // arguments
)
if err != nil {
    log.Fatal(err)
}

for d := range msgs {
    log.Printf("Received message: %s", d.Body)
}
Salin selepas log masuk

Ini ialah sistem baris gilir mesej asas, tetapi ia tidak begitu tersedia.

Mencapai Ketersediaan Tinggi

Sekarang kami memahami cara membina sistem baris gilir mesej asas, kami akan meneroka amalan terbaik untuk mencapai ketersediaan tinggi.

  1. Kluster

Pertama, untuk mencapai ketersediaan tinggi, kami perlu menggunakan sistem baris gilir mesej kami dalam kelompok. Ini akan memastikan bahawa jika nod gagal, kami masih boleh meneruskan pemprosesan mesej.

  1. Sandaran Mesej

Untuk mengelakkan kehilangan mesej penting, kami perlu membuat sandaran mesej. Ini boleh dicapai dengan menyimpan mesej merentasi berbilang nod atau sistem fail yang diedarkan.

  1. Pemulihan kegagalan

Pemulihan kegagalan ialah salah satu bahagian terpenting untuk mencapai ketersediaan yang tinggi. Apabila nod gagal, kita perlu memastikan bahawa sistem baris gilir mesej boleh bertukar secara automatik ke nod lain dan meneruskan pemprosesan mesej. Ini boleh dicapai dengan menggunakan perkhidmatan penyelarasan yang diedarkan seperti ZooKeeper.

  1. Pengimbangan Beban

Jika sistem baris gilir mesej kami terjejas oleh beban yang tinggi, kami perlu memastikan ia boleh berskala untuk menyokong beban yang lebih besar. Ini boleh dicapai dengan menambahkan nod pengguna, atau dengan menggunakan pengimbang beban untuk mengagihkan beban merentas berbilang nod.

Ringkasan

Dalam artikel ini, kami memperkenalkan cara membina sistem baris gilir mesej asas menggunakan bahasa Go dan meneroka amalan terbaik untuk mencapai ketersediaan tinggi. Dengan melaksanakan amalan terbaik ini, kami boleh memastikan sistem baris gilir mesej kami sentiasa tersedia dan mampu mengendalikan aplikasi beban tinggi.

Atas ialah kandungan terperinci Bina sistem baris gilir mesej yang sangat tersedia menggunakan bahasa Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan