Maison  >  Article  >  développement back-end  >  Conseils et bonnes pratiques pour utiliser RabbitMQ pour implémenter la confirmation des messages et garantir la fiabilité dans Golang

Conseils et bonnes pratiques pour utiliser RabbitMQ pour implémenter la confirmation des messages et garantir la fiabilité dans Golang

WBOY
WBOYoriginal
2023-09-27 10:41:17844parcourir

Conseils et bonnes pratiques pour utiliser RabbitMQ pour implémenter la confirmation des messages et garantir la fiabilité dans Golang

Conseils et bonnes pratiques pour utiliser RabbitMQ pour implémenter la confirmation et la fiabilité des messages dans Golang

Introduction :
RabbitMQ est une plateforme de courtage de messages open source largement utilisée pour créer des systèmes distribués évolutifs. Il utilise le protocole AMQP comme protocole de transmission de messages, fournissant un mécanisme de transmission de messages hautement fiable. Lors de l'utilisation de RabbitMQ, comment garantir la fiabilité des messages et confirmer les messages dans des situations anormales est une question importante.

Cet article présentera les techniques et les meilleures pratiques d'utilisation de RabbitMQ pour implémenter la confirmation des messages et garantir la fiabilité dans Golang, et fournira des exemples de code spécifiques.

  1. Mode d'accusé de réception
    Le mode d'accusé de réception de RabbitMQ (mode d'accusé de réception) est un mécanisme utilisé pour garantir que les messages ont été consommés. Dans Golang, le mode de confirmation peut être activé en définissant le mode de confirmation du canal. Il existe deux modes de confirmation : le mode de confirmation normal et le mode transaction.

1.1 Mode de confirmation normal
Lors de l'utilisation du mode de confirmation normal, après que le producteur ait envoyé un message, il attendra que le courtier renvoie un message de confirmation. Si un message de confirmation est reçu, le message a été remis avec succès dans la file d'attente.

Exemple de code :

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 Mode transaction
Lors de l'utilisation du mode transaction, après que le producteur ait envoyé un lot de messages, il attendra que le courtier renvoie un message de confirmation de transaction. Si un message de confirmation de transaction est reçu, cela signifie que le message a été remis avec succès dans la file d'attente.

Exemple de code :

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. Persistance
    Afin de garantir que le message puisse être récupéré en cas d'exception, le message peut être défini sur persistance. Dans Golang, cela peut être réalisé en définissant le DeliveryMode du message sur 2.

Exemple de code :

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. Mode de confirmation du consommateur
    Afin de garantir que le consommateur traite avec succès le message, le mode de confirmation du consommateur peut être démarré du côté du consommateur. Dans Golang, cela peut être réalisé en définissant AutoAck de Channel sur false et en appelant manuellement la méthode Ack de Delivery une fois que le consommateur a traité le message.

Exemple de code :

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

Conclusion :
Grâce aux exemples de code ci-dessus, vous pouvez voir les conseils et les meilleures pratiques sur la façon d'utiliser RabbitMQ pour implémenter la confirmation des messages et garantir la fiabilité dans Golang. Par exemple, en activant le mode de confirmation, en utilisant des messages persistants et le mode de confirmation du consommateur, la fiabilité et la stabilité de la transmission des messages peuvent être améliorées, garantissant ainsi que les messages peuvent être transmis et traités en toute sécurité.

Il convient de noter que dans l'environnement de production actuel, la haute disponibilité et le mécanisme de gestion des erreurs de la file d'attente des messages doivent également être pris en compte. Ces aspects dépassent le cadre de cet article et peuvent être étudiés et explorés plus en détail par le lecteur.

Références :

  • Documentation officielle de RabbitMQ : https://www.rabbitmq.com/documentation.html
  • streadway/amqp : https://github.com/streadway/amqp

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn