Maison développement back-end Golang Utiliser RabbitMQ dans Go : un guide complet

Utiliser RabbitMQ dans Go : un guide complet

Jun 19, 2023 am 08:10 AM
go语言 指南 rabbitmq

À mesure que les applications modernes deviennent de plus en plus complexes, la messagerie est devenue un outil puissant. Dans ce domaine, RabbitMQ est devenu un courtier de messages très populaire qui peut être utilisé pour transmettre des messages entre différentes applications.

Dans cet article, nous explorerons comment utiliser RabbitMQ en langage Go. Ce guide couvrira les éléments suivants :

  • Introduction à RabbitMQ
  • Installation de RabbitMQ
  • Concepts de base de RabbitMQ
  • #🎜🎜 # Premiers pas avec RabbitMQ en langage Go
  • Utilisation avancée de RabbitMQ et du langage Go
Introduction à RabbitMQ

RabbitMQ est un open source message source Middleware proxy. Il s'agit d'un courtier fiable, hautement disponible, évolutif et facile à utiliser qui vous aide à gérer facilement la messagerie entre les applications.

RabbitMQ prend en charge plusieurs protocoles de messagerie tels que AMQP, MQTT et STOMP. Il possède également de nombreuses fonctionnalités avancées telles que la distribution des messages, la persistance des messages, l'accusé de réception des messages et la mise en file d'attente des messages.

Installation de RabbitMQ

Avant d'utiliser RabbitMQ, vous devez l'installer à l'aide de la commande suivante :

$ sudo apt-get install rabbitmq-server
Copier après la connexion

Vous pouvez également installer RabbitMQ en tant que conteneur Docker . Pour plus d’informations, veuillez visiter le site officiel.

Concepts de base de RabbitMQ

Avant de commencer à utiliser RabbitMQ, comprenons quelques concepts de base.

    Producteur : Une application qui envoie des messages.
  • Message Queue (Queue) : Un conteneur utilisé par RabbitMQ pour stocker les messages.
  • Consumer : Une application qui reçoit des messages.
  • Exchange : Le composant utilisé par RabbitMQ pour recevoir et acheminer les messages.
  • Binding : Le processus d'association de commutateurs et de files d'attente.
  • Clé de routage : une chaîne utilisée pour acheminer les messages vers les files d'attente correspondantes.
  • Modèle de message : règles qui spécifient la manière dont les messages sont acheminés, notamment Direct, Fanout, Topic et Headers.
Démarrer avec RabbitMQ en langage Go

Écrivons un simple producteur et consommateur RabbitMQ en utilisant le langage Go.

Tout d'abord, vous devez installer le client RabbitMQ du langage Go :

$ go get github.com/streadway/amqp
Copier après la connexion

Ensuite, nous utiliserons le code suivant en tant que simple producteur de RabbitMQ :

package main

import (
    "log"

    "github.com/streadway/amqp"
)

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

    // 建立通道
    ch, err := conn.Channel()
    if err != nil {
        log.Fatalf("Failed to open a channel: %v", err)
    }
    defer ch.Close()

    // 声明一个队列
    q, err := ch.QueueDeclare(
        "hello", // 队列名称
        false,  // 是否持久化
        false,  // 是否自动删除
        false,  // 是否具有排他性
        false,  // 是否阻塞处理
        nil,    // 额外的参数
    )
    if err != nil {
        log.Fatalf("Failed to declare a queue: %v", err)
    }

    // 发送两条消息
    for _, body := range []string{"Hello", "World"} {
        err = ch.Publish(
            "",    // 交换机名称
            q.Name,  // 队列名称
            false, // 是否强制遵循新的基于名称的路由规则
            false, // 是否立即将消息传递给消费者
            amqp.Publishing{
                ContentType: "text/plain",
                Body:        []byte(body),
            },
        )
        if err != nil {
            log.Fatalf("Failed to publish a message: %v", err)
        }
        log.Printf("Sent a message: %v", body)
    }
}
Copier après la connexion
# 🎜🎜#Dans cet exemple, nous nous connectons à la file d'attente nommée "hello" et utilisons une boucle for pour envoyer deux messages à la file d'attente. Chaque message est une simple chaîne enveloppée dans une structure de publication. La méthode ch.Publish() est utilisée pour publier des messages dans la file d'attente.

Maintenant, créons un consommateur pour recevoir ces messages : ch.Publish()方法用于将消息发布到队列。

现在,让我们创建一个消费者来接收这些消息:

package main

import (
    "log"

    "github.com/streadway/amqp"
)

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

    // 建立通道
    ch, err := conn.Channel()
    if err != nil {
        log.Fatalf("Failed to open a channel: %v", err)
    }
    defer ch.Close()

    // 声明一个队列
    q, err := ch.QueueDeclare(
        "hello", // 队列名称
        false,  // 是否持久化
        false,  // 是否自动删除
        false,  // 是否具有排他性
        false,  // 是否阻塞处理
        nil,    // 额外的参数
    )
    if err != nil {
        log.Fatalf("Failed to declare a queue: %v", err)
    }

    // 将通道设置为接收模式
    msgs, err := ch.Consume(
        q.Name, // 队列名称
        "",     // 消费者名称
        true,   // 自动确认消息
        false,  // 是否具有排他性
        false,  // 是否阻塞处理
        false,  // 额外参数
    )
    if err != nil {
        log.Fatalf("Failed to register a consumer: %v", err)
    }

    // 使用通道消费消息
    forever := make(chan bool)

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

    log.Printf("Waiting for messages...")

    <-forever
}
Copier après la connexion

在这个消费者例子中,我们从名为“hello”的队列中拉取消息,然后对消息进行回显。在这个例子中,我们使用通道的ch.Consume()方法从队列中消费消息。

RabbitMQ和Go语言的高级用法

在本部分中,我们将探讨RabbitMQ和Go语言的高级用法。

首先,让我们探讨如何使用RabbitMQ和Go语言实现消息确认。消息确认通常用于确保消息已被正确处理。

首先,我们需要在消费者端打开确认模式:

msgs, err := ch.Consume(
    q.Name, // 队列名称
    "",     // 消费者名称
    false,  // 自动确认消息
    false,  // 是否具有排他性
    false,  // 是否阻塞处理
    false,  // 额外参数
)
Copier après la connexion

在手动确认模式下,我们需要在消费者端明确地确认每一条消息:

for d := range msgs {
    log.Printf("Received a message: %v", string(d.Body))

    // 确认消息
    d.Ack(false)
}
Copier après la connexion

我们还可以使用RabbitMQ的RPC模式来实现分布式RPC调用。在RPC模式下,客户端应用程序将请求发送到RabbitMQ,RabbitMQ将请求转发给适当的服务器,服务器将处理请求并返回响应。

首先,我们需要声明一个交换机来接收RPC请求:

ch, err := conn.Channel()
if err != nil {
    log.Fatalf("Failed to open a channel: %v", err)
}
defer ch.Close()

// 声明一个Direct类型的交换机
err = ch.ExchangeDeclare(
    "rpc_exchange", // 交换机名称
    "direct",       // 交换机类型
    true,           // 是否持久化
    false,          // 是否自动删除
    false,          // 是否具有排他性
    false,          // 是否阻塞处理
    nil,            // 额外参数
)
if err != nil {
    log.Fatalf("Failed to declare a exchange: %v", err)
}

// 声明一个接收RPC请求的队列
q, err := ch.QueueDeclare("", false, false, true, false, nil)
if err != nil {
    log.Fatalf("Failed to declare a queue: %v", err)
}

// 将队列绑定到交换机
err = ch.QueueBind(
    q.Name,         // 队列名称
    "rpc_routing",  // 路由键
    "rpc_exchange", // 交换机名称
    false,          // 是否强制遵循新的基于名称的路由规则
    nil,            // 额外参数
)
if err != nil {
    log.Fatalf("Failed to bind a queue: %v", err)
}
Copier après la connexion

接下来,我们将创建一个函数来处理RPC请求:

func rpcHandler(body []byte) []byte {
    log.Printf("Received RPC request: %s", string(body))

    // 处理请求
    result := []byte("Hello, World!")

    return result
}
Copier après la connexion

然后,我们需要编写一个消费者来接收RPC请求:

msg, ok, err := ch.Get(q.Name, true)
if err != nil {
    log.Fatalf("Failed to handle RPC request: %v", err)
}

if !ok {
    log.Printf("No messages available")
    return
}

// 处理RPC请求
response := rpcHandler(msg.Body)

// 发送RPC响应
err = ch.Publish(
    "",              // 交换机名称
    msg.ReplyTo,     // 回调队列名称
    false,           // 是否强制遵循新的基于名称的路由规则
    false,           // 是否立即将消息传递给消费者
    amqp.Publishing{ // 发布消息
        ContentType: "text/plain",
        CorrelationId: msg.CorrelationId,
        Body:        response,
    },
)
if err != nil {
    log.Fatalf("Failed to publish a message: %v", err)
}

log.Printf("Sent RPC response: %v", string(response))
Copier après la connexion

在这个例子中,我们使用ch.Get()方法从队列中拉取消息,并将其发送给rpcHandler()方法进行处理。一旦处理完成,我们使用ch.Publish()rrreee

Dans cet exemple de consommateur, nous extrayons les messages de la file d'attente nommé "hello" , puis faisons écho au message. Dans cet exemple, nous consommons les messages de la file d'attente en utilisant la méthode ch.Consume() du canal.

Utilisation avancée du langage RabbitMQ et Go

Dans cette section, nous explorerons l'utilisation avancée du langage RabbitMQ et Go. #🎜🎜##🎜🎜#Tout d'abord, explorons comment utiliser le langage RabbitMQ et Go pour implémenter la confirmation des messages. Les accusés de réception de messages sont généralement utilisés pour garantir que les messages ont été traités correctement. #🎜🎜##🎜🎜#Tout d'abord, nous devons activer le mode de confirmation côté consommateur : #🎜🎜#rrreee#🎜🎜#En mode de confirmation manuelle, nous devons confirmer explicitement chaque message côté consommateur : # 🎜 🎜#rrreee#🎜🎜#Nous pouvons également utiliser le mode RPC de RabbitMQ pour implémenter des appels RPC distribués. En mode RPC, l'application client envoie une requête à RabbitMQ, RabbitMQ transmet la requête au serveur approprié, et le serveur traite la requête et renvoie une réponse. #🎜🎜##🎜🎜#Tout d'abord, nous devons déclarer un switch pour recevoir les requêtes RPC : #🎜🎜#rrreee#🎜🎜#Ensuite, nous allons créer une fonction pour gérer les requêtes RPC : #🎜🎜#rrreee#🎜🎜 #Ensuite, nous devons écrire un consommateur pour recevoir les requêtes RPC : #🎜🎜#rrreee#🎜🎜#Dans cet exemple, nous utilisons la méthode ch.Get() pour extraire les messages de la file d'attente, Et envoyez-le à la méthode rpcHandler() pour traitement. Une fois le traitement terminé, nous renvoyons la réponse au client en utilisant la méthode ch.Publish(). #🎜🎜##🎜🎜#Conclusion#🎜🎜##🎜🎜#RabbitMQ est un outil puissant qui vous aide à gérer facilement la messagerie entre applications. Dans ce guide, nous couvrons les bases et l'utilisation avancée de RabbitMQ dans Go. Vous pouvez désormais appliquer ces connaissances à vos propres projets pour une messagerie efficace avec RabbitMQ ! #🎜🎜#

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 de ce site Web
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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Vous avez un jeu croisé?
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Quelles bibliothèques sont utilisées pour les opérations du numéro de point flottantes en Go? Quelles bibliothèques sont utilisées pour les opérations du numéro de point flottantes en Go? Apr 02, 2025 pm 02:06 PM

La bibliothèque utilisée pour le fonctionnement du numéro de point flottante dans le langage go présente comment s'assurer que la précision est ...

Quel est le problème avec le fil de file d'attente dans GO's Crawler Colly? Quel est le problème avec le fil de file d'attente dans GO's Crawler Colly? Apr 02, 2025 pm 02:09 PM

Problème de threading de file d'attente dans Go Crawler Colly explore le problème de l'utilisation de la bibliothèque Crawler Crawler dans le langage Go, les développeurs rencontrent souvent des problèmes avec les threads et les files d'attente de demande. � ...

Dans Go, pourquoi les chaînes d'impression avec println et string () ont-elles des effets différents? Dans Go, pourquoi les chaînes d'impression avec println et string () ont-elles des effets différents? Apr 02, 2025 pm 02:03 PM

La différence entre l'impression de chaîne dans le langage go: la différence dans l'effet de l'utilisation de fonctions println et string () est en Go ...

Comment résoudre le problème de conversion de type user_id lors de l'utilisation du flux redis pour implémenter les files d'attente de messages dans le langage Go? Comment résoudre le problème de conversion de type user_id lors de l'utilisation du flux redis pour implémenter les files d'attente de messages dans le langage Go? Apr 02, 2025 pm 04:54 PM

Le problème de l'utilisation de Redessstream pour implémenter les files d'attente de messages dans le langage GO consiste à utiliser le langage GO et redis ...

Que dois-je faire si les étiquettes de structure personnalisées à Goland ne sont pas affichées? Que dois-je faire si les étiquettes de structure personnalisées à Goland ne sont pas affichées? Apr 02, 2025 pm 05:09 PM

Que dois-je faire si les étiquettes de structure personnalisées à Goland ne sont pas affichées? Lorsque vous utilisez Goland pour le développement du langage GO, de nombreux développeurs rencontreront des balises de structure personnalisées ...

Quelles bibliothèques de GO sont développées par de grandes entreprises ou fournies par des projets open source bien connus? Quelles bibliothèques de GO sont développées par de grandes entreprises ou fournies par des projets open source bien connus? Apr 02, 2025 pm 04:12 PM

Quelles bibliothèques de GO sont développées par de grandes entreprises ou des projets open source bien connus? Lors de la programmation en Go, les développeurs rencontrent souvent des besoins communs, ...

Quelle est la différence entre la structure de définition des mots clés `var` et« type »dans le langage Go? Quelle est la différence entre la structure de définition des mots clés `var` et« type »dans le langage Go? Apr 02, 2025 pm 12:57 PM

Deux façons de définir les structures dans le langage GO: la différence entre les mots clés VAR et le type. Lorsque vous définissez des structures, GO Language voit souvent deux façons d'écrire différentes: d'abord ...

Lorsque vous utilisez SQL.Open, pourquoi ne signale pas une erreur lorsque DSN passe vide? Lorsque vous utilisez SQL.Open, pourquoi ne signale pas une erreur lorsque DSN passe vide? Apr 02, 2025 pm 12:54 PM

Lorsque vous utilisez SQL.Open, pourquoi le DSN ne signale-t-il pas une erreur? En langue go, sql.open ...

See all articles