Go 使用 RabbitMQ---------------之一

RabbitMQ 是一种消息代理。消息代理的主要目的是接收、存储并转发消息。在复杂的系统设计和微服务架构中,RabbitMQ 经常被用作中间件来处理和转发系统之间的消息,以确保数据的一致性和可靠性。正是因为提供了可靠的消息机制、跟踪机制和灵活的消息路由,常常被用于排队算法、秒杀活动、消息分发、异步处理、耗时任务等场景。

一、Go RabbitMQ 客户端&服务端 

1、代码结构

2、生产者发送消息

1). 初始化连接 rabbitmq 服务器

2). 创建 rabbitmq  通道

3). 声明队列,队列名为 go_hello,供我们发送消息

4)、交换机为默认交换机

5). 往队列里发送消息

创建 send.go 文件,通过 amqp091-go 库,将消息写入到 go_hello 这个队列 

package main

import (
	"context"
	amqp "github.com/rabbitmq/amqp091-go"
	"log"
	"time"
)

// 将消息写入到 go_hello 这个队列
func main() {
	// 1. 初始化连接(amqp://账号:密码@地址:端口默认为5672/")
	conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
	failOnError(err, "无法连接到RabbitMQ")
	defer conn.Close()

	// 2. 创建通道
	ch, err := conn.Channel()
	failOnError(err, "无法创建通道")
	defer ch.Close()

	/*
		QueueDeclare声明一个队列,用于保存消息并传递给使用者。
		如果队列不存在,则声明会创建一个队列,或者确保现有队列匹配相同的参数。
		声明的每个队列都获得到空交换机“”的默认绑定,该交换机具有与队列名称匹配的路由,关键字的类型“direct”。
		有了这个默认绑定,可以发布直接路由到的消息,通过使用队列名称的路由关键字发布到“”来创建此队列。
	*/
	// 3. 声明队列
	q, err := ch.QueueDeclare(
		"go_hello", // 队列名称
		false,      // 指定队列是否是持久的。如果设置为 true,则队列在服务器重启后仍然存在,消息也不会丢失。设置为 false 意味着队列是非持久的,服务器重启时队列将被删除,并且队列中的消息也会丢失。
		false,      // 指定当没有消费者连接到队列时,队列是否应该被自动删除。如果设置为 true,当最后一个消费者断开连接时,队列将被删除。
		false,      // 指定队列是否是排他的。如果设置为 true,则队列只能被声明它的连接使用,并且当连接关闭时,队列将被自动删除。
		false,      // 指定是否应该在声明队列时阻塞等待队列被成功创建。如果设置为 true,则函数将立即返回,不会等待队列被创建。
		nil,        // 可选的参数,可以传递给队列以控制其行为。在这个例子中,没有传递任何参数,所以它是 nil。
	)
	failOnError(err, "无法声明队列")

	// 4. 发送消息
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()
	body := "Hello World!"
	err = ch.PublishWithContext(
		ctx,
		"",     // 交换机的名称。在这个例子中,空字符串表示使用默认的交换机。交换机是 AMQP 中的一个组件,它接收消息并根据路由键将消息路由到一个或多个队列。
		q.Name, // 路由键,用于指定消息应该发送到哪个队列。在这个例子中,路由键是之前声明的队列的名称。
		false,  // 指定是否需要服务器确认消息的路由。如果设置为 true,则如果消息不能被路由到任何队列,服务器将返回一个错误。
		false,  // 指定是否需要服务器立即将消息路由给消费者。如果设置为 true,则如果队列上没有消费者,服务器将返回一个错误。
		amqp.Publishing{
			ContentType: "text/plain",
			Body:        []byte(body),
		})
	failOnError(err, "无法发布消息")
	log.Printf("生产者发送了消息:%s\n", body)
}

func failOnError(err error, msg string) {
	if err != nil {
		log.Panicf("%s: %s", msg, err)
	}
}

 

3、消费者接收消息

创建 receive.go 文件,监听来自 RabbitMQ 的消息

package main

import (
	amqp "github.com/rabbitmq/amqp091-go"
	"log"
)

