讲师中心 微信公众号
AI工具推荐 视频效率加速

快速入门:使用Go语言操作RabbitMQ队列

风丽小哥_5742

风丽小哥_5742

发布时间:2025-07-07 12:14:24

|

788人浏览过

|

来源于php中文网

原创

如何在go语言中操作rabbitmq队列?1. 建立连接:使用amqp.dial函数并传入正确的连接字符串,通过go get github.com/rabbitmq/amqp091-go安装依赖库;2. 声明队列:通过conn.channel()创建通道后,使用ch.queuedeclare声明队列,并设置名称、持久化、自动删除等参数;3. 发送消息:调用ch.publishwithcontext函数,指定交换机、路由键和消息内容,建议设置上下文超时时间;4. 接收消息:使用ch.consume订阅队列,从返回的channel中读取消息,并设置自动应答以确保消息正确处理;5. 处理连接中断:通过conn.notifyclose监听连接关闭事件,并实现重连机制如循环重试或指数退避算法,确保程序健壮性。以上步骤完整覆盖了go语言操作rabbitmq的核心流程。

快速入门:使用Go语言操作RabbitMQ队列

Go语言操作RabbitMQ队列,核心在于连接、声明、发送和接收。掌握这些,就能快速上手。

快速入门:使用Go语言操作RabbitMQ队列

连接RabbitMQ,声明队列,然后就可以愉快的发送和接收消息了。当然,错误处理是少不了的,别忘了加上。

快速入门:使用Go语言操作RabbitMQ队列

如何在Go中建立RabbitMQ连接?

连接RabbitMQ,首先你需要amqp这个库。go get github.com/rabbitmq/amqp091-go安装一下。然后,用amqp.Dial函数建立连接。连接字符串一般是amqp://user:password@host:port/vhost。别忘了处理连接错误,不然程序可能直接崩了。

立即学习“go语言免费学习笔记(深入)”;

快速入门:使用Go语言操作RabbitMQ队列
package main

import (
    "fmt"
    "log"

    amqp "github.com/rabbitmq/amqp091-go"
)

func main() {
    conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
    if err != nil {
        log.Fatalf("连接RabbitMQ失败: %s", err)
    }
    defer conn.Close()

    fmt.Println("成功连接到RabbitMQ!")
}

这段代码只是建立连接,没什么复杂的。如果连接失败,程序会直接退出。

如何声明一个RabbitMQ队列?

有了连接,下一步就是声明队列。队列是消息的容器,发送消息之前必须先声明队列。使用channel.QueueDeclare函数声明队列,可以设置队列的名称、是否持久化、是否自动删除等等。

github-trending
github-trending

获取今日/本周/本月GitHub 热门仓库,并汇总前 15 名的星数、语言和描述。

下载
package main

import (
    "fmt"
    "log"

    amqp "github.com/rabbitmq/amqp091-go"
)

func main() {
    conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
    if err != nil {
        log.Fatalf("连接RabbitMQ失败: %s", err)
    }
    defer conn.Close()

    ch, err := conn.Channel()
    if err != nil {
        log.Fatalf("打开通道失败: %s", err)
    }
    defer ch.Close()

    q, err := ch.QueueDeclare(
        "my_queue", // 队列名称
        false,      // 是否持久化
        false,      // 是否自动删除
        false,      // 是否排他
        false,      // 是否阻塞
        nil,        // 参数
    )
    if err != nil {
        log.Fatalf("声明队列失败: %s", err)
    }

    fmt.Printf("声明队列成功: %v\n", q)
}

这里声明了一个名为my_queue的队列,非持久化,非自动删除,非排他,非阻塞。你可以根据实际需求修改这些参数。

如何发送消息到RabbitMQ队列?

声明了队列,就可以发送消息了。使用channel.Publish函数发送消息,需要指定交换机、路由键、消息内容等。

package main

import (
    "context"
    "log"
    "time"

    amqp "github.com/rabbitmq/amqp091-go"
)

func main() {
    conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
    if err != nil {
        log.Fatalf("连接RabbitMQ失败: %s", err)
    }
    defer conn.Close()

    ch, err := conn.Channel()
    if err != nil {
        log.Fatalf("打开通道失败: %s", err)
    }
    defer ch.Close()

    q, err := ch.QueueDeclare(
        "my_queue", // 队列名称
        false,      // 是否持久化
        false,      // 是否自动删除
        false,      // 是否排他
        false,      // 是否阻塞
        nil,        // 参数
    )
    if err != nil {
        log.Fatalf("声明队列失败: %s", err)
    }

    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    defer cancel()

    body := "Hello, RabbitMQ!"
    err = ch.PublishWithContext(ctx,
        "",         // 交换机
        q.Name,    // 路由键
        false,      // 是否强制
        false,      // 是否立即
        amqp.Publishing{
            ContentType: "text/plain",
            Body:        []byte(body),
        })
    if err != nil {
        log.Fatalf("发布消息失败: %s", err)
    }

    log.Printf("已发送消息: %s", body)
}

这段代码发送了一条简单的文本消息到my_queue队列。注意,这里使用了context.WithTimeout设置了超时时间,防止程序一直阻塞。

如何从RabbitMQ队列接收消息?

发送了消息,当然要接收。使用channel.Consume函数订阅队列,然后就可以从返回的通道中读取消息了。

package main

import (
    "fmt"
    "log"

    amqp "github.com/rabbitmq/amqp091-go"
)

func main() {
    conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
    if err != nil {
        log.Fatalf("连接RabbitMQ失败: %s", err)
    }
    defer conn.Close()

    ch, err := conn.Channel()
    if err != nil {
        log.Fatalf("打开通道失败: %s", err)
    }
    defer ch.Close()

    q, err := ch.QueueDeclare(
        "my_queue", // 队列名称
        false,      // 是否持久化
        false,      // 是否自动删除
        false,      // 是否排他
        false,      // 是否阻塞
        nil,        // 参数
    )
    if err != nil {
        log.Fatalf("声明队列失败: %s", err)
    }

    msgs, err := ch.Consume(
        q.Name,   // 队列名称
        "",       // 消费者标签
        true,     // 是否自动应答
        false,    // 是否排他
        false,    // 是否本地
        false,    // 是否阻塞
        nil,      // 参数
    )
    if err != nil {
        log.Fatalf("消费消息失败: %s", err)
    }

    forever := make(chan bool)

    go func() {
        for d := range msgs {
            log.Printf("接收到消息: %s", d.Body)
        }
    }()

    log.Printf("等待接收消息...")
    <-forever
}

这段代码订阅了my_queue队列,并打印接收到的消息。注意,这里使用了forever通道,防止程序退出。true表示自动应答,消息一旦被接收,就会自动从队列中删除。

如何处理RabbitMQ连接中断?

RabbitMQ连接可能会因为各种原因中断,比如网络故障、服务器重启等。为了保证程序的健壮性,需要处理连接中断的情况。可以使用amqp.Connection.NotifyClose函数监听连接关闭事件,并在连接关闭时重新建立连接。

package main

import (
    "log"
    "time"

    amqp "github.com/rabbitmq/amqp091-go"
)

func connectToRabbitMQ() (*amqp.Connection, error) {
    conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
    if err != nil {
        return nil, err
    }
    return conn, nil
}

func main() {
    var conn *amqp.Connection
    var err error

    for {
        conn, err = connectToRabbitMQ()
        if err == nil {
            break
        }
        log.Printf("连接RabbitMQ失败: %s, 5秒后重试", err)
        time.Sleep(5 * time.Second)
    }
    defer conn.Close()

    log.Println("成功连接到RabbitMQ!")

    // 监听连接关闭事件
    closeChan := conn.NotifyClose(make(chan *amqp.Error))

    <-closeChan
    log.Println("RabbitMQ连接已关闭,尝试重新连接...")
    // 这里可以添加重新连接的逻辑,比如重新调用 connectToRabbitMQ 函数
}

这段代码会在连接关闭时打印日志,并尝试重新连接。实际应用中,可以添加更复杂的重连逻辑,比如指数退避算法。

热门AI工具

更多
二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

相关专题

更多
rabbitmq和kafka有什么区别
rabbitmq和kafka有什么区别

rabbitmq和kafka的区别:1、语言与平台;2、消息传递模型;3、可靠性;4、性能与吞吐量;5、集群与负载均衡;6、消费模型;7、用途与场景;8、社区与生态系统;9、监控与管理;10、其他特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

604

2024.02.23

Java 消息队列与异步架构实战
Java 消息队列与异步架构实战

本专题系统讲解 Java 在消息队列与异步系统架构中的核心应用,涵盖消息队列基本原理、Kafka 与 RabbitMQ 的使用场景对比、生产者与消费者模型、消息可靠性与顺序性保障、重复消费与幂等处理,以及在高并发系统中的异步解耦设计。通过实战案例,帮助学习者掌握 使用 Java 构建高吞吐、高可靠异步消息系统的完整思路。

968

2026.01.28

RabbitMQ使用教程合集
RabbitMQ使用教程合集

RabbitMQ使用教程合集整理 RabbitMQ 基础教程、消息队列开发案例、生产者消费者、交换机与队列实战内容。

184

2026.05.20

RabbitMQ集群部署指南
RabbitMQ集群部署指南

RabbitMQ集群部署指南聚合 RabbitMQ 集群部署、高可用架构、镜像队列、故障恢复、监控与运维优化内容。

137

2026.05.20

RabbitMQ Docker实战指南
RabbitMQ Docker实战指南

RabbitMQ Docker实战指南提供 RabbitMQ Docker 镜像部署、Docker Compose、Kubernetes Operator 与云原生实践教程。

142

2026.05.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1758

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2744

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6104

2023.10.24

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn