RabbitMQ-默认读、写方式介绍
1、RabbitMQ简介
rabbitmq是一个开源的消息中间件,主要有以下用途,分别是:
- 应用解耦:通过使用RabbitMQ,不同的应用程序之间可以通过消息进行通信,从而降低应用程序之间的直接依赖性,提高系统的可维护性、扩展性和容错性。
- 异步提速:通过将耗时的操作转化为异步执行,可以提高系统的响应速度和吞吐量,提升用户体验。
- 削峰填谷:在高峰时段,RabbitMQ可以缓存大量的消息,从而避免系统崩溃,并在低峰时段处理这些消息,提高系统的稳定性。
- 消息分发:RabbitMQ可以将消息分发到多个消费者进行处理,从而提高系统的灵活性和处理能力。
了解rabbitmq的设计架构,对理解mq如何使用有很大的帮助。

一个非常重要的点,mq中的生产者从来不是直接将消息发送到队列中的,而是将消息发送到了mq的交换机中(上图中的exchange为交换机), 甚至生产者都不知道这条消息将被发送到哪个队列中。
交换机是个怎样的设计呢,他的一侧连接生产者,从生产者接收消息,另外一侧连接队列,将消息push进队列中,将消息push进一个队列,还是多个队列,还是抛弃,这些策略是由交换机的类型决定的,对于交换机的使用,后面详细介绍。
2、RabbitMQ安装
rabiitmq的安装,最简单的一种方式为运行mq的docker镜像,一行命令搞定:
# latest RabbitMQ 3.13
docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.13-management
执行命令后,可以看到如下打印,则代表RabbitMQ启动成功:

镜像启动成功后,可以通过ip:15672打开mq控制台:
http://xxx.xx.xxx.xx:15672/#/
mq安装完成后,下面就可以进行实践啦。
3、默认模式读、写mq
rabbitmq官方的库:github.com/rabbitmq/amqp091-go

生产者侧代码:
package mainimport ("context""fmt""time"amqp "github.com/rabbitmq/amqp091-go"
)func Send(msg string) error {// 连接rabbitmqconn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")if err != nil {fmt.Println("connect error:", err)return err}defer conn.Close()// 创建通道ch, err := conn.Channel()if err != nil {fmt.Println("channel error:", err)return err}defer ch.Close()// 创建队列,使用默认的交换机q, err := ch.QueueDeclare("lp_default", // nametrue, // durablefalse, // delete when unusedfalse, // exclusivefalse, // noWaitnil, // arguments)if err != nil {fmt.Println("queue declare error:", err)return err}ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)defer cancel()fmt.Println(q.Name)// body := "Hello World!"err = ch.PublishWithContext(ctx,"", // exchange,默认交换机q.Name, // routing keyfalse, // mandatoryfalse, // immediateamqp.Publishing{ContentType: "text/plain",Body: []byte(msg),})if err != nil {fmt.Println("publish error:", err)return err}return nil
}func main() {Send("Hello world")
}
运行上面代码后,可以在rabbitmq的客户端 看到这个队列:

点击队列,进入队列详情:

