Go秒杀系统——RabbitMQ核心概念与工作模式

news2024/11/18 18:16:56

前言💬

Windows 上的 RabbitMQ 被我卸载了,在 macOS 上再安装一下,采用 brew install 还是挺方便的。
很好奇微软的程序员写代码用的是 Windows 操作系统吗?感觉有点不方便,但用 macOS 岂不是太丢撵了。

一、macOS 安装 Go 和 RabbitMQ

brew install go
brew install erlang  // 若未安装,需要安装
brew install rabbitmq

是不是很方便💥!!此外根据 go 的奇怪特性,建议所有的项目都在 GOPATH 下的 src 目录中开发

go env
mkdir -p GOPATH/{src,pkg,bin}

通过 go env 查到 GOPATH,在 GOPATH 下新建三个目录,在 src 目录中存放自己的代码。

二、RabbitMQ 核心概念

2.1 服务器启动与关闭

启动 RabbitMQ,首先要找到 brew 将其安装在哪,然后运行相应的可执行文件。

cd /usr/local/cellar/rabbitmq/3.10.7
./sbin/rabbitmq-server

启动成功后,查看 127.0.0.1:15672,15672是管理界面的默认端口,但5672是数据默认端口,开发时应连接5672端口。

在这里插入图片描述

通过以下命令关闭服务器。

rabbitmqctl stop

2.2 六个核心概念

  • VirtualHost,虚拟主机,可以用作逻辑隔离,如测试环境和开发环境。
  • Connection,建立满足 AMQP 协议的连接。
  • Exchange,交换机,基于规则存储-转发消息,类似于计算机网络中的交换机。
  • Queue,消息队列,两端可以视为广义的生产者和消费者。
  • Channel,信道,它是生产者、消费者与RabbitMQ 通信的渠道。
  • Binding,建立交换机与消息队列的绑定。

三、工作模式

所谓工作模式就是生产者与消费者间以何种规则进行生产、消费,总结如下

工作模式特点
Simple消费者监听MQ,一旦有消息就消费掉,且该消息从队列中删除
Work一个消息只能被一个消费者获取(如抢红包场景)
Publish-Subscribe一个消息可以被多个消费者获取(如群聊天)
Routing
Topic
RPC

3.1 工具函数和工具结构体定义

/* rabbitmq.go 文件 */
package RabbitMQ

import (
	"fmt"
	"log"
	"github.com/streadway/amqp"
)

// url 格式 amqp://账号:密码@rabbitmq服务器地址:端口号/vhost
const MQURL = "amqp://imoocuser:imoocuser@127.0.0.1:5672/imooc"

type RabbitMQ struct {
	conn      *amqp.Connection
	channel   *amqp.Channel
	QueueName string // 队列名称
	Exchange  string // 交换机
	Key       string // key
	Mqurl     string // 连接信息
}

// 创建 RabbitMQ 结构体实例
func NewRabbitMQ(queueName string, exchange string, key string) *RabbitMQ {
	return &RabbitMQ{QueueName: queueName, Exchange: exchange, Key: key, Mqurl: MQURL}
}

// 断开 channel 和 connection,r 是接收者变量
func (r *RabbitMQ) Destory() {
	r.channel.Close()
	r.conn.Close()
}

// 打印错误信息
func (r *RabbitMQ) failOnErr(err error, message string) {
	if err != nil {
		log.Fatalf("%s:%s", message, err)
		panic(fmt.Sprintf("%s:%s", message, err))
	}
}

3.2 实现 Simple 模式的生产者-消费者模型

/* rabbitmq.go 文件 */
/* ============= simple 模式下的生产消费 ============= */

// 创建 simple 模式的 rabbitmq 实例,传入参数仅为 queueName
func NewRabbitMQSimple(queueName string) *RabbitMQ {
	rabbitmq := NewRabbitMQ(queueName, "", "")
	var err error
	// 创建 rabbitmq 连接
	rabbitmq.conn, err = amqp.Dial(rabbitmq.Mqurl)
	rabbitmq.failOnErr(err, "创建连接时发生错误!")
	rabbitmq.channel, err = rabbitmq.conn.Channel()
	rabbitmq.failOnErr(err, "获取 channel 失败!")
	return rabbitmq
}

// simple 模式下的生产者代码
func (r *RabbitMQ) PublishSimple(message string) {
	// 1. 申请队列,若队列不存在,创建;若存在,跳过创建(保证队列存在)
	_, err := r.channel.QueueDeclare(
		r.QueueName,
		false, // 数据是否持久化
		false, // 最后一个生产者断开连接时是否自动删除
		false, // 是否排他性
		false, // 是否阻塞
		nil,
	)
	if err != nil {
		fmt.Println(err)
	}
	// 2. 发送消息到队列中
	r.channel.Publish(
		r.Exchange,
		r.QueueName,
		false, // 若为true,根据exchange类型和routekey规则,若无法找到符合条件的队列,则把发送的消息返回给发送者
		false, // 若为true,当exchange发送消息到队列后发现队列上没有绑定消费者,则把消息返回给发送者
		amqp.Publishing{
			ContentType: "text/plain",
			Body:        []byte(message),
		})
}

