Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Petua dan amalan terbaik untuk menggunakan RabbitMQ untuk melaksanakan pengesahan mesej dan memastikan kebolehpercayaan di Golang

Petua dan amalan terbaik untuk menggunakan RabbitMQ untuk melaksanakan pengesahan mesej dan memastikan kebolehpercayaan di Golang

WBOY
WBOYasal
2023-09-27 10:41:17779semak imbas

Petua dan amalan terbaik untuk menggunakan RabbitMQ untuk melaksanakan pengesahan mesej dan memastikan kebolehpercayaan di Golang

Petua dan amalan terbaik untuk menggunakan RabbitMQ untuk melaksanakan pengesahan dan kebolehpercayaan mesej di Golang

Pengenalan:
RabbitMQ ialah platform broker mesej sumber terbuka yang digunakan secara meluas untuk membina sistem teragih berskala. Ia menggunakan protokol AMQP sebagai protokol penghantaran mesej, menyediakan mekanisme penghantaran mesej yang sangat boleh dipercayai. Apabila menggunakan RabbitMQ, cara memastikan kebolehpercayaan mesej dan mengesahkan mesej dalam situasi tidak normal adalah isu penting.

Artikel ini akan memperkenalkan teknik dan amalan terbaik untuk menggunakan RabbitMQ untuk melaksanakan pengesahan mesej dan memastikan kebolehpercayaan dalam Golang, dan memberikan contoh kod khusus.

  1. Mod Pengakuan
    Mod Pengakuan RabbitMQ (mod Pengakuan) ialah mekanisme yang digunakan untuk memastikan mesej telah digunakan. Di Golang, mod pengesahan boleh didayakan dengan menetapkan mod pengesahan Saluran. Terdapat dua mod pengesahan: mod pengesahan biasa dan mod transaksi.

1.1 Mod pengesahan biasa
Apabila menggunakan mod pengesahan biasa, selepas pengeluar menghantar mesej, ia akan menunggu untuk Broker mengembalikan mesej pengesahan. Jika mesej pengesahan diterima, mesej itu berjaya dihantar ke baris gilir.

Kod contoh:

package main

import (
    "fmt"
    "log"

    "github.com/streadway/amqp"
)

func main() {
    // 连接到RabbitMQ服务器
    conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
    if err != nil {
        log.Fatal(err)
    }
    defer conn.Close()

    // 创建一个Channel
    ch, err := conn.Channel()
    if err != nil {
        log.Fatal(err)
    }
    defer ch.Close()

    // 启用确认模式
    err = ch.Confirm(false)
    if err != nil {
        log.Fatal(err)
    }

    // 发送一条消息
    err = ch.Publish(
        "",
        "hello",
        false,
        false,
        amqp.Publishing{
            ContentType: "text/plain",
            Body:        []byte("Hello, RabbitMQ!"),
        },
    )
    if err != nil {
        log.Fatal(err)
    }

    // 等待消息确认
    confirm := <-ch.NotifyConfirm()
    if confirm.Ack {
        fmt.Println("消息已成功投递到队列中")
    } else {
        fmt.Println("消息投递失败")
    }
}

1.2 Mod Transaksi
Apabila menggunakan mod transaksi, selepas pengeluar menghantar sekumpulan mesej, ia akan menunggu untuk Broker mengembalikan mesej pengesahan transaksi. Jika mesej pengesahan transaksi diterima, ini bermakna mesej telah berjaya dihantar ke baris gilir.

Kod contoh:

package main

import (
    "fmt"
    "log"

    "github.com/streadway/amqp"
)