func main() {
	// 1. 初始化连接
	conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
	failOnError(err, "无法连接到RabbitMQ")
	defer conn.Close()

	// 2. 创建通道
	ch, err := conn.Channel()
	failOnError(err, "无法创建通道")
	defer ch.Close()

	// 3. 声明队列
	q, err := ch.QueueDeclare(
		"go_hello", // name
		false,      // durable
		false,      // delete when unused
		false,      // exclusive
		false,      // no-wait
		nil,        // arguments
	)
	failOnError(err, "无法声明队列")

	// 4. 构造消费者实例
	msgs, err := ch.Consume(
		q.Name, // 消费消息的队列的名称
		"",     // 消费者的标识符。在这个例子中,空字符串表示没有特定的消费者标识符
		true,   // 指定是否自动确认消息。如果设置为 true,则消息在被接收后会自动被确认,不需要显式调用确认方法。如果设置为 false,则需要手动确认每条消息。
		false,  // 指定消费者是否是排他的。如果设置为 true,则队列只能被这个消费者使用,并且当消费者断开连接时,队列将被删除。
		false,  // 指定是否将消息路由给与消息发布者在同一台服务器上的消费者。如果设置为 true,则不会将消息路由给本地消费者。
		false,  // 指定是否应该在声明消费者时阻塞等待消费者被成功创建。如果设置为 true,则函数将立即返回,不会等待消费者被创建。
		nil,    // 可选的参数,可以传递给消费者以控制其行为。在这个例子中,没有传递任何参数,所以它是 nil。
	)
	failOnError(err, "注册消费者失败")

	var forever chan struct{}

	go func() {
		for d := range msgs {
			log.Printf("收到消息: %s", d.Body)
			log.Printf("正在等待消息。要退出,请按CTRL+C")
		}
	}()

	log.Printf("正在等待消息。要退出,请按CTRL+C")
	<-forever
}

func failOnError(err error, msg string) {
	if err != nil {
		log.Panicf("%s: %s", msg, err)
	}
}

 

二、工作队列 

工作队列:又名任务队列,其背后的主要思想是避免立即执行资源密集型任务并必须等待其完成。相反,我们将任务安排在以后完成。使用工作队列的好处就是它能够并行的处理队列,如果堆积了很多任务,我们只需要添加更多的工作者(workers)就可以了。 

1、代码结构

 仅供参考:

2、生产者 

package main

import (
	"context"
	amqp "github.com/rabbitmq/amqp091-go"
	"log"
	"os"
	"strings"
	"time"
)

