Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Golang RabbitMQ: Reka bentuk seni bina dan pelaksanaan sistem baris gilir mesej yang sangat tersedia

Golang RabbitMQ: Reka bentuk seni bina dan pelaksanaan sistem baris gilir mesej yang sangat tersedia

王林
王林asal
2023-09-28 08:18:161370semak imbas

Golang RabbitMQ: 实现高可用的消息队列系统的架构设计和实现

Golang RabbitMQ: Untuk mencapai reka bentuk seni bina dan pelaksanaan sistem baris gilir mesej yang sangat tersedia, contoh kod khusus diperlukan

Pengenalan:
Dengan perkembangan berterusan teknologi Internet dan rangkaian aplikasi yang luas, baris gilir mesej telah menjadi bahagian yang amat diperlukan dalam sistem perisian moden Bahagian yang hilang. Sebagai alat untuk mencapai penyahgandingan, komunikasi tak segerak, pemprosesan toleransi kesalahan dan fungsi lain, baris gilir mesej menyediakan ketersediaan tinggi dan sokongan berskala untuk sistem teragih. Sebagai bahasa pengaturcaraan yang cekap dan ringkas, Golang digunakan secara meluas untuk membina sistem berkonkurensi tinggi dan berprestasi tinggi Gabungannya dengan RabbitMQ boleh memberikan kami penyelesaian baris gilir mesej yang berkuasa.

1. Reka bentuk seni bina:
Apabila membina sistem baris gilir mesej yang tersedia, faktor utama berikut mesti diambil kira:

  1. Ketersediaan tinggi: Memastikan kestabilan sistem dalam menghadapi pelbagai situasi yang tidak normal, walaupun jika Jika satu nod gagal, keseluruhan sistem masih boleh berfungsi seperti biasa.
  2. Prestasi: Keupayaan untuk memproses sebilangan besar mesej, kependaman rendah dan daya pemprosesan yang tinggi adalah penunjuk utama prestasi sistem.
  3. Kegigihan: Pastikan mesej tidak akan hilang Walaupun sistem tidak berfungsi atau gagal, mesej masih boleh dipulihkan.
  4. Skalabiliti: Apabila perniagaan berkembang dan bilangan pengguna bertambah, sistem boleh dikembangkan secara mendatar dengan mudah untuk memenuhi permintaan yang semakin meningkat.

Berdasarkan faktor di atas, reka bentuk seni bina sistem baris gilir mesej yang sangat tersedia seperti berikut:

  1. Gambar rajah seni bina:
         Consumer A                 Consumer B                 Consumer C

         +---------+                 +---------+                 +---------+
         |   App   |   ---------->   |   App   |   ---------->   |   App   |
        /+---------+                 +---------+                 +---------+
       /
      /
     /
   +----+        +------+        +------+
   | P1 | <----> | Node | <----> | Node |
   +----+        +------+        +------+
   | P2 | <----> | Node | <----> | Node |
   +----+        +------+        +------+
   | P3 | <----> | Node | <----> | Node |
   +----+        +------+        +------+

Antaranya, P1, P2, P3 ialah pengeluar, Pengguna A, Pengguna B dan Pengguna Bagi pengguna, App ialah aplikasi perniagaan.
Node ialah nod kluster RabbitMQ yang melaksanakan replikasi mesej dan ketersediaan tinggi melalui baris gilir cermin.

  1. Langkah pelaksanaan:

(1) Pasang RabbitMQ:
Sistem baris gilir mesej yang ditulis dalam Golang perlu memasang RabbitMQ terlebih dahulu. Untuk langkah pemasangan khusus, sila rujuk dokumentasi rasmi RabbitMQ.

(2) Buat pengeluar:

package main

import (
    "fmt"
    "log"

    "github.com/streadway/amqp"
)

func failOnError(err error, msg string) {
    if err != nil {
        log.Fatalf("%s: %s", msg, err)
    }
}

func main() {
    conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
    failOnError(err, "Failed to connect to RabbitMQ")
    defer conn.Close()

    ch, err := conn.Channel()
    failOnError(err, "Failed to open a channel")
    defer ch.Close()

    q, err := ch.QueueDeclare(
        "hello", // 队列名
        false,   // 是否持久化
        false,   // 是否自动删除 when unused
        false,   // 是否独占连接
        false,   // 是否阻塞等待
        nil,     // 额外的属性
    )
    failOnError(err, "Failed to declare a queue")

    body := "Hello RabbitMQ!"
    err = ch.Publish(
        "",     // exchange
        q.Name, // routing key
        false,  // mandatory
        false,  // immediate
        amqp.Publishing{
            ContentType: "text/plain",
            Body:        []byte(body),
        })
    failOnError(err, "Failed to publish a message")

    log.Printf(" [x] Sent %s", body)
}

(3) Buat pengguna:

package main

import (
    "fmt"
    "log"
    "os"
    "os/signal"
    "syscall"

    "github.com/streadway/amqp"
)

func failOnError(err error, msg string) {
    if err != nil {
        log.Fatalf("%s: %s", msg, err)
    }
}

func main() {
    conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
    failOnError(err, "Failed to connect to RabbitMQ")
    defer conn.Close()

    ch, err := conn.Channel()
    failOnError(err, "Failed to open a channel")
    defer ch.Close()

    q, err := ch.QueueDeclare(
        "hello", // 队列名
        false,   // 是否持久化
        false,   // 是否自动删除 when unused
        false,   // 是否独占连接
        false,   // 是否阻塞等待
        nil,     // 额外的属性
    )
    failOnError(err, "Failed to declare a queue")

    msgs, err := ch.Consume(
        q.Name, // 队列名
        "",     // consumer
        true,   // 自动应答
        false,  // 独占连接
        false,  // 阻塞等待时是否自动取消
        false,  // 额外属性
        nil,
    )
    failOnError(err, "Failed to register a consumer")

    forever := make(chan bool)

    go func() {
        for d := range msgs {
            log.Printf("Received a message: %s", d.Body)
        }
    }()

    log.Println(" [*] Waiting for messages. To exit press CTRL+C")
    // Handle SIGINT and SIGTERM.
    sigchan := make(chan os.Signal, 1)
    signal.Notify(sigchan, syscall.SIGINT, syscall.SIGTERM)
    <-sigchan

    <-forever
}

(4) Jalankan kod di atas untuk melaksanakan sistem baris gilir mesej yang sangat tersedia berdasarkan Golang dan RabbitMQ.

Kesimpulan:
Dengan menggabungkan Golang dan RabbitMQ, kami boleh melaksanakan sistem baris gilir mesej yang sangat tersedia. Program pengeluar dan pengguna yang ditulis dalam Golang boleh mencapai komunikasi tak segerak, penyahgandingan dan mengurangkan kebergantungan antara sistem melalui RabbitMQ. Melalui reka bentuk seni bina yang munasabah dan contoh kod pelaksanaan, kami boleh membina sistem baris gilir mesej dengan cekap, prestasi dan kebolehskalaan yang tinggi, memberikan sokongan penting untuk pembinaan dan aplikasi sistem teragih.

Atas ialah kandungan terperinci Golang RabbitMQ: Reka bentuk seni bina dan pelaksanaan sistem baris gilir mesej yang sangat tersedia. 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