第一个框中,显式了队列详情,可以看出,这个队列绑定的是默认的交换机。
第二个框,点击后,可以看到队列中的消息详情。
消费者:
package mainimport ("fmt"amqp "github.com/rabbitmq/amqp091-go"
)func main() {conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")if err != nil {fmt.Println("connect error:", err)return}defer conn.Close()ch, err := conn.Channel()if err != nil {fmt.Println("Channel error:", err)return}defer ch.Close()q, err := ch.QueueDeclare("lp_default", // nametrue, // durablefalse, // delete when unusedfalse, // exclusivefalse, // no-waitnil, // arguments)if err != nil {fmt.Println("Queue Declare error:", err)return}msgs, err := ch.Consume(q.Name, // queue"", // consumertrue, // auto-ackfalse, // exclusivefalse, // no-localfalse, // no-waitnil, // args)if err != nil {fmt.Println("Consume error:", err)return}var forever chan struct{}go func() {for d := range msgs {fmt.Printf("Received a message: %s\n", d.Body)}}()fmt.Printf(" [*] Waiting for messages. To exit press CTRL+C")<-forever
}
代码运行记录:
liupeng@192 default % go run recive.go[*] Waiting for messages. To exit press CTRL+CReceived a message: Hello world
Received a message: Hello world
Received a message: Hello world
Received a message: Hello world
Received a message: Hello world
Received a message: Hello world
Received a message: Hello world
Received a message: Hello world
Received a message: Hello world
Received a message: Hello world
Received a message: Hello world
Received a message: Hello world
在以上消费端代码中,如果代码在处理消息的过程中出现异常导致了程序退出,这样正在处理的这条消息就会丢失,为了避免这种情况的发生,rabbitmq设计了消息应答的机制,我们修改上面程序,将auto-ack参数设置为false,当处理完消息后,使用d.Ack(false)发送消息应答。
msgs, err := ch.Consume(q.Name, // queue"", // consumerfalse, // auto-ack,设置为false,取消自动应答false, // exclusivefalse, // no-localfalse, // no-waitnil, // args)if err != nil {fmt.Println("Consume error:", err)return}var forever chan struct{}go func() {for d := range msgs {fmt.Printf("Received a message: %s\n", d.Body)d.Ack(false) // 手动应答}}()fmt.Printf(" [*] Waiting for messages. To exit press CTRL+C")<-forever
如果忘记了进行消息应答,消息会被重新发入调度队列,这样就会吃掉越来越多的内存。
但是,当rabbitmq的服务down掉后,队列中的消息仍然会丢失,为了保证在这种情况下,消息仍然能够不丢失,我们需要做两件事:队列不丢失+消息不丢失,代码如下:
队列持久化:
q, err := ch.QueueDeclare("hello", // nametrue, // durable,设置队列持久化false, // delete when unusedfalse, // exclusivefalse, // no-waitnil, // arguments
)
failOnError(err, "Failed to declare a queue")
消息持久化:
将DeliveryMode设置为amqp.Persistent
err = ch.PublishWithContext(ctx,"", // exchange,默认交换机q.Name, // routing keyfalse, // mandatoryfalse, // immediateamqp.Publishing{ContentType: "text/plain",Body: []byte(msg),DeliveryMode: amqp.Persistent,})
以上就是默认读写rabbitmq的方法,后面再介绍其他几种使用方式。
相关文章:
RabbitMQ-默认读、写方式介绍
1、RabbitMQ简介 rabbitmq是一个开源的消息中间件,主要有以下用途,分别是: 应用解耦:通过使用RabbitMQ,不同的应用程序之间可以通过消息进行通信,从而降低应用程序之间的直接依赖性,提高系统的…...
阿里云百炼大模型使用
阿里云百炼大模型使用 由于阿里云百炼大模型有个新用户福利,有免费的4000000 tokens,我开通了相应的服务试试水。 使用 这里使用Android开发了一个简单的demo。 安装SDK implementation group: com.alibaba, name: dashscope-sdk-java, version: 2.…...
亲测有效,通过接口实现完美身份证号有效性验证+身份证与姓名匹配查询身份实名认证接口(实时)
最近发现一个限时认证的接口分享给大家,有需要的拿去试下吧. 附上部分密钥f478186edba9854f205a130aa888733d227a8f82f98d84b9【剩余约125450次,无时间限制】 b6131281611f6e1fc86c8662f549bdd683a68517203ba312【剩余约1300次,无时段限制】 …...
试题11 输出什么?
...
对vue3/core源码ref.ts文件API的认识过程
对toRef()API的认识的过程: 最开始认识toRef()是从vue3源码中的ref.ts看见的,右侧GPT已经举了例子 然后根据例子,在控制台输出ref对象是什么样子的: 这就是ref对象了,我们根据对象中有没有__v_isRef来判断是不是一个ref对象,当对象存在且__v_isRef true的时候他就判定为是一个…...
AWS迁移与传输之AWS DMS
AWS Database Migration Service(AWS DMS)是一项托管的服务,用于帮助企业将现有的数据库迁移到AWS云中的各种数据库引擎中,或者在不同数据库引擎之间进行数据迁移和同步。直接在线迁移,将数据复制到云端,不…...
【ML Olympiad】预测地震破坏——根据建筑物位置和施工情况预测地震对建筑物造成的破坏程度
文章目录 Overview 概述Goal 目标Evaluation 评估标准 Dataset Description 数据集说明Dataset Source 数据集来源Dataset Fields 数据集字段 Data Analysis and Visualization 数据分析与可视化Correlation 相关性Hierarchial Clustering 分层聚类Adversarial Validation 对抗…...
kafka监控配置和告警配置
Kafka的监控配置和告警配置是确保Kafka集群稳定运行的关键部分。以下是一些关于Kafka监控配置和告警配置的建议: 一、Kafka监控配置 集群级别参数监控: log.retention.hours:用于控制消息在日志中保留的时间。监控此参数的值,确…...
关于智慧校园安全用电监测系统的设计
人生人身安全是大家关注的话题,2019年12月中国消防统计近五年发生在全国学生宿舍的火灾2314起(中国消防2019.12.应急管理部消防救援局官方微博),违规电器是引发火灾的主因。如果在各寝室安装智能用电监测器实时监督线路参数&#…...
Flutter 中的 FormField 小部件:全面指南
Flutter 中的 FormField 小部件:全面指南 在Flutter的世界里,表单是用户输入数据的基本方式之一。FormField是一个强大的小部件,它将表单字段的创建、验证和管理集成到了一个易于使用的抽象中。本文将为您提供一个全面的指南,帮助…...
数据库DCL语句
数据库DCL语句 介绍: DCL英文全称是Data Control Language(数据控制语言),用来管理数据库用户、控制数据库的访 问权限。 管理用户: 查询用户: select * from mysql.user;创建用户: create user 用户名主机名 identified by 密码;修改用…...
mysql-日志管理-error.log
日志管理 默认的数据库日志 vim /etc/my.cnf //错误日志 log-error/usr/local/mysql/mysql.log查看数据库日志 tail -f /usr/local/mysql/mysql.log1 错误日志 :启动,停止,关闭失败报错。rpm安装日志位置 /var/log/mysqld.log #默认开启 2 …...
弱密码系统登录之后强制修改密码
在你登录的时候,获取到弱密码,然后将他存到vuex里面,在登录进去之后,index页面再去取,思路是这样的 一、vuex里面定义密码字段 我是直接在user.js里面写的 import { login, logout, getInfo } from /api/login impo…...
解释Python中的多线程和多进程编程
在Python中,多线程(Multithreading)和多进程(Multiprocessing)是两种常见的并发编程技术,用于同时执行多个任务。然而,由于Python的全局解释器锁(GIL,Global Interpreter…...
【LeetCode】【1】两数之和(1141字)
文章目录 [toc]题目描述样例输入输出与解释样例1样例2样例3 提示进阶Python实现哈希表 个人主页:丷从心 系列专栏:LeetCode 刷题指南:LeetCode刷题指南 题目描述 给定一个整数数组nums和一个整数目标值target,请在该数组中找出…...
【论文速读】|探索ChatGPT在软件安全应用中的局限性
本次分享论文:Exploring the Limits of ChatGPT in Software Security Applications 基本信息 原文作者:Fangzhou Wu, Qingzhao Zhang, Ati Priya Bajaj, Tiffany Bao, Ning Zhang, Ruoyu "Fish" Wang, Chaowei Xiao 作者单位:威…...
部门来了个测试开发,听说是00后,上来一顿操作给我看蒙了...
公司新来了个同事,听说大学是学的广告专业,因为喜欢IT行业就找了个培训班,后来在一家小公司实习半年,现在跳槽来我们公司。来了之后把现有项目的性能优化了一遍,服务器缩减一半,性能反而提升4倍!…...
小程序-修改用户头像
1、调用拍照 / 选择图片 // 修改头像 const onAvatarChange () > { // 调用拍照 / 选择图片 uni.chooseMedia({ // 文件个数 count: 1, // 文件类型 mediaType: [image], success: (res) > { console.log(res) // 本地临时文件路径 (本地路径) const { tempFilePath } …...
PCIe总线-事物层之TLP请求和完成报文格式介绍(六)
1.概述 TLP报文按照类型,可以大致分为4中类型,分别是IO请求报文、存储器请求报文、配置请求报文、完成报文和消息请求报文。IO请求报文可分为IO读请求(不携带数据)和IO写请求(携带数据)。存储器请求报文可…...
从 0 开始实现一个网页聊天室 (小型项目)
实现功能 用户注册和登录好友列表展示会话列表展示: 显示当前正在进行哪些会话 (单聊 / 群聊) , 选中好友列表中的某个好友, 会生成对应的会话实时通信, A给B发送消息, B的聊天界面 / 会话界面能立刻显示新的消息 TODO: 添加好友功能用户头像显示传输图片 / 表情包历史消息搜…...
3 分钟搞定答辩 PPT!PaperXie AI:本科生的学术汇报「开挂」神器
paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AIPPThttps://www.paperxie.cn/ppt/createhttps://www.paperxie.cn/ppt/create 一、 答辩 PPT 的「血泪史」:你是不是也卡在这一步? 毕业论文写到定稿,以为能松口气&…...
堡垒机实战指南:如何构建企业级运维安全审计体系
1. 堡垒机:企业运维安全的"黑匣子" 想象一下飞机上的黑匣子,它能完整记录飞行过程中的所有操作和数据。在企业IT运维领域,堡垒机就扮演着类似的角色。我第一次接触堡垒机是在2015年,当时所在的公司因为一次误操作导致核…...
嵌入式状态机(FSM)深度思考与架构实践
# 1. 前言在早期的嵌入式开发中,我对状态机的理解仅停留在“使用 switch-case 进行条件跳转”,没有去思考过状态机的本质是什么。今天重新整理了一下工程,从整体来看布局,又有新的不同看法与见解。状态机不仅仅是逻辑切换的工具&a…...
MedGemma医疗助手:5分钟本地部署,打造你的专属AI医生
MedGemma医疗助手:5分钟本地部署,打造你的专属AI医生 引言 深夜,当你感到身体不适,想初步了解症状时,身边有一位随时待命、知识渊博的“医生”可以咨询,而且这位“医生”的回答过程完全透明,每…...
OpenClaw压力测试:Qwen3.5-9B持续工作24小时稳定性报告
OpenClaw压力测试:Qwen3.5-9B持续工作24小时稳定性报告 1. 测试背景与目标 上周在部署OpenClaw对接本地Qwen3.5-9B模型后,我产生了一个疑问:这套组合在长时间运行场景下表现如何?作为个人自动化工具,能否稳定处理周期…...
AcousticSense AI零基础部署教程:5分钟搭建音乐流派识别工作站
AcousticSense AI零基础部署教程:5分钟搭建音乐流派识别工作站 1. 引言:让AI成为你的音乐鉴赏助手 你是否曾经遇到过这样的情况:手机里存了几百首下载的音乐,却因为缺乏分类而杂乱无章?或者作为音乐爱好者࿰…...
【2026年最新版】Java JDK安装、环境配置教程 (图文非常详细)
1. 下载 JDK Java Downloads | Oracle 以JDK21为例: 选择适合 JDK 版本,本文选择JDK 21在Windows x64环境下安装 x64 Installer。 选择建议: 普通用户:选择 x64 Installer,简便、快速。开发者或需要灵活控制安装位…...
CP880显示驱动库:车规级TFT-LCD底层控制与零拷贝实现
1. CP880显示驱动库深度解析:面向CARIAD车载信息娱乐系统的TFT-LCD底层控制方案1.1 库定位与工程背景CP880是专为大众集团CARIAD软件平台定制的嵌入式图形显示驱动库,核心目标是为车载信息娱乐系统(IVI)提供高可靠性、低延迟的TFT…...
OpenClaw技能扩展实战:千问3.5-27B驱动公众号自动发布系统
OpenClaw技能扩展实战:千问3.5-27B驱动公众号自动发布系统 1. 为什么需要自动化公众号发布 作为一个技术博主,我每周都要在公众号发布2-3篇技术文章。最让我头疼的不是写作本身,而是发布前的繁琐流程:手动排版Markdown、上传图片…...
基于前述双系统安装与切换遇到的问题
一、 引导管理类问题 这类问题是双系统环境中最常见且最影响使用的核心故障。 1. GRUB菜单丢失,开机直接进入Windows 问题现象:安装Kali后首次重启或Windows系统更新后,GRUB引导菜单消失,计算机直接启动至Windows。根本原因&am…...
