Go RabbitMQ简介 使用

RabbitMQ简介
RabbitMQ 是一个广泛使用的开源消息队列系统,它实现了高级消息队列协议(AMQP)标准,为分布式应用程序提供了强大的消息传递功能。RabbitMQ 是 Erlang 语言编写的,具有高度的可扩展性和可靠性,因此被广泛用于构建分布式、异步的消息通信系统。
以下是关于 RabbitMQ 的详细介绍:
1. 消息队列的概念
消息队列是一种通信模式,用于在不同组件、服务或应用程序之间传递消息。它允许发送者将消息放入队列,而接收者可以从队列中获取消息,实现了解耦、异步通信和数据传递的目标。消息队列通常用于处理以下情况:
- 异步通信:发送方和接收方之间不需要立即响应,提高了系统的可伸缩性和性能。
- 任务排队:将需要处理的任务放入队列,由工作进程异步执行。
- 解耦组件:允许不同的应用程序或服务之间进行松耦合的通信。
2. RabbitMQ 的核心概念
RabbitMQ 中的核心概念包括:
- Producer(生产者):负责向消息队列发送消息的应用程序或服务。
- Consumer(消费者):负责从消息队列接收和处理消息的应用程序或服务。
- Queue(队列):用于存储消息的缓冲区,消费者从队列中获取消息进行处理。
- Exchange(交换机):接收生产者发送的消息并将其路由到一个或多个队列。
- Binding(绑定):定义了队列和交换机之间的关系,指定了如何将消息从交换机路由到队列。
- Virtual Host(虚拟主机):RabbitMQ 允许将多个逻辑消息队列隔离到不同的虚拟主机中,以实现资源隔离和多租户支持。
3. 工作流程
RabbitMQ 的工作流程如下:
- 生产者将消息发布到一个或多个交换机。
- 交换机根据绑定规则将消息路由到一个或多个队列。
- 消费者订阅队列并接收消息。
- 消费者处理消息,并可以确认消息已被成功处理。
- 消息可以持久化到磁盘,以确保在 RabbitMQ 重启后不会丢失。
4. 消息确认和持久化
RabbitMQ 具有高度的可靠性,它支持消息确认机制,确保消息在成功处理后才从队列中删除。如果消费者在处理消息时发生错误,消息将被重新排队,而不会丢失。此外,RabbitMQ 还支持将消息持久化到磁盘,以防止消息在系统故障时丢失。
5. 可用性和扩展性
RabbitMQ 具有高可用性和可伸缩性的特性。它支持镜像队列(Queue Mirroring)来确保队列数据的冗余备份,以提高可用性。此外,RabbitMQ 集群可以水平扩展,允许将多个节点添加到集群中以增加处理能力。
6. 协议支持
RabbitMQ 支持多种协议,包括 AMQP(高级消息队列协议)、STOMP、MQTT 等。这使得不同类型的应用程序可以与 RabbitMQ 进行通信,而无需修改现有代码。
7. 应用场景
RabbitMQ 可以应用于许多不同的场景,包括:
- 分布式系统通信:用于不同组件或服务之间的消息传递。
- 异步任务处理:将需要执行的任务放入队列,由工作者进行处理。
- 日志和监控数据的收集:将日志和监控数据发送到 RabbitMQ,以进行集中处理和分析。
- 微服务架构:支持微服务之间的异步通信
在Golang中使用
可以通过 github.com/rabbitmq/amqp091-go 包来在 Go 中与 RabbitMQ 进行交互,以下是一些基本步骤来连接到 RabbitMQ、发送消息和接收消息:
1. 安装 RabbitMQ 客户端库
首先,您需要使用 Go 的包管理工具安装 github.com/rabbitmq/amqp091-go 包,可以使用以下命令:
go get github.com/rabbitmq/amqp091-go
2. 导入库
在您的 Go 代码中导入 github.com/rabbitmq/amqp091-go 包:
import ("github.com/rabbitmq/amqp091-go""log"
)
3. 建立连接
使用 amqp.Dial() 函数建立到 RabbitMQ 服务器的连接。通常,您需要提供 RabbitMQ 服务器的连接 URL,例如:
conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
if err != nil {log.Fatalf("Failed to connect to RabbitMQ: %v", err)
}
defer conn.Close()
请根据您的 RabbitMQ 服务器的实际配置提供正确的连接 URL。
4. 打开通道
在连接上打开一个通道(channel),用于进行消息传递操作。通道是轻量级的通信路径,允许您在单个连接上创建多个通道。
channel, err := conn.Channel()
if err != nil {log.Fatalf("Failed to open a channel: %v", err)
}
defer channel.Close()
5. 定义队列
在发送和接收消息之前,您需要定义一个队列。如果队列不存在,它将被创建。
queueName := "my-queue"
_, err = channel.QueueDeclare(queueName, // 队列名称false, // 是否持久化false, // 是否自动删除false, // 是否排他false, // 是否阻塞nil, // 额外的属性
)
if err != nil {log.Fatalf("Failed to declare a queue: %v", err)
}
6. 发送消息
使用 channel.Publish() 方法发送消息到队列:
messageBody := []byte("Hello, RabbitMQ!")err = channel.Publish("", // 交换机名称(留空表示直接发送到队列)queueName, // 目标队列名称false, // 是否强制false, // 是否立即amqp.Publishing{ContentType: "text/plain",Body: messageBody,},
)
if err != nil {log.Fatalf("Failed to publish a message: %v", err)
}
7. 接收消息
使用 channel.Consume() 方法从队列接收消息:
messages, err := channel.Consume(queueName, // 队列名称"", // 消费者名称(留空表示自动生成)true, // 自动确认消息false, // 是否排他false, // 是否阻塞false, // 是否为消费者创建临时队列nil, // 额外的属性
)
if err != nil {log.Fatalf("Failed to register a consumer: %v", err)
}for msg := range messages {message := string(msg.Body)log.Printf("Received a message: %s", message)
}
相关文章:
Go RabbitMQ简介 使用
RabbitMQ简介 RabbitMQ 是一个广泛使用的开源消息队列系统,它实现了高级消息队列协议(AMQP)标准,为分布式应用程序提供了强大的消息传递功能。RabbitMQ 是 Erlang 语言编写的,具有高度的可扩展性和可靠性,…...
【面经】Spring框架中用了哪些设计模式
在Spring框架中,主要运用了以下几种设计模式: 工厂模式: Spring beanFactory使用工厂模式在应用程序中管理对象的创建。 通过使用工厂模式,Spring可以将对象的创建与使用分离,降低耦合度。 单例模式: Spr…...
SpringBoot自动配置的原理篇,剖析自动配置原理;实现自定义启动类!附有代码及截图详细讲解
SpringBoot 自动配置 Condition Condition 是在Spring 4.0 增加的条件判断功能,通过这个可以功能可以实现选择性的创建 Bean 操作 思考:SpringBoot是如何知道要创建哪个Bean的?比如SpringBoot是如何知道要创建RedisTemplate的?…...
苹果Ios系统app应用程序开发者如何获取IPA文件签名证书时需要注意什么?
今天呢想和大家介绍介绍苹果App开发者如何获取IPA文件签名证书的步骤和注意事项。对于苹果应用程序开发者而言,获取IPA文件签名证书是发布应用程序至App Store的重要步骤之一。签名证书能够确保应用程序的安全性和可信度,并使其能够在设备上正确运行。 …...
算法通关村第七关-黄金挑战二叉树迭代遍历
大家好我是苏麟 , 今天带来二叉树的迭代遍历 . 二叉树的迭代遍历 前序编列 描述 : 给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 题目 : LeetCode 二叉树的前序遍历 : 144. 二叉树的前序遍历 分析 : 前序遍历是中左右,如果还有左子树就一…...
2023-11-Rust
学习方案:Rust程序设计指南 1、变量和可变性 声明变量:let 变量、const 常量 rust 默认变量一旦声明,就不可变(immutable)。当想改变 加 mut(mutable) 。 const 不允许用mut ,只能声明常量,…...
iOS代码混淆----自动
先大致解释一下“编译"、"反编译": 编译:就是把千千万万行字符串(也叫代码,或者源文件),变成010101010101(机器码,也叫目标代码) 编译过程:预处理-编译-汇编-链接 我的脚本运行在预处理阶段。 反编…...
对Mysql和应用微服务做TPS压力测试
1.对Mysql 使用工具:mysqlslap工具 使用命令: mysqlslap -uroot pGG8697000!#--auto generate sql -auto generate sql-load typemixed-concurrency100,200 - number of queries1000-iterations10 - number-int-cols7 - number-charcols13auto genera…...
将程序添加至右键菜单
将程序添加至右键菜单 手动导入 如果要将cmder添加至右键菜单。可以通过编写reg注册表方式添加 也可以在路径HKEY_CLASSES_ROOT\Directory\Background\shell中右击添加 创建项commadn 编写reg注册表 [HKEY_CLASSES_ROOT\Directory\Background\shell\cmder]为注册表地址 Wi…...
三板斧的使用、全局配置文件、静态文件的配置、orm介绍
三板斧的使用 【1】HttpResponse 返回字符串类型 【2】render 返回html页面,并且在返回给浏览器之前还可以给html页面传值 【3】redirect 重定向页面 视图函数必须返回一个 HttpResponse 对象 def index(request):print(request)# return HttpResponse("r…...
【编程实践】黑框框里的打字小游戏,但是汇编语言
开始: 在学习王爽的《汇编语言》的过程中,我就真切地体会到编程实践对于理解的帮助。起初我没有安装书中的实验环境,看到100页左右就开始感觉无趣、吃力,看了后面忘前面,差点就要放弃这本书的学习。好在我后来还是装好…...
ElasticSearch的集群、节点、索引、分片和副本
Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档。为了方便大家理解,我们将Elasticsearch里存储文档数据和关系型数据库MySQL存储数据的概念进行一个类比 ES里的Index可以看做一个库,而Types相当于表,Documents则相当…...
std::cout无法打印uint8_t类型的数据
std::cout在处理uint8_t变量类型的时候默认输出字符,刚好数字0-10对应的ascii字符都是不可打印的 解决: 使用static_cast std::cout << static_cast<int>(time) << std::endl;参考文章:https://blog.csdn.net/weixin_459…...
浅谈泛在电力物联网在智能配电系统应用
贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 摘要:在社会经济和科学技术不断发展中,配电网实现了角色转变,传统的单向供电服务形式已经被双向能流服务形式取代,社会多样化的用电需求也得以有效满足。随着物联网技术的发展&am…...
已解决:云原生领域的超时挂载Bug — Kubernetes深度剖析
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...
概念解析 | 高光谱图像:揭开自然世界的神秘面纱
注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:高光谱图像 高光谱图像:揭开自然世界的神秘面纱 Hyperspectral imaging - Wikipedia 背景介绍 我们生活的世界充满了丰富多彩的颜色。这些颜色来源于各种物体反射或吸收不同波长…...
Java类和对象(1)
🐵本篇文章将会开始对类和对象的第一部分讲解 一、简单描述类和对象 对象可以理解为一个实体,在现实生活中,比如在创建一个建筑之前,要先有一个蓝图,这个蓝图用来描述这个建筑的各种属性;此时蓝图就是类&a…...
百度上海智能研发中心一面
Prometheus告警机制原理 介绍hashmap和concurrentHashmap concurrentHashmap和hashmap如果线程1在遍历 另一个线程对这个map进行修改操作 会发生什么现象 对线程安全的理解 通过什么方法解决线程安全 除了上锁 CAS等还有其他手段 不用锁的话 (集合的类设计成一…...
硝烟后的茶歇 | 中睿天下谈攻防演练之邮件攻击溯源实战分享
近日,由中国信息协会信息安全专业委员会、深圳市CIO协会、PCSA安全能力者联盟主办的《硝烟后的茶歇广东站》主题故事会在深圳成功召开。活动已连续举办四年四期,共性智慧逐步形成《年度红蓝攻防系列全景图》、《三化六防“挂图作战”》等共性研究重要成果…...
Leetcode Hot 100之四:283. 移动零+11. 盛最多水的容器
283.移动零 题目: 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] …...
从AutoCAD到Revit:手把手教你用AutoLISP脚本批量导出天正墙体数据
从AutoCAD到Revit:天正墙体数据自动化迁移实战指南 在建筑信息模型(BIM)工作流中,数据在不同平台间的无缝迁移一直是行业痛点。许多设计师习惯在天正建筑(TArch)中完成初步设计,却需要在Revit等…...
如何用Python工具3步解决百度网盘限速下载难题
如何用Python工具3步解决百度网盘限速下载难题 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 你是否曾经为百度网盘的下载速度而烦恼?面对大文件时,几…...
从零构建多智能体舆情分析系统:架构、部署与二次开发实战
1. 项目概述:从零构建一个多智能体舆情分析系统 如果你正在寻找一个能帮你自动分析社交媒体、新闻网站和用户评论,并生成深度洞察报告的工具,那么“微舆”(BettaFish)这个项目绝对值得你花时间研究。我最初接触这个项…...
EthereumJ同步机制深度解析:快速同步与区块下载的完整流程
EthereumJ同步机制深度解析:快速同步与区块下载的完整流程 【免费下载链接】ethereumj DEPRECATED! Java implementation of the Ethereum yellowpaper. For JSON-RPC and other client features check Ethereum Harmony 项目地址: https://gitcode.com/gh_mirror…...
Real Anime Z开源价值解读:Z-Image底座+Real Anime Z微调的协同优势
Real Anime Z开源价值解读:Z-Image底座Real Anime Z微调的协同优势 1. 项目核心价值 Real Anime Z是一款基于阿里云通义Z-Image底座模型与Real Anime Z专属微调权重开发的高精度二次元图像生成工具。它专为真实系二次元风格优化,通过创新的技术方案解决…...
终极指南:如何使用Diablo Edit2暗黑破坏神2角色编辑器解放你的游戏时间
终极指南:如何使用Diablo Edit2暗黑破坏神2角色编辑器解放你的游戏时间 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 你是否厌倦了在暗黑破坏神2中花费数十小时刷装备、反复练级&…...
文泉驿微米黑:轻量级多语言字体解决方案的技术架构与应用实践
文泉驿微米黑:轻量级多语言字体解决方案的技术架构与应用实践 【免费下载链接】fonts-wqy-microhei Debian package for WenQuanYi Micro Hei (mirror of https://anonscm.debian.org/git/pkg-fonts/fonts-wqy-microhei.git) 项目地址: https://gitcode.com/gh_mi…...
机器学习中独热编码的原理与应用实践
1. 为什么机器学习中需要独热编码?刚接触机器学习时,处理现实数据最让人困惑的问题之一就是:为什么那些教程总要求我们对分类数据做独热编码(One-Hot Encoding)?直接把"狗"和"猫"这样的…...
别再只会wsl -l -v了!这10个WSL2实用命令,帮你搞定开发环境迁移与备份
10个WSL2高阶命令:从环境迁移到多项目管理实战指南 当你的开发环境从一台机器迁移到另一台时,是否经历过重新配置所有工具的噩梦?当多个项目需要不同版本的运行时环境时,是否苦于频繁切换配置?WSL2早已不是简单的Linux…...
TouchPad(单例)
TouchPad 是一个底层触摸输入管理器,直接挂载在场景中的 UI 或游戏物体上,通过实现 Unity 事件系统接口(IPointerDownHandler, IDragHandler, IPointerUpHandler, IBeginDragHandler, IDropHandler, IPointerExitHandler)来接收原…...