// simple 模式下的消费者代码
func (r *RabbitMQ) ConsumeSimple() {
	// 1. 申请队列,若队列不存在,创建;若存在,跳过创建(保证队列存在)
	_, err := r.channel.QueueDeclare(
		r.QueueName,
		false, // 数据是否持久化
		false, // 最后一个生产者断开连接时是否自动删除
		false, // 是否排他性
		false, // 是否阻塞
		nil,
	)
	if err != nil {
		fmt.Println(err)
	}
	// 2.接收(消费)消息
	msgs, err := r.channel.Consume(
		r.QueueName,
		"",    // 不区分多个消费者
		true,  // 是否自动应答
		false, // 是否有排他性
		false, // 若设置为true,表示不能将同一个connection中发送的消息传递给该connection中的消费者
		false, // 队列消费是否阻塞
		nil,
	)
	if err != nil {
		fmt.Println(err)
	}
	forever := make(chan bool)
	// 启动协程处理消息
	go func() {
		for d := range msgs {
			// 实现我们要处理的逻辑函数
			log.Printf("[*] Receive a message: %s", d.Body)
		}
	}()

	log.Printf("[*] Waiting for messages, To exit press CTRL+C")
	<-forever
}

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

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

相关文章

APS排程软件提升电子产品生产企业的服务效益

"3C产品"&#xff0c;就是计算机、通信和消费类电子产品三者结合&#xff0c;也称"信息家电"。由于3C产品的体积一般都不大&#xff0c;所以往往在中间加一个"小"字&#xff0c;故往往统称为"3C小家电"。 据报道&#xff0c;某一科技公…

使用DoraCloud免费版搭建办公桌面云

DoraCloud是一款多平台的桌面虚拟化管理软件&#xff0c;支持Hyper-V、VMware、Proxmox、XenServer等多种虚拟化平台。DoraCloud在虚拟化平台上具有极大的灵活性&#xff0c;允许您的组织自由选择合适的IT基础设施来构建桌面云&#xff1b;也允许您的组织重用现有的IT设施基础&…

B树和B+树的详解讲解

1.B树 前面我们已经学习了二叉查找树、2-3树以及它的实现红黑树。2-3树中&#xff0c;一个结点做多能有两个key&#xff0c;它的实现红黑树中使用对链接染色的方式去表达这两个key。接下来我们学习另外一种树型结构B树&#xff0c;这种数据结构中&#xff0c;一个结点允许多于…

Java LinkedList

链表&#xff08;Linked list&#xff09;是一种常见的基础数据结构&#xff0c;是一种线性表&#xff0c;但是并不会按线性的顺序存储数据&#xff0c;而是在每一个节点里存到下一个节点的地址。 链表可分为单向链表和双向链表。 一个单向链表包含两个值: 当前节点的值和一个…

linux软件安装

软件安装1.安装方式2.安装jdk3.安装Tomcat4.安装mysql5.安装lrzsz1.安装方式 2.安装jdk &#xff08;1&#xff09;使用 Xftp 将jdk的二进制包上传到 Linux。 关于 Xftp 的下载和安装看这里&#xff1a; https://blog.csdn.net/weixin_56680764/article/details/126335138 本文…

C++:using : using的四大用法总结

1&#xff1a;using声明&#xff08;引入单个名称&#xff09; using声明是将命名空间中某个名字单独引入到当前作用域&#xff0c;这使得我们在当前作用域下可以直接使用该名字而无需使用作用域限定符 :: 。 #include <string> using std::string; int main() {string…

TKDE2022 | 基于关系的协同过滤算法,利用注意力机制来学习物品关系的嵌入特征...

嘿&#xff0c;记得给“机器学习与推荐算法”添加星标鉴于经典的协同过滤算法的有效性和易用性&#xff0c;基于物品的协同过滤方法已被广泛应用于工业领域&#xff0c;并在近年来被广泛研究。基于物品的协同过滤方法的关键在于物品之间的相似度测量&#xff0c;但本文认为这是…

推荐系统学习笔记-推荐系统数据流

一般数据流 数据流的定义 数据流&#xff08;data stream&#xff09;是一组有序&#xff0c;有起点和终点的字节的数据序列。包括输入流和输出流。数据流最初是通信领域使用的概念&#xff0c;代表传输中所使用的信息的数字编码信号序列。这个概念最初在1998年由Henzinger提…

《软件开发本质论》笔记——如何衡量价值

目录 一、使用数值来表示价值的做法 二、大多数与金钱有关的衡量指标的局限性 三、有没有一个简单的衡量方式 四、价值评估更好的做法 个人理解的价值 一、使用数值来表示价值的做法 这种方式可能让我们滑入深渊。 比如 如果公司开发产品的目的是赚钱&#xff0c;那么就可…

记一次:Keepalived安装高可用操作

前言&#xff1a;现在有许多现成的高可用产品&#xff0c;比如阿里的产品等等&#xff0c;直接购买就可以使用。这个只是笔者自己私下练习使用&#xff0c;成功了。所以记一次总结过程 安装方式一 下载安装包&#xff1a;https://keepalived.org/download.html网址下载2.2.7版…

【小程序】第一个小程序——创建小程序项目

目录 小程序简介 第一个小程序 安装开发者工具 创建小程序项目 小程序简介 1. 小程序与普通网页开发的区别 2. 体验小程序 可使用手机微信(6.7.2 及以上版本)扫码下方小程序码&#xff0c;体验小程序&#xff1a; 第一个小程序 1. 点击注册按钮 使用浏览器打开 https…

【大数据技术】Spark MLlib机器学习库、数据类型详解(图文解释)

机器学习的定义 机器学习是一种通过利用数据&#xff0c;训练出模型&#xff0c;然后使用模型预测的一种方法。机器学习的构建过程是利用数据通过算法构建出模型并对模型进行评估&#xff0c;评估的性能如果达到要求就拿这个模型来测试其他的数据&#xff0c;如果达不到要求就…

【图神经网络】Pytorch图神经网络库——PyG基础操作

Pytorch图神经网络库——PyG基础操作图数据处理常用的基准数据库Mini-BatchesData Transforms图学习方法参考资料PyG&#xff08;PyTorch Geometric&#xff09;是一个基于PyTorch构建的库&#xff0c;可轻松编写和训练图神经网络&#xff08;GNN&#xff09;&#xff0c;用于与…

【Web安全】访问控制

目录 1、权限与授权 2、垂直权限管理 3、水平权限管理 4、OAuth 1、权限与授权 权限控制&#xff0c;或者说访问控制&#xff0c;指的是当用户需要执行某个操作时&#xff0c;系统对这种操作的权限限制就是权限控制。 在网络中&#xff0c;一般是通过路由设备或者防火墙建立…

[oeasy]python0031_挂起进程_恢复进程_进程切换

查看进程 回忆上次内容 上次修改了 $PATH 路径 把当前用户shiyanlou的宿主文件夹 ~ 添加到 $PATH 中这样 sleep.py 就可以被找到于是就可以被执行了 还可以把配置 $PATH 的脚本 放到 zsh的配置文件(~/.zshrc) 中 配置 ~/.zshrc 就可以 设置 zsh 环境下默认的 $PATH 在当前路径…

攻防世界-easytornado

题目 访问题目路径 分别点击一下看看 然后我去百度了一下md5(cookie_secretmd5(filename))发现这是一个叫模板注入的东西 什么是模板 简单来说&#xff0c;就是网站内容的动态部分&#xff0c;如果有一个网站的内容几乎相同&#xff0c;但只有某些部分发生改变&#xff0c;那么…

javaweb学习之会话技术CookieSession05

目录 1.会话技术 2.快速入门 3.实现原理 4.cookiel的细节 2.cookie能不能存中文 3.cookie共享问题 4.Cooie的特点和作用 5.综合案例 记录上一次访问时间 1.会话技术 1会话&#xff1a;一次会话中包含多次请求和响应。 *一次会话&#xff1a;浏览器第一次给服务器资源发…

新冠确诊阳性后的第二篇博客,一文带你学习文件上传漏洞

新冠确诊阳性后的第二篇博客&#xff0c;一文带你学习文件上传漏洞1.什么是文件上传漏洞2.不要使用黑名单规定上传文件类型3.绕过文件上传检查功能4.Apache文件解析问题5.IIS文件解析问题6.设计安全的文件上传功能1.什么是文件上传漏洞 文件上传漏洞是指用户上传了一个可执行的…

RabbitMQ管理界面

&#x1f341;博客主页&#xff1a;&#x1f449;不会压弯的小飞侠 ✨欢迎关注&#xff1a;&#x1f449;点赞&#x1f44d;收藏⭐留言✒ ✨系列专栏&#xff1a;&#x1f449;Linux专栏 &#x1f525;欢迎大佬指正&#xff0c;一起学习&#xff01;一起加油&#xff01; 目录&…

记录我の秋招之旅【23届 CV算法岗】

文章目录碎碎念春招实习华为实习魔幻秋招尘埃落定碎碎念 今年(2022年)的秋招不能说"非常困难"吧&#xff0c;只能说是"地狱难度"&#xff0c;相信参与或者从侧面了解过的同学们也能感同身受。从今年的三月份开始着手秋招&#xff0c;期间也一直忙着实验室…