func main() {
	// 1. 初始化连接
	conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
	failOnError(err, "无法连接到RabbitMQ")
	defer conn.Close()

	// 2. 创建通道
	ch, err := conn.Channel()
	failOnError(err, "无法创建通道")
	defer ch.Close()

	// 3. 声明队列
	q, err := ch.QueueDeclare(
		"task_queue", // name
		true,         // durable
		false,        // d

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【做一道算一道】力扣332.重新安排行程

332.重新安排行程 给定一个机票的字符串二维数组 [from, to]&#xff0c;子数组中的两个成员分别表示飞机出发和降落的机场地点&#xff0c;对该行程进行重新规划排序。所有这些机票都属于一个从 JFK&#xff08;肯尼迪国际机场&#xff09;出发的先生&#xff0c;所以该行程必…

区间相交-435. 无重叠区间,56. 合并区间

题目连接及描述 435. 无重叠区间 - 力扣&#xff08;LeetCode&#xff09; 56. 合并区间 - 力扣&#xff08;LeetCode&#xff09; 题目分析 二维数组&#xff0c;数组中每个元素为大小为2的一维数组&#xff0c;求移除区间的最小数量&#xff0c;使剩余区间互不重叠。今天写…

Golang原生http实现中间件

Golang原生http实现中间件 中间件&#xff08;middleware&#xff09;&#xff1a;常被用来做认证校验、审计等 大家常用的Iris、Gin等web框架&#xff0c;都包含了中间件逻辑。但有时我们引入该框架显得较为繁重&#xff0c;本文将介绍通过golang原生http来实现中间件操作。全…

小熊家务帮day5 客户管理模块1 (小程序认证,手机验证码认证等)

客户管理模块 1.认证模块1.1 认证方式介绍1.1.1 小程序认证1.1.2 手机验证码登录1.1.3 账号密码认证 1.2 小程序认证1.2.1 小程序申请1.2.2 创建客户后端工程jzo2o-customer1.2.3 开发部署前端1.2.4 小程序认证流程1.2.4.1 customer小程序认证接口设计Controller层Service层调用…

使用Spring Boot编写的小项目

加法计算器 前端代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> <…

杭州威雅学校:在学业与生活平衡中找到更好的自己

进入威雅杭州校园&#xff0c; 沿湖边小道步行约5分钟&#xff0c; 四栋寄宿学院与教学区隔湖相望&#xff0c; 威雅人更喜欢叫他们&#xff1a; 「Cavell」&「Dove」 「Elgar」&「Hawking」 提起「寄宿制」&#xff0c;人们本能地会把它和「住校」划等号。 这种…

【官方指南】3ds Max中纹理贴图问题及正确解决方案

在使用3ds Max进行设计和制作时&#xff0c;纹理贴图是一个非常重要的环节。然而&#xff0c;许多用户在使用过程中常会遇到各种纹理贴图问题。为此&#xff0c;Autodesk官方提供了一些有效的解决方案&#xff0c;可以解决90%的纹理贴图难题。这里小编都帮大家整理好了&#xf…

【加密与解密(第四版)】第十二章笔记

第十二章 注入技术 12.1 DLL注入方法 在通常情况下&#xff0c;程序加载 DLL的时机主要有以下3个&#xff1a;一是在进程创建阶段加载输入表中的DLL&#xff0c;即俗称的“静态输人”;二是通过调用 LoadLibrary(Ex)主动加载&#xff0c;称为“动态加载”&#xff1b;三是由于系…

网络原理-------TCP协议

文章目录 TCP协议TCP协议段格式TCP原理确认应答机制 (安全机制)超时重传机制 (安全机制)连接管理机制 (安全机制)滑动窗口 (效率机制)流量控制 (安全机制)拥塞控制 (安全机制)延迟应答 (效率机制)捎带应答 (效率机制) 基于TCP的应用层协议 TCP协议 TCP, 即 Transmission Contr…

The Sandbox DAO:投票决定元宇宙的未来!

赋予用户治理权&#xff0c;打造由社群运营的开放式数码国度 随着The Sandbox DAO的启动&#xff0c;我们邀请全球社群——这个新数字国度的公民们——提出建议并参与治理&#xff0c;共同塑造开放元宇宙的未来。 介绍 在The Sandbox&#xff0c;我们正在建立一个开放的元宇宙…

数据恢复与取证软件: WinHex 与 X-Ways Forensics 不同许可证功能区别

天津鸿萌科贸发展有限公司从事数据安全业务20余年&#xff0c;在数据恢复、数据取证、数据备份等领域有丰富的案例经验、专业技术及良好的行业口碑。同时&#xff0c;公司面向取证机构及数据恢复公司&#xff0c;提供数据恢复实验室建设方案&#xff0c;包含数据恢复硬件设备及…

【C++初阶】--- C++入门(中)

目录 一、缺省参数1.1 缺省参数概念1.2 缺省参数分类 二、函数重载2.1 函数重载概念2.2 C支持函数重载的原理 --- 名字修饰 三、引用3.1 引用概念3.2 引用特性3.3 常引用3.4 使用场景3.5 引用和指针的区别 一、缺省参数 1.1 缺省参数概念 缺省参数是声明或定义函数时为函数的…

003 仿muduo实现高性能服务器组件_前置知识

​&#x1f308;个人主页&#xff1a;Fan_558 &#x1f525; 系列专栏&#xff1a;仿muduo &#x1f339;关注我&#x1f4aa;&#x1f3fb;带你学更多知识 文章目录 前言时间轮timewheel设计正则表达式介绍&#xff08;了解知道怎么使用&#xff09;通用型any容器的实现 小结 …

5-26作业

网络聊天室 服务器&#xff1a; 1 #include <myhead.h>2 int main(int argc, const char *argv[])3 {4 if(argc!3)5 {6 printf("请输入IP和端口号\n");7 return -1;8 }9 int sfd socket(AF_INET, SOCK_DGRAM, 0);10 if(…

6千古诗文必背名句大全ACCESS\EXCEL数据库

古诗&#xff0c;是古代诗歌的一种体裁&#xff0c;又称古体诗或古风&#xff0c;指的是产生于唐代以前并和唐代新出现的近体诗&#xff08;又名今体诗&#xff09;相对的一种诗歌体裁。其特点是格律限制不太严格。 从小我们就被教“熟读唐诗三百首,不会吟诗也会吟”&#xff…

男士内裤什么品牌质量好?男内裤品牌排行榜汇总

大家都知道&#xff0c;为了私处健康&#xff0c;每天都必须换内裤。而且&#xff0c;使用频率较高的内裤最好 3&#xff5e;6 个月换一批&#xff0c;一旦变形、材质变干硬或污渍洗不净&#xff0c;就得及时扔&#xff01;但有一说一&#xff0c;现在男性同胞们想挑选到合适自…

MySQL数据表的“增删查改“

我们学习数据库, 最重要的就是要学会对数据表表进行"增删查改"(CRUD).(C -- create, R -- retrieve, U -- update, D -- delete) 目录 一. "增"(create) 1. 普通新增 2. 指定列新增 3. 一次插入多行 4. 用insert插入时间 5. 小结 二. "查"…

css样式,点击 箭头方向上下转换

实现效果&#xff1a; 点击切换箭头方向 实现代码 <divclass"modelPart"click"showClick"><div class"modelPart_left"><img:srcaidefalutIconclass"sNodeIcon"><div>{{ selectModel }}</div><div …

【Java EE】网络原理——HTTP请求

目录 1.认识URL 2.认识“方法&#xff08;method&#xff09;” 2.1GET方法 2.1.1使用Fiddler观察GET请求 2.1.2 GET请求的特点 2.2 POST方法 2.2.1 使用FIddler观察POST方法 2.2.2 POST请求的特点 3.认识请求“报头”&#xff08;header&#xff09; 3.1 Host 3.2 C…

【edge浏览器】控制台报错信息隐藏-恢复

问题描述 解决方法&#xff1a;只需要清空筛选器