Go RabbitMQ简介 使用

news2024/11/28 0:59:10

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1188183.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

普洱茶上市?澜沧古茶通过港股聆讯

近日,澜沧古茶成功通过港交所聆讯,随后在11月7日披露了相关资料集。该公司即将在港交所主板上市,此次上市由中信建投国际和招商证券国际担任联席保荐人。据了解,澜沧古茶或将成为内地茶企第一股,也将成为“普洱茶第一股…

el-form-item的label的长度单独改掉,用vue3样式穿透的写法,加上css选择器查找特定的id拿到元素

为了让这个会员卡号这几个字和下面的表格对齐,需要改el-form-item的label的长度 如果直接改el-form的label-width,那么所有的el-form-item的label都会改,我不希望这样 我希望只改第1个会员卡号的label长度 给这个el-form-item添加一个id :deep(.el-for…

漏洞复现--泛微E-Office信息泄露(CVE-2023-2766)

免责声明: 文章中涉及的漏洞均已修复,敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

xshell隧道设置

现在有远程外网地址 120.120.120.120和另一台内网地址192.168.1.110两台cvm 但是192.168.1.110 无法直接通过外网地址访问, 需要通过120.120.120.120建立隧道来连接 需要访问192.168.1.110 机器的3306端口, 可以这么做 将192.168.1.110 的3306映射到本地13306端口 1.连接外网…

YOLOv8-Seg改进:多尺度空洞注意力(MSDA),增强局部、稀疏提取特征能力

🚀🚀🚀本文改进: 新的注意力机制——多尺度空洞注意力(MSDA)。MSDA 能够模拟小范围内的局部和稀疏的图像块交互; 如何在OLOv8-seg下使用:1)作为注意力机制放在各个网络位置;2)与C2f结合替代原始的C2f 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLS…

人工智能辅助职业教育发展——开启教育新时代

人工智能辅助职业教育发展——开启教育新时代 随着科技的飞速发展,人工智能(AI)逐渐渗透到各行各业,并在许多领域发挥着重要作用。如今,AI的应用已经延伸到职业教育领域,为培养高素质人才提供了新的可能和动…

用户交互引导大模型生成内容特征,LLM-Rec框架助力个性化推荐!

欢迎来到魔法宝库,传递AIGC的前沿知识,做有格调的分享❗ 喜欢的话记得点个关注吧! 今天主要和大家分享一篇使用大语言模型做数据增强来提升推荐系统性能的研究 标题: LLM-Rec: Personalized Recommendation via Prompting Large …

2023软件测试必问的100个面试题【含答案】

一、测试理论 1.什么是软件测试? 答:软件测试是通过执行预定的步骤和使用指定的数据,以确定软件系统在特定条件下是否满足预期的行为。 2.测试驱动开发(TDD)是什么? 答:测试驱动开发是一种开…

基于情感分析+聚类分析+LDA主题分析对服装产品类的消费者评论分析(文末送书)

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

MKL.NET:为.NET开发者提供高性能数学计算支持的开源库

目录 01 项目简介02 主要功能03 项目结构04 项目地址 MKL是英特尔推出的一套功能强大、性能优化的数学库,主要是采用C/C编写的。今天给大家推荐一个MKL的.Net版本,让我们无需与C/C打交道,方便我们集成到应用开发中去。 01 项目简介 MKL.NET…

智能机器人云控平台

智能机器人云控平台主要是通过打造一个低速固定场景下的机器人自主完成既定作业的模式。整体平台融合的自动化驾驶感知终端,物联网通信,数据接入中心,数据管理中心,模型中心及开放中心等,以一个云平台来掌控多个多种不…

ElementUI的Dialog弹窗实现拖拽移动功能

实现ElementUI的Dialog弹窗可以拖拽移动 实现步骤: 1.创建自定义指令 在utils文件夹下新建文件夹 utils/directive/el-dragDialog/index.js import drag from ./dragconst install function(Vue) {Vue.directive(el-drag-dialog, drag) }if (window.Vue) {windo…

电机应用-步进电机

步进电机(脉冲电机) 基于最基本的电磁铁原理,是一种可以自由回转的电磁铁,其工作原理是依靠气隙磁导的变化来产生电磁转矩。 由于步进电机是一个可以把电磁脉冲转换成机械运动的装置,具有很好的数据控制特性&#xff0…

解决问题:IDEA启动微服务项目,显示Loaded classes are up to date. Nothing to reload.

先说结论,再讲相声: 开启Shorten Command Line 选择JARmanifest 今天启动微服务,就有这么寸,其他的服务启动的好好的,唯独我需要Debug的项目无法启动,只能Run运行 满世界找答案无非就是几种:…

第二证券:今日投资前瞻:PPP迎来新机制,消费电池需求有望迎来复苏

11月8日,两市股指盘中轰动回落,尾盘逐渐止跌。到收盘,沪指跌0.16%报3052.37点,深成指微跌0.04%报10052.09点,创业板指涨0.02%报2023.13点,科创50指数涨0.92%;两市估计成交10366亿元,…

图文详解 VCF 生信格式 (变异信息)

文章目录 一、vcf 格式介绍二、vcf 资源文件三、vcf 文件详解3.1 主要字段3.2 INFO 中的常见信息3.3 FORMAT 和 SAMPLEs 中的信息 四、vcf 的记录模式4.1 只记录变异本身的信息4.2 记录个体或个体组织的变异信息4.3 记录群体或家系的变异信息 五、记录标准5.1 记录多核苷酸多样…

第二证券:长期停牌一般是多久?

股票停牌不仅仅是个股的问题,它或许会影响到商场的整体运作和投资者的利益。那么,长期停牌一般是多久呢?从不同的视点分析,可以得到不同的答案。 1. 官方规则 首要,咱们需求查看相关规则。依据证监会规则&#xff0c…

经典猜数游戏(python类封装)

五次机会猜测100以内随机正整数,我用初通的python类封装了代码并清屏上一次猜测提示,难有所增加咯。 (笔记模板由python脚本于2023年11月09日 12:31:30创建,本篇笔记适合掌握python循环和条件分支语句用法,初通python类的coder翻阅…

开设自己的网站系类01购买服务器

开始建设自己的网站吧! 编者买了一个服务器打算自己构建一个网站,用于记录生活。网站大概算是一个个人博客吧。记录创建过程的一些步骤 要开设自己的网站,需要执行以下关键步骤 以下只是初步列出了建立自己的网站的大概步骤,后…

用Python的requests库来模拟爬取地图商铺信息

由于谷歌地图抓取商铺信息涉及到API使用和反爬虫策略,直接爬取可能会遇到限制。但是,我们可以使用Python的requests库来模拟爬取某个网页,然后通过正则表达式或其他文本处理方法来提取商铺信息。以下是一个简单的示例: # 导入requ…