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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis(12)| 过期删除策略和内存淘汰策略

Redis 是可以对 key 设置过期时间的,因此需要有相应的机制将已过期的键值对删除,而做这个工作的就是过期键值删除策略。 如何设置过期时间 先说一下对 key 设置过期时间的命令。 设置 key 过期时间的命令一共有 4 个: expire key n&#x…

HTTP和HTTPS详解

一)什么是HTTP协议 1)HTTP协议是倾向于相遇业务层次上面的一种协议,传输层协议主要考虑的是端对端之间的一个传输过程,TCP重点进行关注的是可靠传输;咱们的HTTP/1,HTTP/2是基于TCP的,但是咱们的HTTP/3是基于UDP的&…

全域旅游“一机游”智慧旅游平台解决方案:PPT全文48页,附下载

关键词:智慧文旅解决方案,智慧旅游解决方案,智慧旅游平台建设方案,智慧文旅综合运营平台,智慧文旅建设方案 一、智慧文旅一机游定义 智慧文旅一机游是一种新型的旅游方式,它通过智能化的设备和系统&#…

web前端开发第一次Dreamweave课堂练习/html练习代码《社会主义核心价值观》

目标图片: 文字素材: 社会主义核心价值观 Socialist Core Values 富强、民主、文明、和谐是国家层面的价值目标。 自由、平等、公正、法治是社会层面的价值取向。 爱国、敬业、诚信、友善是公民个人层面的价值准则。 Core socialist values are the…

网页判断版本更新

一、需求解析 为什么我会想到这个技术呢,是因为我有一次发现,我司的用户在使用网页的时候,经常会出现一个页面放很久,下班也不关这个页面,这样就会导致页面的代码长时间处于不更新的状态。 在使用到一个功能出了bug&a…

文本处理大师:Linux中grep、sed和awk的绝佳教程

1 grep 搜索关键字 全局搜索正则表达式 1.1 基本格式 grep root passwd #过滤含有root关键字-e 多个过滤词 grep -e root -e bash pa grep -E "root|bin" pa # 等同于上面的命令-i 忽略大小写 -E 过滤 grep -E "\<root" passwd ##root字符之前不能有…

Rt-Thread 移植6--多线程(KF32)

6.1 就绪列表 6.1.1 线程就绪优先级组 线程优先级表的索引对应的线程的优先级。 为了快速的找到线程在线程优先级表的插入和移出的位置&#xff0c;RT-Thread专门设计了一个线程就绪优先级组。线程就绪优先组是一个32位的整型数&#xff0c;每一个位对应一个优先级&#xff…

Nussbaumer Transform 以及 Amortized FHEW bootstrapping

参考文献&#xff1a; [Nuss80] Nussbaumer H. Fast polynomial transform methods for multidimensional DFTs[C]//ICASSP’80. IEEE International Conference on Acoustics, Speech, and Signal Processing. IEEE, 1980, 5: 235-237.[SV11] Smart N P, Vercauteren F. Full…

出口美国操作要点汇总│走美国海运拼箱的注意事项│箱讯科技

01服务标准 美国的货物需要细致的服务&#xff0c;货物到港后的服务也是非常重要的。如果在货物到港15天内&#xff0c;如果没有报关行进行(PROCEED)&#xff0c;货物就会进入了G.O.仓库&#xff0c;G.O.仓库的收费标准是非常高的。 02代理资格审核 美国航线除了各家船公司&a…

基于SSM的停车场管理系统设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。你想解决的问题&#xff0c;今天给大家介绍…

低代码平台,业务开发的“银弹”

目录 一、为什么需要低代码平台 二、低代码平台的搭建能力 三、低代码其他能力 四、写在最后 随着互联网和信息技术的快速发展&#xff0c;各行各业都在积极拥抱数字化转型。在这个过程中&#xff0c;软件开发成为企业实现数字化转型的关键环节。然而&#xff0c;传统的软件开发…

YOLOv4: Optimal Speed and Accuracy of Object Detection(2020.4)

文章目录 AbstractIntroductionRelated workObject detection modelsBag of freebiesBag of specials MethodologySelection of architectureSelection of BoF and BoSAdditional improvementsYOLOv4 ExperimentsResults表8列出了使用Maxwell GPU的帧率对比结果表9列出了使用Pa…

Jenkins 质量扫描

代码质量扫描工具&#xff08;SonarQube&#xff09; 质量评审 SonarQube有四个关键组件 ◼ SonarQube Server运行有三个组件 ◆ Web Server&#xff1a;UI ◆ Search Server&#xff1a;为UI提供搜索功能&#xff0c;基于ElasticSearch ◆ Compute Engine Server&#xff1a…

Git GUI、SSH协议和IDEA中的Git使用详解

目录 前言 一、Git GUI的使用 1. 什么是Git GUI 2. 常见的Git GUI工具 3.使用 4.使用Git GUI工具的优缺点 优点&#xff1a; 缺点&#xff1a; 二、SSH协议 1.什么是SSH协议 2.SSH的主要特点和作用 3.SSH密钥认证的原理和流程 4. SSH协议的使用 三、IEDA使用git …

webrtc推拉流 srs报错:DTLS_HANG DTLS: > Hang, done=0, version=-1, arq=0

执行了./objs/srs -c conf/rtc.conf 打开了srs的推拉流网页&#xff1a; 推流 拉流 srs报错如下&#xff1a; [2023-11-08 21:55:23.489][Warn][44992][8xvf4d62][104][DTLS_HANG] DTLS: Hang, done0, version-1, arq0 观看srs日志&#xff0c;在sdp offer&#xff0c;answer…

【postgresql】 代替mysql的if函数

在postgresql 中用 COALESCE 来代替mysql中的 if &#xff1b; COALEASE 函数的语法如下&#xff1a; COALESCE(expression_1, expression_2, expression_3, ...) COALESCE 函数接受多个参数&#xff0c;并且返回第一个非空的参数值&#xff1b; 如果所有参数都为空值&…

[护网杯 2018]easy_tornado 1(两种解法!)

题目环境&#xff1a;发现有三个txt文本文件 /flag.txt/welcome.txt/hints.txt 依此点开 flag在/fllllllllllllag文件中 在hints.txt文件中发现md5计算 md5(cookie_secretmd5(filename)) 并且三个文件中都存在filehash&#xff08;文件名被哈希算法加密32位小写&#xff09; 猜…

java excel、word、PPT转换成pdf预览

先引入包&#xff1a;[lib下载地址](https://mp.csdn.net/mp_download/manage/download/UpDetailed)Controllerpublic AjaxResult fileToPdf(RequestBody VerifyCode url, HttpServletResponse response, HttpServletRequest request) throws IOException {String fileUrl req…

[pipe-自写管道] 强网拟态2023-water-ker

程序分析 保护当然都开了, 题目给了一次增加, 释放, 修改一字节堆块的能力, 这里释放堆块后没有将其指针置空从而导致了 UAF. 漏洞利用 这里的堆块大小为 512 字节并是 SLAB_ACCOUNT, 所以可以直接利用管道去构造自写管道从而构造任意读写系统, 详细见大佬博客:【CTF.0x08】D…

NSF服务器

1.简介 1.1 NFS背景介绍 NFS是一种古老的用于在UNIX/Linux主机之间进行文件共享的协议。它古老到你必须穿着白大补才能接近一台计算机的年代。在那个年代&#xff0c;所有的联网计算机都被认为是可信的&#xff0c;而不像现今这样&#xff0c;任何人都有多种多样方法能连接到你…