Teknik penalaan prestasi untuk menggunakan RabbitMQ untuk melaksanakan baris gilir tugas yang diedarkan di Golang

PHPz
Lepaskan: 2023-09-27 20:15:35
asal
1402 orang telah melayarinya

Teknik penalaan prestasi untuk menggunakan RabbitMQ untuk melaksanakan baris gilir tugas yang diedarkan di Golang

Petua penalaan prestasi untuk menggunakan RabbitMQ untuk melaksanakan baris gilir tugas yang diedarkan di Golang

Pengenalan:
Dalam pembangunan aplikasi teragih moden, baris gilir tugas adalah corak seni bina yang sangat biasa. Ia boleh memisahkan tugas dan memprosesnya secara tidak segerak, meningkatkan keselarasan dan kebolehskalaan sistem. Sebagai perisian tengah baris gilir mesej berprestasi tinggi, RabbitMQ sering digunakan untuk membina baris gilir tugas yang diedarkan. Artikel ini akan memperkenalkan cara menggunakan RabbitMQ di Golang untuk melaksanakan baris gilir tugas yang diedarkan dan menyediakan beberapa petua penalaan prestasi.

1. Konfigurasi persekitaran dan pergantungan
Sebelum mula menggunakan RabbitMQ, kami perlu memastikan bahawa perkhidmatan RabbitMQ telah dipasang dan dikonfigurasikan, dan memperkenalkan pakej pergantungan yang sepadan ke dalam projek Golang. Anda boleh menggunakan arahan berikut untuk memasang klien Go rasmi RabbitMQ.

go get github.com/streadway/amqp
Salin selepas log masuk

2 Sambung ke perkhidmatan RabbitMQ
Gunakan kod berikut untuk menyambung ke perkhidmatan RabbitMQ dan buat saluran.

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

    // ...
}
Salin selepas log masuk

3 Hantar tugasan
Gunakan kod berikut untuk menghantar tugasan kepada RabbitMQ.

func main() {
    // ...
    q, err := ch.QueueDeclare(
        "task_queue", // 队列名称
        true,         // durable
        false,        // delete when unused
        false,        // exclusive
        false,        // no-wait
        nil,          // arguments
    )
    failOnError(err, "Failed to declare a queue")

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

    // ...
}
Salin selepas log masuk

4. Terima tugasan
Gunakan kod berikut untuk menerima tugasan daripada RabbitMQ.

func main() {
    // ...
    msgs, err := ch.Consume(
        q.Name, // queue
        "",     // consumer
        false,  // auto-ack
        false,  // exclusive
        false,  // no-local
        false,  // no-wait
        nil,    // args
    )
    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)
            // 处理任务的逻辑
            d.Ack(false)
        }
    }()

    log.Printf(" [*] Waiting for messages. To exit press CTRL+C")
    <-forever
    
    // ...
}
Salin selepas log masuk

5. Petua penalaan prestasi

  1. Had prefetch: Gunakan kaedah ch.Qos untuk menetapkan had prefetch saluran untuk mengawal bilangan mesej yang boleh diperoleh oleh pengguna pada satu masa dan elakkan mendapatkan kesemuanya serentak Terlalu banyak mesej menyebabkan beban sistem yang berlebihan. ch.Qos方法设置通道的预取限制,以控制消费者一次能获取的消息数量,避免一次性获取过多的消息导致系统负载过高。
err = ch.Qos(
    1,     // prefetch count
    0,     // prefetch size
    false, // global
)
failOnError(err, "Failed to set QoS")
Salin selepas log masuk
  1. 消费者并发:使用多个并发的消费者来处理任务,以提高任务处理的并发能力和吞吐量。可以使用Golang的goroutine来实现。
for i := 0; i < 10; i++ {
    go func() {
        for d := range msgs {
            log.Printf("Received a message: %s", d.Body)
            // 处理任务的逻辑
            d.Ack(false)
        }
    }()
}
Salin selepas log masuk
  1. 持久化和防止消息丢失:在声明队列时,将durable参数设置为true,以确保队列的消息持久化存储。并在发布消息时,将deliveryMode设置为amqp.Persistent,以确保消息的持久化。此外,可以通过设置mandatory
  2. q, err := ch.QueueDeclare(
        "task_queue",
        true,  // durable
        false,
        false,
        false,
        nil,
    )
    failOnError(err, "Failed to declare a queue")
    
    // ...
    
    err = ch.Publish(
        "",     // exchange
        q.Name, // routing key
        false,  // mandatory
        false,  // immediate
        amqp.Publishing{
            DeliveryMode: amqp.Persistent,  // 持久化
            ContentType:  "text/plain",
            Body:         []byte(body),
        }
    )
    failOnError(err, "Failed to publish a message")
    Salin selepas log masuk
      Konkurensi pengguna: Gunakan berbilang pengguna serentak untuk memproses tugasan untuk meningkatkan keselarasan dan pemprosesan tugasan. Ini boleh dicapai menggunakan goroutine Golang.


      rrreee

        Kegigihan dan mencegah kehilangan mesej: Apabila mengisytiharkan baris gilir, tetapkan parameter tahan lama kepada true untuk memastikan mesej baris gilir itu Berterusan penyimpanan. Dan apabila menerbitkan mesej, tetapkan deliveryMode kepada amqp.Persistent untuk memastikan kegigihan mesej. Selain itu, anda boleh mengendalikan mesej yang tidak boleh dihalakan dengan menetapkan parameter mandatori dan menambah mekanisme pengendalian ralat. 🎜🎜rrreee🎜Kesimpulan: 🎜Melalui langkah di atas, kita boleh dengan mudah melaksanakan baris gilir tugasan berprestasi tinggi di Golang menggunakan RabbitMQ. Melalui konfigurasi dan penalaan yang betul, kami boleh meningkatkan keselarasan dan kebolehskalaan sistem dan memastikan bahawa tugasan boleh diproses dengan selamat dan boleh dipercayai. Saya harap artikel ini akan membantu anda dan membantu anda menggunakan RabbitMQ dengan lebih baik untuk membina aplikasi teragih berprestasi tinggi. 🎜

      Atas ialah kandungan terperinci Teknik penalaan prestasi untuk menggunakan RabbitMQ untuk melaksanakan baris gilir tugas yang diedarkan di Golang. 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
    Tentang kita Penafian Sitemap
    Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!