func main() {
    // 连接到RabbitMQ服务器
    conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
    if err != nil {
        log.Fatal(err)
    }
    defer conn.Close()

    // 创建一个Channel
    ch, err := conn.Channel()
    if err != nil {
        log.Fatal(err)
    }
    defer ch.Close()

    // 启用事务模式
    err = ch.Tx()
    if err != nil {
        log.Fatal(err)
    }

    // 发送一批消息
    err = ch.Publish(
        "",
        "hello",
        false,
        false,
        amqp.Publishing{
            ContentType: "text/plain",
            Body:        []byte("Hello, RabbitMQ!"),
        },
    )
    if err != nil {
        err = ch.TxRollback()
        if err != nil {
            log.Fatal("回滚失败:", err)
        }
        log.Fatal("消息发送失败:", err)
    }

    // 提交事务
    err = ch.TxCommit()
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("消息已成功投递到队列中")
}
  1. Kegigihan
    Untuk memastikan mesej boleh dipulihkan sekiranya berlaku pengecualian, mesej boleh ditetapkan kepada ketekunan. Di Golang, ini boleh dicapai dengan menetapkan Mod Penghantaran mesej kepada 2.

Contoh kod:

package main

import (
    "fmt"
    "log"

    "github.com/streadway/amqp"
)

func main() {
    // 连接到RabbitMQ服务器
    conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
    if err != nil {
        log.Fatal(err)
    }
    defer conn.Close()

    // 创建一个Channel
    ch, err := conn.Channel()
    if err != nil {
        log.Fatal(err)
    }
    defer ch.Close()

    // 发送一条持久化消息
    err = ch.Publish(
        "",
        "hello",
        false,
        false,
        amqp.Publishing{
            ContentType:  "text/plain",
            Body:         []byte("Hello, RabbitMQ!"),
            DeliveryMode: amqp.Persistent,
        },
    )
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("消息已成功投递到队列中")
}
  1. Mod pengesahan pengguna
    Untuk memastikan pengguna berjaya memproses mesej, mod pengesahan pengguna boleh dimulakan di sebelah pengguna. Di Golang, ini boleh dicapai dengan menetapkan AutoAck Saluran kepada palsu dan memanggil kaedah Ack Penghantaran secara manual selepas pengguna memproses mesej.

Contoh kod:

package main

import (
    "fmt"
    "log"

    "github.com/streadway/amqp"
)

func main() {
    // 连接到RabbitMQ服务器
    conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
    if err != nil {
        log.Fatal(err)
    }
    defer conn.Close()

    // 创建一个Channel
    ch, err := conn.Channel()
    if err != nil {
        log.Fatal(err)
    }
    defer ch.Close()

    // 启动消费者确认模式
    err = ch.Qos(
        1,     // 预取数量
        0,     // 预取大小
        false, // 全局设置
    )
    if err != nil {
        log.Fatal(err)
    }

    // 创建一个消费者
    msgs, err := ch.Consume(
        "hello",
        "",
        false, // 禁止自动应答
        false, // 独占队列
        false, // 没有等待
        false, // 没有无效
        nil,   // 参数
    )
    if err != nil {
        log.Fatal(err)
    }

    // 处理消息
    for msg := range msgs {
        fmt.Println("收到消息:", string(msg.Body))

        // 处理完消息后,手动确认
        err = msg.Ack(false)
        if err != nil {
            log.Println(err)
        }
    }
}

Kesimpulan:
Melalui contoh kod di atas, anda boleh melihat petua dan amalan terbaik tentang cara menggunakan RabbitMQ untuk melaksanakan pengesahan mesej dan memastikan kebolehpercayaan di Golang. Contohnya, dengan mendayakan mod pengesahan, menggunakan mesej berterusan dan mod pengesahan pengguna, kebolehpercayaan dan kestabilan penghantaran mesej boleh dipertingkatkan, memastikan mesej boleh dihantar dan diproses dengan selamat.

Perlu diambil perhatian bahawa dalam persekitaran pengeluaran sebenar, ketersediaan tinggi dan mekanisme pengendalian ralat baris gilir mesej juga perlu dipertimbangkan. Aspek-aspek ini berada di luar skop artikel ini dan boleh dikaji dan diterokai dengan lebih lanjut oleh pembaca.

Rujukan:

  • Dokumentasi rasmi RabbitMQ: https://www.rabbitmq.com/documentation.html
  • streadway/amqp: https://github.com/streadway/amqp

Atas ialah kandungan terperinci Petua dan amalan terbaik untuk menggunakan RabbitMQ untuk melaksanakan pengesahan mesej dan memastikan kebolehpercayaan di Golang. 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